SISTEMAS OPERATIVOS I

Documentos relacionados
A ferramenta make. A - Introdução. O C é orientado para a produção de aplicações informáticas de grande dimensão

Laboratório 4 Correcção de erros sintácticos e tipos de dados primitivos

Gilberto A. S. Segundo. 24 de agosto de 2011

Laboratório de Programação - Exercício 30

Linguagem C. Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira

Makefiles O que é mak a efi f le make

Programação em Sistemas Computacionais

#include <stdio.h> void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } main () {

Argumentos da linha de comando Exemplos Recursividade de funções Exemplos

Faculdade de Computação

Elementos de Linguagem C

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Material sobre Funções AEDS 1

Curso de Programação C em Ambientes Linux Aula 05

Algoritmos e Estruturas de Dados I. Funções. Pedro Olmo Stancioli Vaz de Melo

Introdução à Engenharia ENG1000

Programação de Sistemas

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

Introdução à Linguagem C. K&R: Capitulo 1. Introdução IAED, 2014/2015 2

Guia Rápido: GCC, Makefile e Valgrind.

Linguagem C Ficheiros Compilação Separada

Linguagem C: diretivas, compilação separada. Prof. Críston Algoritmos e Programação

Sistemas Operacionais I Aula Prática 1 - Introdução ao Linux

Programação. MEAer. Bertinho Andrade da Costa. Instituto Superior Técnico. Introdução ao Pré-Processador. 2011/2012 1º Semestre

Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads

Laboratório de Programação - Exercício 22

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Programação 2012/2013 1º Semestre MEEC Laboratório 2 Semana de 22 de Outubro de 2012

Modularização: Funções em C

Laboratório de Programação - Exercícios 9, 10 e 11

Linux Básico. Prof. Gutemberg Gonçalves dos Santos Júnior. Center of Electrical Engineering and Informatics Federal University of Campina Grande

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Primeira Aula Prática

bibliotecas e makefiles em C/C++

Algoritmos e Estruturas de Dados I. Funções. Pedro Olmo Stancioli Vaz de Melo

Arquitetura e Organização de Computadores. Compiladores e processamento

Disciplina de Algoritmos e Programação

Revisão de Programação em C++ Leandro Tonietto Estruturas de Dados em C++ Segurança da Informação

Universidade Federal de Uberlândia Faculdade de Computação GGI030 Programação Orientada a Objetos 1o. Semestre de 2017 Prof.

Laboratório de Programação - Exercício 29

Controlo de Execução. K&R: Capitulo 3

O pré-processador executa transformações controladas no arquivo fonte antes da compilação. Os comandos (sentenças) sempre são iniciados por #.

Programação Estruturada Aula 2 - Introdução

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

Estrutura de Programas e Tipos de Dados Simples

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Outline. 33. Manipulação de arquivos DIM

ponteiros INF Programação I Prof. Roberto Azevedo

Programação Estruturada I

Linguagem C. Produção de programas em C (Ligação dinâmica) João Pedro Patriarca

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber 3/10/ :43 AM

1 Exercícios com ponteiros

Algoritmos e Estruturas de Dados I

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Programação: Vetores

Alocação Dinâmica de Memória. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Linguagem de Programação C. Prof. Fabrício Olivetti de França

Carlos Eduardo Batista. Centro de Informática - UFPB

Algoritmo para converter uma temperatura em Fahrenheit para Celsius

system("pause"); //Envia comando para o sistema operacional solicitando parada de execução do programa } //limitador do corpo do programa

Figura 1: Operações para gerar um programa executável.

Algoritmos RESUMO - LINGUAGEM C

Trabalho Linguagem e Programação de Compiladores

Ana Paula Tomás. Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto 2010/2011

A separação dos programas em módulos (ficheiros) é uma prática indispensável que facilita a produção, manutenção e a reutilização de software.

SISTEMAS OPERATIVOS I

Alocação Dinâmica de Memória

Indexação e Busca. O objetivo deste trabalho é projetar e implementar um sistema de programas para indexação e busca em arquivos de texto.

Conceitos Básicos sobre Programação Prática

Leitura Segura de Strings

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 3 de setembro de 2010

Curso de C: uma breve introdução

6 Alguns conceitos e comandos em programação

O Processo de Programação

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Introduzir o conceito de préprocessamento e apresentar as duas principais diretivas utilizadas. funções em C.

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Mestrado em Engenharia Física Tecnológica

Linguagem C. Compiladores e Interpretadores

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

system("pause"); //Envia comando para o sistema operacional solicitando parada de execução do programa } //limitador do corpo do programa

