




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Programando C unix linux windows
Tipologia: Notas de estudo
1 / 341
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Copyright© 2005 por Brasport Livros e Multimídia Ltda.
Todos os direitos reservados. Nenhuma parte deste livro poderá ser reproduzida, sob qualquer meio, especialmente em fotocópia (xerox), sem a permissão, por escrito, da Editora.
Editor: Sergio Martins de Oliveira Diretora Editorial: Rosa Maria Oliveira de Queiroz Assistente de Produção: Marina dos Anjos Martins de Oliveira Revisão: Maria Helena dos Anjos Martins de Oliveira Editoração Eletrônica: Abreu's System Ltda. Capa: UseDesign
Dados Internacionais de Catalogação na Publicação (CIP) (Câmara Brasileira do Livro, SP, Brasil) Laureano, Marcos Programando em C para Linux, Unix e Windows / Marcos Laureano. – Rio de Janeiro: Brasport, 2005.
Bibliografia ISBN 85-7452-233-
BRASPORT Livros e Multimídia Ltda. Rua Pardal Mallet, 23 – Tijuca 20270-280 Rio de Janeiro-RJ Tels. Fax: (21) 2568.1415/2568.1507/2569.0212/2565. e-mails: [email protected] e-mails: [email protected] e-mails: [email protected] site: www.brasport.com.br
Agradecimentos
Este trabalho não teria saído se não fosse pelo apoio da minha esposa Marga- rete e do meu querido filho Luiz Otavio. Foram eles que agüentaram o meu mau humor após longas noites de trabalho.
Agradeço à Brasport pela oportunidade de publicar meu livro sobre um tema onde vários autores já trabalharam (é claro que este livro tem um diferencial em relação aos demais!).
Aos meus colegas professores e alunos que ajudaram a melhorar este material nos últimos anos.
Copiar de um autor é plágio; copiar de muitos autores é pesquisa. Wilson Mizner, escritor americano.
Sobre o Autor
Marcos Laureano é tecnólogo em Processamento de Dados pela ESSEI, Pós- graduado em Administração pela FAE Business School e Mestre em Informática Aplicada pela Pontifícia Universidade Católica do Paraná. Doutorando na Uni- versidade de Lisboa, onde irá desenvolver trabalhos na área de segurança em máquinas virtuais e sistemas embarcados. Trabalha com programação em C no ambiente Unix (AIX/HP-UX) desde 1997 e Linux desde 2000, sendo especialista em segurança de sistemas operacionais. É professor de graduação e pós- graduação, tendo lecionado em várias instituições nos últimos anos. É autor de vários guias de utilização/configuração de vários aplicativos para os ambientes Unix e Linux. Possui vários artigos publicados sobre programação e segurança de sistemas.
Atualmente leciona disciplinas relacionadas com segurança, programação e sis- temas operacionais nos cursos de graduação e pós-graduação na FAE Centro Universitário, e atua como consultor na área de projetos de desenvolvimento e segurança de sistemas.
O autor pode ser contactado pelo e-mail [email protected] ou através de sua página www.laureano.eti.br , onde está disponível vasto material sobre programação, segurança de sistemas e sistemas operacionais. O autor mantém um fórum em seu site para discussão sobre segurança de sistemas, sistemas operacionais e programação.
Ainda para a plataforma Windows é utilizado o LCC-Win32, que é um ambien- te integrado e simples para escrever programas em C. O LCC-Win32 pode ser encontrado em http://www.cs.virginia.edu/~lcc-win32/.
Os três compiladores podem ser utilizados livremente em seu computador. Os programas exemplos foram testados nos três compiladores e funcionam de forma idêntica (exceto na declaração da função main e capítulos específicos).
Embora a linguagem C seja portável, algumas funções são específicas para ca- da sistema operacional. Do capítulo 1 até o 17, as informações vistas são váli- das para qualquer sistema operacional. A partir do capítulo 18 até o 22 são vis- tas informações a respeito de particularidades do C para o sistema Unix e Linux. O capítulo 23 trata de programação para rede. Embora as opções de programação para rede sejam vastas, neste capítulo é vista apenas uma pe- quena parte (introdutória). No apêndice A são vistas questões sobre recursivi- dade, pesquisas e ordenação. Os apêndices B e C mostram como obter ajuda no sistema Linux e Unix e como compilar programas em C nestes ambientes. O apêndice D mostra como instalar e compilar um programa utilizando o LCC- Win32. O apêndice E contém uma relação das funções mais utilizadas no am- biente Unix e Linux.
Caso o leitor ache alguma inconsistência (pode ocorrer, apesar de todas as pre- cauções tomadas) peço que me contate através do e-mail [email protected].
Rick Cook
1.1 História
A linguagem de programação C é uma linguagem estruturada e padronizada criada na década de 1970 por Ken Thompson e Dennis Ritchie para ser usada no sistema operacional Unix. Desde então espalhou-se por muitos outros sis- temas operacionais e tornou-se uma das linguagens de programação mais u- sadas. A linguagem C tem como ponto forte a sua eficiência e é a linguagem de programação de preferência para o desenvolvimento de aplicações para sis- temas operacionais, apesar de também ser usada para desenvolver aplicações mais complexas.
O desenvolvimento inicial da linguagem C ocorreu nos laboratórios Bell da AT&T entre 1969 e 1973. Deu-se o nome "C" à linguagem porque muitas das suas características derivaram de uma linguagem de programação anterior chamada "B". Há vários relatos que se referem à origem do nome "B": Ken Thompson dá crédito à linguagem de programação BCPL, mas ele também cri- ou uma outra linguagem de programação chamada Bon, em honra da sua mu- lher Bonnie. Por volta de 1973, a linguagem C tinha-se tornado suficientemen- te poderosa para que grande parte do núcleo de Unix, originalmente escrito na linguagem de programação PDP-11/20 assembly, fosse reescrito em C. Este foi um dos primeiros núcleos de sistema operacional que foi implementado
trabalhar num projeto onde se adicionava programação orientada a objetos à linguagem C. A linguagem que eles produziram, chamada C++, é nos dias de hoje a linguagem de programação de aplicações mais comum no sistema ope- racional Windows da Microsoft, enquanto o C permanece mais popular no mundo Unix. Em 1983, o instituto norte-americano de padrões (ANSI) formou um comité, X3j11, para estabelecer uma especificação do padrão da lingua- gem C. Após um processo longo e árduo, o padrão foi completo em 1989 e ra- tificado como ANSI X3.159-1989 "Programming Language C". Esta versão da linguagem é freqüentemente referida como C ANSI. Em 1990, o padrão C ANSI, após sofrer umas modificações menores, foi adotado pela Organização Inter- nacional de Padrões (ISO) como ISO/IEC 9899:1990. Um dos objetivos do pro- cesso de padronização C ANSI foi o de produzir um sobreconjunto do C K&R, incorporando muitas das características não-oficiais subseqüentemente intro- duzidas. Entretanto, muitos programas já tinham sido escritos e não compila- vam em certas plataformas, ou com um certo compilador, devido ao uso de bi- bliotecas não-padrão (por exemplo, interfaces gráficas) alguns compiladores não aderirem ao padrão C ANSI.
1.4 C
Após o processo ANSI de padronização, as especificações da linguagem C per- maneceram relativamente estáticas por algum tempo, enquanto que a lingua- gem C++ continuou a evoluir. Contudo, o padrão foi submetido a uma revisão nos finais da década de 1990, levando à publicação da norma ISO 9899: em 1999. Este padrão é geralmente referido como "C99". O padrão foi adota- do como um padrão ANSI em março de 2000. As novas características do C incluem:
o Funções em linha ; o Levantamento de restrições sobre a localização da declaração de variá- veis (como em C++) ; o Adição de vários tipos de dados novos, incluindo o long long int (pa- ra minimizar a dor da transição de 32-bits para 64-bits), um tipo de da- dos boolean explícito e um tipo complex que representa números com- plexos; o Disposições de dados de comprimento variável; o Suporte oficial para comentários de uma linha iniciados por //, emprestados da linguagem C++; o Várias funções de biblioteca novas, tais como snprintf; o Vários arquivos-cabeçalho novos, tais como stdint.h.
O interesse em suportar as características novas de C99 parece depender muito das entidades. Apesar do gcc e vários outros compiladores suportarem grande
parte das novas características do C99, os compiladores mantidos pela Micro- soft e pela Borland não, e estas duas companhias não parecem estar muito in- teressadas adicionar tais funcionalidades, ignorando por completo as normas internacionais.
1.5 Comentários
Os comentários de um programa devem ser colocados entre ‘/’ e ‘/’. O com- pilador ANSI C aceita os comentários entre /* e */. Quaisquer textos colocados entre estes dois símbolos serão ignorados pelo compilador.
Um outro ponto importante é que se deve colocar um comentário no início de cada função do programa explicando a função, seu funcionamento, seus pa- râmetros de entrada e quais são os possíveis retornos que esta função pode devolver.
Alguns compiladores mais novos (e seguindo a padronização da linguagem C99) aceitam como comentários o “//”. A diferença básica é que com o // é possível fazer comentários apenas em uma linha.
Exemplos: /* Isto é um comentário / int i; // índice do vetor de saída float soma; / Soma dos valores pagos / char letra; / este é um comentário de 02 linhas */
1.6 Constantes Numéricas
Sempre é preciso colocar constantes em um programa. A linguagem C permite a colocação de constantes, exigindo, porém, uma sintaxe diferenciada para que o compilador identifique o tipo da constante e realize o processamento adequado dela.
Na linguagem C tem-se os seguintes formatos para as constantes numéricas: o Números inteiros – De uma maneira geral basta colocar o número no programa para que o compilador entenda o formato e trabalhe de maneira adequada. o Números reais – A exceção vale quando se quer colocar uma constante float. Neste caso, é preciso indicar o formato através da letra F no fi- nal ou utilizar o formato de ponto flutuante (exemplo: 1.0) para que o compilador entenda. Pode-se também utilizar o formato científico para isto (exemplo: 0.1E+1).
Código Significado \b (^) Retrocesso (back) \f Alimentação de formulário (form feed) \n (^) Nova linha (new line) \t Tabulação horizontal (tab) " (^) Aspas ' (^) Apóstrofo \0 Nulo (0 em decimal) \ (^) Barra invertida \v (^) Tabulação vertical \a Sinal sonoro (beep) \N (^) Constante octal (N é o valor da constante) \xN (^) Constante hexadecimal (N é o valor da constante)
De uma maneira geral, toda vez que o compilador encontrar a barra invertida ele não processará o próximo caractere, a não ser que seja um dos indicados antes.
O compilador também permite a criação de strings de caracteres. Para se colo- car em constantes deste tipo, deve-se colocar a string entre aspas. Podem-se colocar caracteres especiais utilizando o formato visto antes dentro da string, que o compilador irá gerar o código adequado.
Exemplos: Caracteres Caractere - ‘a’, ‘F’, ‘(‘, ‘0’ Código - ‘\10’, ‘\0’, ‘\9’ Especiais - ‘\n’, ‘\t’
Strings “Sistema de Controle\tRelatorio\n”
1.8 Estrutura de um Programa
Um programa básico em C possui os seguintes blocos:
#include <xxxx.h>
Funções de Usuário
Funçãomain
Obrigatório
Opcional
Obrigatório
Um programa C deve possuir uma certa estrutura para ser válido. Basicamente têm-se três blocos distintos nos programas. Inicialmente deve-se ter uma seção onde serão feitos os includes necessários para o programa (será visto com mais de- talhes). Por enquanto deve-se colocar a seguinte linha em todos os programas:
#include <stdio.h>
O segundo bloco é o bloco das funções definidas pelo usuário. Este bloco não é obrigatório e só existirá se o usuário definir uma função.
O último bloco, chamado de bloco principal, é obrigatório em qualquer pro- grama C. Nele está definida a função main, que será a função por onde o pro- grama começará a ser executado.
1.9 Função main
Todo programa em C deve ter uma função chamada main. É por esta função que será iniciada a execução do programa. Deve-se especificar o tipo da saída da função, que pode ser int ou void.
Caso seja colocado int, o valor retornado pela função main estará disponível para teste no sistema operacional.
Caso o retorno da função seja declarado como void, nada será retornado ao sistema operacional. Alguns compiladores podem exigir que o retorno da fun- ção main seja declarado como int.
Veja o exemplo:
#include <stdio.h>
void main () { printf ("Hello World\n"); }
ou
#include <stdio.h>
int main () { printf ("Hello World\n"); }
A linha #include <stdio.h> diz ao compilador que ele deve incluir o arquivo- cabeçalho stdio.h. Neste arquivo existem declarações de funções úteis para entrada e saída de dados ( std = standard , padrão em inglês; io = Input/Output , entrada e saída → stdio = Entrada e saída padronizadas). Sempre que for uti- lizada uma destas funções deve-se incluir este comando. O C possui diversos arquivos-cabeçalho.
A linha int main() indica que está sendo definida uma função de nome main. Todos os programas em C têm que ter uma função main, pois é esta função que será chamada quando o programa for executado. O conteúdo da função é delimitado por chaves { }. O código que estiver dentro das chaves será execu- tado seqüencialmente quando a função for chamada. A palavra int indica que esta função retorna um inteiro. Este retorno será visto posteriormente, quan- do estudarmos um pouco mais detalhadamente as funções do C. A última li- nha do programa, return(0); , indica o número inteiro que está sendo retor- nado pela função, no caso o número 0.
A única coisa que o programa realmente faz é chamar a função printf(), pas- sando a string (uma string é uma seqüência de caracteres, que será visto poste- riormente) "Ola! Eu estou vivo!\n" como argumento. É por causa do uso da função printf() pelo programa que deve-se incluir o arquivo-cabeçalho stdio.h. A função printf() neste caso irá apenas colocar a string na tela do computador. O \n é uma constante chamada de constante barra invertida. No caso, o \n é a constante barra invertida de new line e ele é interpretado como um comando de mudança de linha, isto é, após imprimir Ola! Eu estou vivo! o cursor passará para a próxima linha. É importante observar também que os comandos do C terminam com ; (ponto-e-vírgula).
1.12 Palavras Reservadas do C
Todas as linguagens de programação têm palavras reservadas. As palavras reserva- das não podem ser usadas a não ser nos seus propósitos originais, isto é, não é pos- sível declarar funções ou variáveis com os mesmos nomes. Como o C é case sensitive pode-se declarar uma variável For, apesar de haver uma palavra reservada for, mas isto não é uma coisa recomendável de se fazer, pois pode gerar confusão.
A seguir são apresentadas as palavras reservadas do ANSI C:
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while complex _Bool
Robert Brault, jornalista.
2.1 Tipos Básicos
Para criar variáveis em um programa C deve-se indicar para o compilador qual o tipo desta variável. Uma variável pode ter um tipo básico, intrínseco à lin- guagem C ou tipo estruturado, montado pelo programador. Nesta seção serão vistos os tipos básicos já existentes na linguagem e como usá-los.
A linguagem C define os seguintes tipos básicos de variáveis:
o int – Variável tipo inteira. Deve ser utilizada para se armazenar valor inteiro, com ou sem sinal. o char – Variável do tipo caracteres. Servirá para se armazenar um único caractere. o float – Para valores com casas decimais (reais) deve-se utilizar este ti- po. Ele pode armazenar números reais com até 6 dígitos significativos. o double – É o mesmo que o anterior, só que pode armazenar mais dígi- tos, dando uma precisão maior nos cálculos com casas decimais.
O tipo void deve ser utilizado não para variáveis, mas sim para indicar que uma função não tem nenhum valor retornado ou não possui nenhum parâme- tro de entrada.