INF 1005 Programação I

Licenciatura em Eng.ª Informática Sistemas Operativos - 2º Ano - 1º Semestre. Trabalho Nº 1 - Linux e C

1 Exercícios com ponteiros

Aula 1 Apresentação do Curso

Funções de Entrada e Saída

Algoritmos e Linguagem de Programação em C. Professor: Bernard Cardoso Oliveira

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Linguagem de Programação

Fundamentos de Programação

GABARITO Questão a b c d e

ESTRUTURAS COMPOSTAS VETOR

Introdução a Programação de Jogos

Métodos Computacionais em Física Noções Básicas de Linguag

Transcrição:

Instituto Superior de Engenharia do Porto Departamento de Engenharia Informática SISTEMAS OPERATIVOS I Ficha 6 Abril de 2006 Nuno Malheiro Maria João Viamonte Berta Batista Luis Lino Ferreira Sugestões e participações de erros para: ntm@dei.isep.ipp.pt

1 A compilação simples de um programa em C 1.1 Coloque o código fonte se encontra a seguir, num ficheiro chamado ola.c. Compile-o utilizando o gcc, com o comando que lhe segue. Execute o resultado usando a linha final. printf ("Ola Mundo!\n"); $ gcc -Wall ola.c -o ola $./ola 1.2 Coloque o código fonte se encontra a seguir, num ficheiro chamado mau.c. Encontre os erros do programa seguinte, compilando-o com e sem os avisos. Corrija o programa de acordo com os avisos. Recompile-o e execute-o. printf ("Dois mais dois é %f\n", 4); $ gcc mau.c -o mau $./mau $ gcc -Wall mau.c -o mau 1.3 Compilação do exemplo Olá Mundo usando múltiplos ficheiros fonte Crie um ficheiro chamado ola.h com o código: void ola (const char * nome); Crie um ficheiro chamado ola_fn.c com o código: #include "ola.h" void ola (const char * nome) printf ("Ola, %s!\n", nome); Crie um ficheiro chamado main.c com o código: Página 2 de 8

#include "ola.h" ola ("Mundo"); Compile o código, usando a linha de comando: $ gcc -Wall main.c ola_fn.c -o novo_ola Verifique o funcionamento: $./novo_ola Ola Mundo! 1.4 Compilação independente do exemplo Olá Mundo Crie o ficheiro objecto main.o usando a linha de comando: $ gcc -Wall -c main.c Crie o ficheiro objecto ola_fn.o usando a linha de comando: $ gcc -Wall -c ola_fn.c Crie um novo executável usando a linha de comando: $ gcc main.o ola_fn.o -o ola_ind Execute-o, verificando que o resultado é o mesmo: $./ola_ind 1.5 Alteração de ficheiros e recompilação do exemplo Olá Mundo Edite o ficheiro main.c, modificando a instrução de impressão para: ola ("a Todos"); /* alterado de "Mundo" */ Recompile o ficheiro main.c usando o commando: $ gcc -Wall -c main.c Religue o novo ficheiro objecto usando o comando: $ gcc main.o ola_fn.o -o ola_relig Verifique o resultado do executável usando a linha de comando: $./ola_relig Página 3 de 8

2 Exemplos mais avançados de compilação de um programa em C 2.1 Um makefile simples para o exemplo Olá Mundo Edite novamente o ficheiro main.c, modificando a instrução de impressão para: ola ("Mundo"); Crie um makefile para o exemplo Olá mundo com o conteúdo: CC=gcc CFLAGS=-Wall FICHEIROS = main.o ola_fn.o EXECUTAVEL = main $(EXECUTAVEL): $(FICHEIROS) clean: rm -f $(EXECUTAVEL) $(FICHEIROS) Crie o executável usando o comando make: $ make Verifique que todos os ficheiros foram compilados e note que o comando make usa a opção Wall por omissão. Execute o resultado usando a linha de comando: $./main Edite novamente o ficheiro main.c, modificando a instrução de impressão para: ola ("a Todos"); Crie o executável usando o comando make: $ make Verifique que só foi compilado o main.c, tendo sido efectuada uma religação no final. Execute o resultado usando a linha de comando: $./main 2.2 Exemplo de ligação a biblioteca estática Crie um ficheiro chamado curs.c com o código: #include <curses.h> int main(int argc, char *argv[]) initscr(); clear(); move(5,32); insstr("cadeira de SO1"); move(7,18); insstr("biblioteca de tratamento de terminal - CURSES"); refresh(); getchar(); endwin(); Página 4 de 8

Tente compila-lo através do comando seguinte e identifique o erro: $ gcc -Wall curs.c -o curs Recompile o programa através da linha de comando seguinte e comente as diferenças: $ gcc -Wall curs.c /usr/lib/libcurses.a -o curs Execute o programa anterior usando a linha de comando: $./curs 2.3 Exemplo de Ligação a bibliotecas partilhadas Usando o exemplo de 2.2, crie um novo executável usando o comando: $ gcc -Wall curs.c -lcurses -o curs_partilhado Compare o ficheiro executável curs criado em 2.2 com o ficheiro executável curs_partilhado quer em termos de tamanho quer de execução. 2.4 Exemplo sobre directórios de pesquisa Crie um ficheiro chamado lista.c com o código: #include <glib.h> void myfunc(char *i, char **udata) printf("%s ; %s : %s\n", udata[0], udata[1], i); int main(void) GList *list = NULL; char *args[] = "Parametro 1", "Parametro 2"; list = g_list_append(list, "Elemento 1"); list = g_list_append(list, "Elemento 2"); g_list_foreach(list, (GFunc) myfunc, args); Tente compila-lo usando a linha de comando seguinte e verifique os erros: $ gcc -Wall lista.c -lglib-2.0 Veja quais os directórios necessários aos ficheiros de inclusão através do comando: $ pkg-config --cflags glib-2.0 Compile novamente programa mas com a linha de comando: Página 5 de 8

$ gcc -Wall lista.c $(pkg-config --cflags glib-2.0) -lglib-2.0 Execute o programa anterior usando a linha de comando: Atribua a variável de ambiente C_INCLUDE_PATH o valor: $ C_INCLUDE_PATH=/usr/include/glib-2.0:/usr/lib/glib-2.0/include $ export C_INCLUDE_PATH Volte a tentar compila-lo usando a linha de comando seguinte e discuta o funcionamento: $ gcc -Wall lista.c -lglib-2.0 2.5 Utilização do Pré-processador Crie um ficheiro chamado dteste.c com o conteúdo: #ifdef TESTE printf ("Modo de teste\n"); #endif printf ("Execução...\n"); Compile-o e execute-o usando a linha de comando: $ gcc -Wall -DTESTE dteste.c Volte a compilar e executar usando a linha de comando: $ gcc -Wall dteste.c 2.6 Macros com valores Crie um ficheiro chamado dtestevalor.c com o conteúdo: printf ("Valor de NUM e %d\n", NUM); Compile-o e execute-o usando a linha de comando: $ gcc -Wall -DNUM=100 dtestevalor.c Página 6 de 8

Volte a compilar e executar usando a linha de comando: $ gcc -Wall -DNUM="2+2" dtestevalor.c Compile e execute novamente usando a linha de comando: $ gcc -Wall -DNUM dtestevalor.c Verifique os pré-processamentos anteriores usando: $ gcc -Wall -DNUM=100 -E dtestevalor.c $ gcc -Wall -DNUM="2+2" -E dtestevalor.c $ gcc -Wall -DNUM -E dtestevalor.c 2.7 Macros com valores Acrescente ao início do ficheiro de 2.6 a linha #define NUM 4*3 Verifique o pré-processamento usando: $ gcc -Wall -E dtestevalor.c Compile e execute novamente o programa com a linha de comando: $ gcc -Wall -E dtestevalor.c 2.8 Passos de compilação Usando o programa de 2.6, efectue a geração de todos ficheiros correspondentes a todos os passos de compilação usando: $ gcc -Wall -save-temps dtestevalor.c Descreva todos os ficheiros criados e respectivas extensões. 3 Compilação para Optimização Crie um ficheiro chamado teste_opt.c com o conteúdo: double potencian (double d, unsigned n) double x = 1.0; unsigned j; for (j = 1; j <= n; j++) x *= d; return x; Página 7 de 8

double soma = 0.0; unsigned i; for (i = 1; i <= 100000000; i++) soma += potencian (i, i % 5); printf ("soma = %g\n", soma); Experimente a sua compilação e execução com as várias alternativas de compilação, verificando para cada uma qual o tempo de execução do programa e qual o ganho de optimização: $ gcc -Wall -O0 teste_opt.c -lm $ time./a.out $ gcc -Wall -O1 teste_opt.c -lm $ time./a.out $ gcc -Wall -O2 teste_opt.c -lm $ time./a.out $ gcc -Wall -O3 teste_opt.c -lm $ time./a.out Página 8 de 8