Escolar Documentos
Profissional Documentos
Cultura Documentos
HIHMGES 'SQS EW IHMXSVEW RS HIWINEQ QEMW TYFPMGEV IWXI XXYPS REHE QEMW REXYVEP
UYI XIRXEV GSQIVGMEPM^E PS RE JSVQE HI EVUYMZS WIQIPLERXI E YQ IFSSO 1EW
IWXE EXMZMHEHI XEQFQ XSQE XIQTS I I\MKI HIHMGES
4IRWERHS EWWMQ VIWSPZM PMFIVEV IWXI PMZVS TEVE GSRWYPXE TFPMGE WI ZSG- EGLE UYI IWXI
PMZVS XI ENYHSY I UYMWIV GSPEFSVEV GSQMKS TEWWI RYQE PSXVMGE I HITSWMXI S ZEPSV UYI
EGLEV UYI HIZI
8IVQMRSY HI TEKEV E GSRXE HI PY^ XIPIJSRI SY KYE I WSFVSY XVSGS ZSG- TSHI HITSWMXEV
RE QMRLE GSRXE )Y EGVIHMXS UYI RW HSMW TSHIQSW WEMV KERLERHS ZSG- TSVUYI XIZI
EGIWWS E YQ FSQ QEXIVMEP UYI XI ENYHSY I IY GSQS MRGIRXMZS E GSRXMRYEV IWGVIZIRHS
PMZVSW 'EWS HI GIVXS XEPZI^ SW TV\MQSW PMZVSW RIQ WINEQ TYFPMGEHSW TSV YQE IHMXSVE
I IWXINEQ PMFIVEHSW HMVIXEQIRXI TEVE WYE GSRWYPXE
5YEPUYIV ZEPSV HITSWMXEHS WIV HMVIGMSREHS TEVE E GSRXE TSYTERE HS QIY PLS TEVE
UYERHS IPI IWXMZIV RE QEMSVMHEHI XIV VIGYVWSW TEVE GSQIEV YQ RIKGMS TVTVMS
RERGMEV WIYW IWXYHSW IXG
'YVMXMFE HI QEVS HI
Marcos Laureano
Copyright 2005 por Brasport Livros e Multimdia Ltda.
Todos os direitos reservados. Nenhuma parte deste livro poder ser reproduzida, sob
qualquer meio, especialmente em fotocpia (xerox), sem a permisso, por escrito, da
Editora.
Bibliografia
ISBN 85-7452-233-3
05-6860 CDD-005.133
ndices para catlogo sistemtico:
1. C : Linguagem de programao : Computadores :
Processamento de dados 005.133
Este trabalho no teria sado se no fosse pelo apoio da minha esposa Marga-
rete e do meu querido filho Luiz Otavio. Foram eles que agentaram o meu
mau humor aps longas noites de trabalho.
Aos meus colegas professores e alunos que ajudaram a melhorar este material
nos ltimos anos.
1
2 Programando em C para Linux, Unix e Windows
Caso o leitor ache alguma inconsistncia (pode ocorrer, apesar de todas as pre-
caues tomadas) peo que me contate atravs do e-mail marcos@laureano.eti.br.
1 Informaes Bsicas
A programao hoje uma corrida entre os engenheiros de software que lutam para construir
programas maiores e mais prova de idiotas enquanto o universo tenta produzir idiotas maiores e
melhores. At agora, o universo est vencendo.
Rick Cook
1.1 Histria
A linguagem de programao C uma linguagem estruturada e padronizada
criada na dcada de 1970 por Ken Thompson e Dennis Ritchie para ser usada
no sistema operacional Unix. Desde ento espalhou-se por muitos outros sis-
temas operacionais e tornou-se uma das linguagens de programao mais u-
sadas. A linguagem C tem como ponto forte a sua eficincia e a linguagem
de programao de preferncia para o desenvolvimento de aplicaes para sis-
temas operacionais, apesar de tambm ser usada para desenvolver aplicaes
mais complexas.
3
4 Programando em C para Linux, Unix e Windows
1.2 C de K&R
Em 1978, Ritchie e Brian Kernighan publicaram a primeira edio do livro The
C Programming Language. Esse livro, conhecido pelos programadores de C
como "K&R", serviu durante muitos anos como uma especificao informal da
linguagem. A verso da linguagem C que ele descreve usualmente referida
como "C de K&R". K&R introduziram as seguintes caractersticas na linguagem:
o Tipos de dados struct;
o Tipos de dados long int;
o Tipos de dados unsigned int;
o O operador =+ foi alterado para +=, e assim sucessivamente (o analisa-
dor lxico do compilador confundia o operador =+. Por exemplo, i =+
10 e i = +10).
1.4 C99
Aps o processo ANSI de padronizao, as especificaes da linguagem C per-
maneceram relativamente estticas por algum tempo, enquanto que a lingua-
gem C++ continuou a evoluir. Contudo, o padro foi submetido a uma reviso
nos finais da dcada de 1990, levando publicao da norma ISO 9899:1999
em 1999. Este padro geralmente referido como "C99". O padro foi adota-
do como um padro ANSI em maro de 2000. As novas caractersticas do C99
incluem:
o Funes em linha ;
o Levantamento de restries sobre a localizao da declarao de vari-
veis (como em C++) ;
o Adio de vrios tipos de dados novos, incluindo o long long int (pa-
ra minimizar a dor da transio de 32-bits para 64-bits), um tipo de da-
dos boolean explcito e um tipo complex que representa nmeros com-
plexos;
o Disposies de dados de comprimento varivel;
o Suporte oficial para comentrios de uma linha iniciados por //,
emprestados da linguagem C++;
o Vrias funes de biblioteca novas, tais como snprintf;
o Vrios arquivos-cabealho novos, tais como stdint.h .
1.5 Comentrios
Os comentrios de um programa devem ser colocados entre /* e */. O com-
pilador ANSI C aceita os comentrios entre /* e */. Quaisquer textos colocados
entre estes dois smbolos sero ignorados pelo compilador.
Exemplos:
/* Isto um comentrio */
int i; // ndice do vetor de sada
float soma; /* Soma dos valores pagos */
char letra; /* este um comentrio de
02 linhas */
Exemplos:
Constante Tipo
0xEF Constante Hexadecimal (8 bits)
0x12A4 Constante Hexadecimal (16 bits)
03212 Constante Octal (12 bits)
034215432 Constante Octal (24 bits)
10 ou 34 Constante inteira
78U Constante inteira sem sinal
20 Constante long
10F ou 1,76E+2 Constante de ponto flutuante
Como alguns caracteres de controle so muito usados, existe uma maneira es-
pecial de se indicar estes caracteres. A seguir esto alguns formatos interpre-
tados pelo compilador:
8 Programando em C para Linux, Unix e Windows
Cdigo Significado
\b Retrocesso (back)
\f Alimentao de formulrio (form feed)
\n Nova linha (new line)
\t Tabulao horizontal (tab)
\" Aspas
\' Apstrofo
\0 Nulo (0 em decimal)
\\ Barra invertida
\v Tabulao 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
no processar o prximo caractere, a no ser que seja um dos indicados antes.
Exemplos:
Caracteres
Caractere - a, F, (, 0
Cdigo - \10, \0, \9
Especiais - \n, \t
Strings
Sistema de Controle\tRelatorio\n
Obrigatrio
#include <xxxx.h>
Opcional
Funes de Usurio
Obrigatrio
Funo main
Informaes Bsicas 9
Um programa C deve possuir uma certa estrutura para ser vlido. Basicamente
tm-se trs blocos distintos nos programas. Inicialmente deve-se ter uma seo
onde sero feitos os includes necessrios 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 funes definidas pelo usurio. Este bloco no
obrigatrio e s existir se o usurio definir uma funo.
Caso seja colocado int, o valor retornado pela funo main estar disponvel
para teste no sistema operacional.
Caso o retorno da funo 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");
}
10 Programando em C para Linux, Unix e Windows
ou
#include <stdio.h>
int main(void)
{
printf ("Hello World\n");
}
Tambm possvel declarar main como void se ela no devolve um valor. Al-
guns compiladores geram uma mensagem de advertncia (warning) se a fun-
o no declarada como void e tambm no devolve um valor.
Veja o Exemplo:
#include <stdio.h>
int main ()
{
printf ("Ola! Eu estou vivo!\n");
return(0);
}
Programa 1.1
A linha #include <stdio.h> diz ao compilador que ele deve incluir o arquivo-
cabealho stdio.h. Neste arquivo existem declaraes de funes teis para
entrada e sada de dados (std = standard, padro em ingls; io = Input/Output,
entrada e sada stdio = Entrada e sada padronizadas). Sempre que for uti-
lizada uma destas funes deve-se incluir este comando. O C possui diversos
arquivos-cabealho.
A linha int main() indica que est sendo definida uma funo de nome main.
Todos os programas em C tm que ter uma funo main, pois esta funo
que ser chamada quando o programa for executado. O contedo da funo
delimitado por chaves { }. O cdigo que estiver dentro das chaves ser execu-
tado seqencialmente quando a funo for chamada. A palavra int indica que
esta funo retorna um inteiro. Este retorno ser visto posteriormente, quan-
do estudarmos um pouco mais detalhadamente as funes do C. A ltima li-
nha do programa, return(0); , indica o nmero inteiro que est sendo retor-
nado pela funo, no caso o nmero 0.
A nica coisa que o programa realmente faz chamar a funo printf(), pas-
sando a string (uma string uma seqncia de caracteres, que ser visto poste-
riormente) "Ola! Eu estou vivo!\n" como argumento. por causa do uso da
funo printf() pelo programa que deve-se incluir o arquivo-cabealho
stdio.h. A funo 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 mudana de linha, isto , aps imprimir Ola! Eu estou vivo!
o cursor passar para a prxima linha. importante observar tambm que os
comandos do C terminam com ; (ponto-e-vrgula).
O tipo void deve ser utilizado no para variveis, mas sim para indicar que
uma funo no tem nenhum valor retornado ou no possui nenhum parme-
tro de entrada.
12
Tipos de Dados 13
A seguir esto os limites de valores aceitos por cada tipo e o seu tamanho ocu-
pado na memria. Tambm nesta tabela est especificado o formato que deve
ser utilizado para ler/imprimir os tipos de dados com a funo scanf e printf
(vistos com mais detalhes no captulo 3):
Formato para
Nmero
Tipo leitura e Incio Fim
de Bits
impresso
No tem (pode-se
_Bool 8 0 1
utilizar %d)
char 8 %c -128 127
unsigned char 8 %c 0 255
signed char 8 %c -128 127
int 32 %i -2.147.483.648 2.147.483.647
unsigned int 32 %u 0 4.294.967.295
signed int 32 %i -2.147.483.648 2.147.483.647
short int 16 %hi -32.768 32.767
unsigned short int 16 %hu 0 65.535
signed short int 16 %hi -32.768 32.767
long int 32 %li -2.147.483.648 2.147.483.647
signed long int 32 %li -2.147.483.648 2.147.483.647
unsigned long int 32 %lu 0 4.294.967.295
float 32 %f 3,4E-38 3.4E+38
double 64 %lf 1,7E-308 1,7E+308
long double 80 %Lf 3,4E-4932 3,4E+4932
14 Programando em C para Linux, Unix e Windows
Formato para
Nmero
Tipo leitura e Incio Fim
de Bits
impresso
Pode-se modificar o tamanho das variveis do tipo int para que ele ocupe so-
mente dois bytes na memria, reduzindo assim o limite de abrangncia para
32768 a +32767. Para isto, coloca-se o modificador short na definio da vari-
vel, indicando que sero utilizados somente dois bytes de tamanho. Devem-se
tomar alguns cuidados com a portabilidade, pois num sistema a varivel pode
ser considerada signed e em outros unsigned; em alguns sistemas operacio-
nais (variaes de Unix, OS/2 da IBM etc.) as variveis so definidas por padro
com unsigned (sem sinal), em outros como signed (com sinal).
Pode-se definir em uma mesma linha mais de uma varivel, bastando para isto
colocar os nomes das variveis separados por vrgulas. Isto deve ser usado so-
mente quando as variveis so simples e no se precisa explicar o uso das
mesmas. Como sugesto deve-se colocar sempre uma nica varivel por linha
e, aps a definio da mesma, colocar um comentrio com a descrio mais
completa.
Exemplos:
float fValorSalrio;
char cSexo;
int i,k,j;
Exemplos:
float fValorSalrio = 15000; /* Sonhar no paga imposto */
char cSexo = M;
int i,k,j;
Para que isto acontea, deve-se colocar a palavra const antes da definio da
varivel, indicando ao compilador que, quando detectar uma mudana de va-
lor da varivel, seja emitida uma mensagem de erro.
Tipos de Dados 17
Exemplos:
const float fValorSalrio = 5000; /* Se for constante nunca
receberei aumento???*/
const char cSexo = M; /* Com certeza !!! */
Exemplos:
int iASCII = (int) E; /* Cdigo ASCII do E */
/* converter o resultado de uma diviso para inteiro */
short int si;
float f;
int i;
i = (int) (f/si);
Tambm o typedef muito usado para criar tipos na prpria lngua do pro-
gramador, criando-se tipos equivalentes.
18 Programando em C para Linux, Unix e Windows
Exemplos:
typedef unsigned char uchar;
typedef unsigned float ufloat;
typede sigend int sint;
/* Declarando as variveis */
uchar cSexo;
ufloat fSalrio;
sint i;
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int a;
short int b;
long int c;
unsigned int d;
unsigned short int e;
unsigned long int f;
float g;
long float h;
double i;
long double j;
char k;
Observaes:
3 Nas especificaes atuais da linguagem C, o long e o int tm o mesmo
tamanho e o modificador long no altera os tamanhos de float e
double.
3 Uma varivel no precisa ter o seu contedo especificado para se obter
o seu tamanho.
3 O operador sizeof pode ser utilizado direto com o tipo da varivel.
Por exemplo, uma linha de cdigo com printf(Tamanho de int = ,
sizeof(int)); resultaria em Tamanho de int = 4.
3 Entrada e Sada
O primeiro parmetro da funo printf deve ser uma string indicando o texto
a ser mostrado. Nesta string devem ser colocados formatadores de tipo para
cada varivel que ser impressa. No texto tambm podem ser colocados alguns
caracteres especiais, indicados atravs da barra invertida, a serem impressos na
sada.
Exemplos:
o Para se imprimir um texto somente:
printf (Sistema de Controle de Estoque);
20
Entrada e Sada 21
% [tam].[qtd_dig]d
Onde:
o tam Indica o tamanho mnimo que deve ser colocado na sada caso o
nmero possua quantidade menor de dgitos. Se o nmero possuir
quantidade de dgitos maior que o valor, o nmero no ser truncado.
o qtd_dig Quantidade de dgitos que deve ser mostrada. Caso o nme-
ro possua quantidade menor que o indicado, sero colocados zeros
esquerda at se completar o tamanho indicado.
% [tam].[casa_dec]f
Onde:
o tam o mesmo que o descrito antes para os nmeros inteiros. Vale
completar que, neste tamanho, esto consideradas as casas decimais
inclusive.
o casa_dec Nmero de casas decimais que devem ser mostradas. Caso o
nmero possua nmero menor de decimais, o nmero ser completado
com zeros at o tamanho indicado. Se o nmero possuir um nmero de
casas decimais maior que o indicado, a sada ser truncada para o ta-
manho indicado.
%[tam].[tam_max]s
Neste caso, se a string possuir tamanho menor que o indicado a sada ser
completada com brancos esquerda.
Veja o exemplo:
#include <stdio.h>
void main (void)
{
char cLetra_a = a;
short int iCod_ASCII = 65; /* Cdigo ASCII do A */
Para realizar a entrada de valores para as variveis deve ser utilizada a funo
scanf. A sintaxe desta funo muito parecida com o printf. Primeiramente,
so informados quais os formatos que sero fornecidos no terminal, depois os
endereos das variveis que iro receber estes valores.
Quando for necessrio realizar a entrada de um nico caractere, pode ser utili-
zada esta funo. Ela l um caractere do terminal e devolve o cdigo ASCII do
mesmo. Sendo assim, possvel assinalar o valor da funo para uma varivel
do tipo caractere (char). Veja o exemplo:
#include <stdio.h>
void main (void)
{ Ser impresso um caractere.
char cLetra; Neste caso representado pela varivel cLetra.
cLetra = getchar();
printf ("Letra digitada %c\n", cLetra);
}
Programa 3.4
26
Operadores 27
#include <stdio.h>
void main (void)
{
int vlr1 = 10, vlr2 = 5, vlr3 = 8; Retorna 10 para vlr1
int resultado; resultado = 10 + 9
vlr1 = vlr1 + 1
resultado = vlr1++ + 9;
printf ("Resultado 1 %d\n", resultado);
vlr2 = vlr2 1
Retorna 4 para vlr2
resultado = --vlr2 + 10; resultado = 4 + 10
printf ("Resultado 2 %d\n", resultado);
vlr3 = vlr3 + 1
Retorna 9 para vlr3
vlr3 = vlr3 + 1
resultado = ++vlr3 * ++vlr3; Retorna 10 para vlr3
printf ("Resultado 3 %d\n", resultado); resultado = 9 * 10
d += 5; equivale a d = d + 5;
b -= (c*8); equivale a b = b (c*8);
x *= 2; equivale a x = x * 2;
Exemplos:
4 < 5 resulta 1
50 = 43 resulta 0
4 >= 0 resulta 1
4 != 9 resulta 1
#include <stdio.h>
void main (void)
{
int vlr1 = 10; Ocorre a multiplicao (5*8=40)
int resultado; Subtrai 10 (10-40=-30)
resultado = 10 5 * 8;
printf ("Resultado 1 %d\n", resultado);
Retornar 9 para vlr1.
resultado = 7 * --vlr1 4; Realiza a multiplicao (7*9=63).
Subtrai 4 (63-4 = 59).
printf ("Resultado 2 %d\n", resultado);
}
Programa 4.2
}
Programa 4.4
Maior ( ) [ ] ->
! ~ ++ -- -(tipo) * & sizeof
* / %
+ -
<< >>
<<= >>=
== !=
&
^
|
&&
||
?
= += -= *= /=
Menor ,
m = &count;
q = *m;
Observaes:
3 Cuidado para no confundir * como multiplicao na utilizao de
ponteiros e vice-versa;
3 Cuidado para no confundir & como o operador relacional && e vice-
versa. Ser vista com detalhes a utilizao de ponteiros no captulo 11.
5 Comandos de Seleo
5.1 Comando if
Sintaxe:
if (condio)
{
bloco de comandos
}
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int vlr1;
int resultado;
33
34 Programando em C para Linux, Unix e Windows
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int vlr1;
int resultado;
printf ("Entre com um numero : ");
scanf ("%d", &vlr1);
if ((vlr1 % 2) == 0) Se o resto da diviso for zero, o nmero par.
Exemplo: 4 divido por 2 = 2 com resto 0.
printf ("Numero Par\n");
else
printf ("Numero Impar\n"); Se o resto da diviso for 1, o nmero mpar.
} Exemplo: 7 divido por 2 = 3 com resto 1.
Programa 5.2
Comandos de Seleo 35
2 Execuo
Entre com um numero : 24
Numero Par Valor digitado.
5.3 Operador ? :
Sintaxe:
(cond? bloco_verd : bloco_falso)
Veja o exemplo:
#include <stdio.h>
Existe a possibilidade de colocar uma condio para que, se nenhum case foi
selecionado, um bloco seja executado. A palavra default indicar este bloco
padro a ser executado.
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int vlr1;
printf ("Entre com um numero : ");
scanf ("%d", &vlr1);
switch (vlr1) Aqui vai a varivel a ser avaliada.
{
case 1 : {
printf ("Um\n");
break;}
case 2 : { Aqui vai o valor (constante) que ser utilizado
printf ("Dois\n"); na comparao.
break;}
case 3 : {
printf ("Tres\n");
break;}
Comandos de Seleo 37
case 4 : {
printf ("Quatro\n");
break;}
case 5 : {
printf ("Cinco\n");
break;}
case 6 : {
printf ("Seis\n");
break;}
case 7 : {
printf ("Sete\n");
break;}
case 8 : { Se nenhuma opo anterior corresponder
varivel informada.
printf ("Oito\n");
break;}
case 9 : {
printf ("Nove\n");
break;}
default :
printf ("Valor nao associado\n");
break; No precisa deste comando aqui,
afinal no existem mais condies
}
para serem avaliadas dentro da
} estrutura switch.
Programa 5.4
Valor digitado.
Resultado do Programa 5.4
Entre com um numero : 8
Oito
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int vlr1;
printf ("Entre com um numero : ");
scanf ("%d", &vlr1);
switch (vlr1)
{
case 1 : {
printf ("Um\n");
break;}
case 2 : {
printf ("Dois\n");
break;}
38 Programando em C para Linux, Unix e Windows
case 3 : {
printf ("Tres\n");
break;}
case 4 : {
printf ("Quatro\n");
break;}
case 5 : {
printf ("Cinco\n");
break;}
case 6 : {
printf ("Seis\n");
break;}
case 7 : {
printf ("Sete\n"); No colocado o comando break.
} Todos os comandos sero avaliados at o prximo
comando break.
case 8 : {
printf ("Oito\n");
} No colocado o comando break.
case 9 : { Todos os comandos sero avaliados at o prximo
printf ("Nove\n"); comando break.
break;}
default :
printf ("Valor nao associado\n");
break;
}
}
Programa 5.5
Valor digitado.
2 Execuo:
Entre com um numero : 7
Sete
Oito
Nove
Valor digitado.
3 Execuo:
Entre com um numero : 8
Oito
Nove
6 Comandos de Repetio
39
40 Programando em C para Linux, Unix e Windows
#include <stdio.h>
void main (void)
{
int vlr1;
int i;
Atribuio inicial. Executado
somente 1 vez, sempre no incio.
printf ("Contar ate : ");
scanf ("%d", &vlr1);
A condio sempre ser avaliada antes da execuo
das instrues agrupadas embaixo do comando
for.
for (i=1; i <= vlr1; i++)
printf ("%d\n", i);
} O incremento (ou decremento) sempre ocorrer
aps a execuo das instrues agrupadas
Programa 6.1 embaixo do comando for.
Resultado do Programa 6.1 Valor digitado. Repare que no contado nada, pois
a condio analisa a varivel i (assinalada com o valor
1 Execuo 1) perguntando se i menor ou igual varivel
Contar ate : 0 vlr1 (neste caso informado 0). Ou seja: 1 <= 0 que
resulta no valor lgico falso.
2 Execuo
Contar ate : 5 Valor digitado.
1
2
3
4
5
O comando while deve ser usado quando no se pode determinar com certeza
quantas vezes um bloco de comandos ser executado. Inicialmente a condio
testada. Caso seja falso, o programa no executar o bloco de comando indi-
cado e continuar no comando aps o comando while.
to, ser executado at que se alcance uma condio falsa. De uma outra ma-
neira, o bloco de comando ser executado enquanto a condio for verdadei-
ra. Veja o exemplo:
#include <stdio.h>
void main (void)
{
int vlr1;
int i;
#include <stdio.h>
void main (void)
{
int vlr1; Executa o conjunto de instrues...
do
{
printf ("Entre com um numero diferente de zeros: ");
scanf ("%d", &vlr1);
} ...enquanto a condio for verdadeira.
while (vlr1 == 0);
printf ("Valor digitado: %d\n", vlr1);
}
Programa 6.3
#include <stdio.h>
void main (void)
{
int vlr1;
int i;
char resp;
i =1;
while (i <= vlr1)
{
printf ("\n%d", i++); Se for respondido Sim...
printf ("\nTermina (S/N)?");
scanf ("%c", &resp);
if (resp == 's' || resp == 'S')
break;
...interrompe a execuo...
}
printf(\nContagem Encerrada);
...desviando o programa para
} a prxima instruo depois do
Programa 6.4 } (fecha chaves) do while.
#include <stdio.h>
while (1)
{
printf ("Valores:");
scanf ("%d %d", &vlr_a, &vlr_b); Caso seja informado 0 para vlr_b,
if (vlr_a == 0) o programa desviado para o label
goto fim; erro atravs do comando goto..
if (vlr_b == 0)
goto erro;
printf ("Divisao : %d\n", vlr_a / vlr_b);
} Executado somente se for
informado o valor 0 para a
erro: varivel vlr_b.
printf ("Divisao por zero\n");
fim:
printf ("Fim da execucao do programa\n");
} Esta linha executada
sempre, pois todos os
Programa 6.6 comandos aps um
label goto sero
Resultado do Programa 6.6 interpretados. Mesmo
Valores Digitados. que faa parte de
1 Execuo outro label goto.
Valores:23 234
Valores Digitados.
Divisao : 0
Valores:24 2
Divisao : 12 Valores Digitados.
Valores:0 23
Fim da execucao do programa
A funo exit deve ser usada quando se quer terminar a execuo do progra-
ma, retornando para o sistema operacional um indicativo. Tanto em Unix/Linux
como em Windows/DOS existem maneiras de se obter o nmero retornado.
#include <stdio.h>
#include <stdlib.h>
void main (void)
46 Programando em C para Linux, Unix e Windows
{
int vlr_a;
int vlr_b;
while (1)
{
printf ("Valores:");
scanf ("%d %d", &vlr_a, &vlr_b);
if (vlr_a == 0)
exit (0);
if (vlr_b == 0)
exit (11);
printf ("Divisao : %d\n", vlr_a / vlr_b);
}
}
Programa 6.7
No Unix/Linux:
1 Execuo
Valores:24 23
Comando no Unix/Linux que mostra o valor
Divisao : 12
retornado pelo programa.
Valores:0 12
$> echo $?
0 Valor retornado.
$> echo $?
11 Valor retornado.
47
48 Programando em C para Linux, Unix e Windows
Para se definir uma funo deve-se indicar o tipo do retorno da funo, seu
nome e os parmetros da mesma.
Os parmetros devem ser definidos, um por um, indicando o seu tipo e nome
separado por vrgula.
Veja o exemplo:
#include <stdio.h>
int le_numero (void); Declarao das
int soma (int, int); funes (prottipos).
vlr_a = le_numero();
vlr_b = le_numero();
printf ("Soma : %d\n", soma (vlr_a, vlr_b));
}
Veja o exemplo:
#include <stdio.h>
int soma (int, int);
int diferenca (int, int);
void le_valores(void); Declarando as variveis como pblicas, ou seja, elas
estaro disponveis para uso em todo o programa.
int vlr_a;
int vlr_b;
Varivel local e portanto somente
void main (void) disponvel para a funo main.
{
int resultado; Variveis pblicas
declaradas
le_valores(); anteriormente.
printf ("Soma : %d\n", soma (vlr_a, vlr_b));
printf ("Diferenca : %d\n", diferenca (vlr_a, vlr_b));
}
resultado = a b;
return resultado;
}
Programa 7.3
Valores digitados.
Resultado do Programa 7.3
Entre com os valores:10 20
Soma : 30
Diferenca : -10
Para fazer isto basta colocar a palavra extern na frente da definio da vari-
vel juntamente com a definio do seu tipo e nome. Feito isto, est sendo indi-
cado para o compilador o necessrio para que no sejam gerados erros, e
indicado que a varivel j foi definida em outro arquivo fonte.
int vlr_a;
int vlr_b; Declarando as variveis como pblicas, ou seja, elas
estaro disponveis para uso em todo o programa.
void main (void)
{
int resultado;
Quando for necessrio que uma varivel local de uma funo permanea com
o seu valor mantido, mesmo depois que a funo termine, permitindo assim na
prxima chamada utilizar o valor anterior, deve-se indicar atravs da palavra
static na definio da mesma.
Veja o exemplo:
#include <stdio.h>
i = 1;
while (1)
{
printf ("Entre com um valor:"); Quando o valor for zero, o
scanf ("%d", &vlr_a); programa encerrado.
if (vlr_a == 0)
break;
54 Programando em C para Linux, Unix e Windows
int somatorio (int cont, int vlr) Declara a varivel como static, ou seja, diz
{ ao compilador que o contedo da varivel
static int soma; soma deve ser guardado na memria at o
if (cont == 1) final da execuo do programa.
soma = vlr;
else Na primeira execuo, a varivel soma somente
soma += vlr; recebe o valor digitado...
return soma;
} ... nas demais execues, a varivel soma recebe o seu
Programa 7.5 prprio valor somado do contedo da varivel vlr.
void funcao(void);
Definies de Funes 55
Veja o exemplo:
include <stdio.h>
#include <stdlib.h>
A funo no recebe e nem
void saindo1(void) devolve nenhum valor.
{
printf("\nFinalizando 1.");
}
void saindo2(void)
{
printf("\nFinalizando 2.");
}
int main(void)
{
printf("\nRegistrando funes..");
atexit(saindo1); Registro das funes que sero
atexit(saindo2); executadas antes do trmino do
printf("\nNo meio do programa..."); programa.
exit(0);
}
Programa 7.6
Pr-compilador
Arquivos headers
Fonte Expandido
Compilador
Link Editor
Cdigo executvel
56
Pr-Compilao 57
Programa principal:
Repare na forma como os arquivos headers foram
#include <stdio.h> inseridos. O arquivo header padro do sistema tem o
#include "soma.h" seu nome preenchido entre < > e o arquivo header
local tem o seu nome preenchido entre .
int vlr_a;
int vlr_b;
void main (void)
{
58 Programando em C para Linux, Unix e Windows
int resultado;
Programa auxiliar:
#include <stdio.h>
extern int vlr_a;
extern int vlr_b;
possvel definir constantes para o pr-compilador, fazendo com que ele atri-
bua um valor a uma varivel. Um detalhe importante a ressaltar que esta va-
rivel uma varivel do pr-compilador e no do programa.
Cada vez que o pr-compilador encontrar esta varivel, ele substitura pelo
contedo definido anteriormente, no levando em considerao o contexto de
compilao.
Veja o exemplo:
#include <stdio.h>
Como so definies de pr-
#define VALOR_MAGICO 34
processamento....
void main (void)
{
int vlr_a;
while (1)
{
printf ("Entre com o valor:");
scanf ("%d", &vlr_a);
if (vlr_a == VALOR_MAGICO) A definio VALOR_MAGICO...
break;
}
}
while (1)
{
printf ("Entre com o valor:");
scanf ("%d", &vlr_a);
if (vlr_a == 34) ... substitudo pelo valor 34, definido no incio
break; do programa.
}
}
Programa 8.2 (aps o pr-processamento)
Pode-se selecionar somente um trecho com o #if ou selecionar entre dois tre-
chos com o #if...#else. O final do trecho, em qualquer um dos casos,
delimitado pela diretiva #endif.
Por ltimo, deve-se ressaltar que o #if s ser executado se na fase de pr-
compilao for possvel resolver a expresso condicional colocada. Portanto,
no possvel fazer compilao condicional baseada em valores de variveis
da linguagem C, pois o valor da varivel s estar disponvel quando o pro-
grama for executado e no durante a compilao.
Plataforma Linux:
gcc progxx.c Dvar=valor o progxx
Plataforma Windows:
LCC-Win32
Colocar no campo #defines (opo compiler) do projeto da aplicao.
Veja o exemplo:
#include <stdio.h>
#define PULA 1 Qualquer valor pode ser atribudo ao define.
void main (void)
{
int i;
#if PULA == 1
if (i > 10 && i < 20) Todo este trecho estar disponvel
continue; para o compilador.
#endif
printf ("%d\n", i);
}
}
Programa 8.3 (antes do pr-processamento)
ou
#ifndef varivel_pr_definida
bloco de condio verdadeiro
#else
bloco de condio falso
#endif
Plataforma Linux:
gcc progxx.c Dvariavel o progxx
Plataforma Windows:
Colocar no campo #defines (opo compiler) do projeto da aplicao.
Veja o exemplo:
#include <stdio.h>
void main (void) Verifica se existe uma definio. O valor no testado,
{ embora seja possvel informar um valor no momento da
int i; compilao.
#ifdef DOS
clrscr(); /* Para DOS, chamar funcao de limpar tela*/
#else
#ifdef UNIX
/* <Esc> [ 2 J <Esc> [ H */
printf ("^[[2J^[[H"); /*LINUX sequencia de caracteres */
#endif
Pr-Compilao 63
#endif
for (i=1; i < 10; i++)
printf ("%d\n", i);
}
Programa 8.4
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int i; Mesmo que, por engano, sejam especificadas as duas opes de
compilao. O compilador ir destruir a segunda definio...
#ifdef DOS
#undef UNIX
clrscr(); ... e portanto no estar disponvel aqui.
#endif
#ifdef UNIX
printf ("^[[2J^[[H");
#endif
#include <stdio.h>
void main (void)
{
int i;
Sem a diretiva #undef...
#ifdef DOS
clrscr();
#endif ..e se esta definio existir...
#ifdef UNIX
printf ("^[[2J^[[H");
...este comando tambm pode ser
considerado.
Pr-Compilao 65
#endif
clrscr();
printf ("^[[2J^[[H"); Os 2 comandos esto disponveis.
Esta diretiva deve ser usada quando se quer exigir a definio de uma ou outra
varivel ao nvel de compilao ou internamente no programa.
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int i;
66 Programando em C para Linux, Unix e Windows
#ifdef DOS
clrscr(); /* Para sistemas DOS, chamar funcao de limpar tela*/
#else
#ifdef UNIX Esta mensagem ir aparecer somente no
printf ("^[[2J^[[H"); momento de compilar o programa.
#else
#error Especificar -DUNIX ou -DDOS na compilacao
#endif
#endif
Veja o exemplo:
A diretiva __FILE__
#include <stdio.h> sempre vai ter o nome do
void main (void) programa fonte, mesmo
{ que o executvel tenha
int i; outro nome.
#ifdef DEBUG
printf ("Inicio do programa %s\n", __FILE__);
printf ("Versao de %s-%s\n", __DATE__, __TIME__);
#endif Estas diretivas sempre
for (i=1; i < 10; i++) tero a data e a hora da
printf ("%d\n", i); compilao do programa.
#ifdef DEBUG
printf("A contagem parou! Estamos na linha %d\n", __LINE__);
#endif
printf("Fim da execuo\n");
#ifdef DEBUG
printf("A ltima linha do programa : %d\n", __LINE__);
#endif
} A diretiva __LINE__ vai ser sempre
Programa 8.8 substituda pelo compilador por um
nmero que representa a linha dentro
do arquivo fonte.
void main (void)
{
int i;
printf("Fim da execuo\n");
}
Programa 8.8 (aps pr-processamento compilado sem a opo definindo a di-
retiva DEBUG)
printf("Fim da execuo\n");
}
Programa 8.8 (aps pr-processamento compilado com a opo definindo a di-
retiva DEBUG)
Os ndices de um vetor em C iro sempre comear de zero, fato que deve ser
lembrado, pois geralmente este detalhe um grande causador de problemas.
Portanto, para acessar a primeira ocorrncia de um vetor, deve-se indicar o n-
dice zero. Veja o exemplo:
#include <stdio.h>
#define TAMANHO 5
69
70 Programando em C para Linux, Unix e Windows
int vlr_a;
int soma;
int vetor [TAMANHO]; Na linguagem C, um vetor sempre
comea na posio 0.
for (i=0; i < TAMANHO; i++)
{
printf ("Entre com o valor %d:", i + 1);
scanf ("%d", &vlr_a); Esta multiplicao serve
vetor [i] = vlr_a; para converter o valor 5
} (diretiva TAMANHO) que
soma = 0; inteira em real.
for (i=0; i < TAMANHO; i++)
soma += vetor [i];
printf ("Media : %f\n", soma / (TAMANHO * 1.0));
}
Programa 9.1
Para definir matrizes basta adicionar mais uma dimenso na definio da vari-
vel. Por compatibilidade com a matemtica, a primeira dimenso chamada
de linha e a segunda de colunas.
Veja o exemplo:
#include <stdio.h>
#define TAM 2
O conceito de dimenso pode ser estendido para mais de duas dimenses, cri-
ando-se matrizes n-dimensionais. Apesar de terem pouco uso prtico, deve-se
lembrar que sempre cada dimenso definida ter o ndice comeando de zero
e terminando em uma unidade antes do tamanho especificado para aquela
dimenso. Veja o exemplo:
#include <stdio.h>
#define DIM_1 2
#define DIM_2 5
#define DIM_3 3
#define DIM_4 4
Veja o exemplo:
#include <stdio.h>
void main (void)
{
int i,j, k;
int matriz1 [5] = {1, 2, 3, 4, 5};
int matriz2 [3][3] = {{11, 12, 13},
{21, 22, 23},
{31, 32, 33}};
int matriz3 [3][2][2] = {{{111, 112},
{121, 122}},
{{211, 212},
{221, 222}},
{{311, 312},
{321, 322}}};
{
for (j=0; j < 3; j++)
printf ("%d ", matriz2 [i][j]);
printf ("\n");
}
printf ("\n");
Segunda Matriz
11 12 13
21 22 23
31 32 33
Terceira Matriz
111 112
121 122
211 212
221 222
311 312
321 322
imprime_1(matriz1);
imprime_2(matriz2);
}
Programa 9.5
Segunda Matriz
11 12 13
21 22 23
31 32 33
10 Strings
Portanto, como a string deve ser terminada por um caractere NULL, sempre
deve ser considerada uma posio a mais no vetor para estes caracteres., Por
exemplo, se for definido um vetor de nomes com at 30 caracteres deve-se de-
finir um vetor com 31 posies.
Para se imprimir uma string, deve ser utilizado o formato %s, conforme j
visto.
75
76 Programando em C para Linux, Unix e Windows
Veja o exemplo:
A definio idntica a um vetor, neste caso tm-se 39
#include <stdio.h> posies para caracteres. Lembrar que a ltima posio
#include <strings.h> deve ser reservada para o caractere que indica o final da
string (\0).
void main (void)
{
char nome [40] = "Pacifico Pacato Cordeiro Manso";
Para realizar a entrada de strings, pode-se utilizar a funo scanf, usando co-
mo formato o %s. Um detalhe importante sobre esta forma de entrada de s-
tring o fato de somente ser lida a seqncia de caracteres at ser encontrado
um branco, no sendo possvel ler caracteres brancos para uma varivel usan-
do o scanf.
Para realizar a sada de uma string, pode-se utilizar a funo printf com o
formato %s ou a funo especfica puts.
Veja o exemplo:
#include <stdio.h>
#include <strings.h>
Veja o exemplo:
#include <stdio.h>
#include <string.h>
78 Programando em C para Linux, Unix e Windows
Para obter o tamanho de uma string utiliza-se a funo strlen. Esta funo ir
retornar a quantidade de caracteres existentes em uma string, no conside-
rando o caractere NULL na contagem dos caracteres.
Veja o exemplo:
#include <stdio.h>
#include <strings.h>
Veja o exemplo:
#include <stdio.h>
#include <strings.h>
printf ("Entre com o seu nome : \n"); A concatenao ocorre logo aps o
ltimo caractere da primeira string.
gets (nome);
Seria o equivalente em algoritmo a
var_string = var_string + nova_string,
embora na linguagem C no se possa
trabalhar com strings desta forma.
strcat (mensagem, nome);
strcat (mensagem, ". Bem vindo ao curso");
puts (mensagem);
}
Programa 10.5
80 Programando em C para Linux, Unix e Windows
Quando quiser copiar o contedo de uma string para outro, deve-se utilizar a
funo strcpy. O contedo da segunda varivel ou constante informada ser
copiado para a rea indicada no primeiro parmetro.
Veja o exemplo:
#include <stdio.h>
#include <strings.h>
Para comparar o contedo de duas strings deve-se usar a funo strcmp. Esta
funo ir fazer a comparao, caractere a caractere, dos dois parmetros in-
Strings 81
Veja o exemplo:
#include <stdio.h>
#include <strings.h>
while (1)
{
printf ("Entre com nomes (fim p/ terminar): \n");
gets (nome); Importante lembrar que a
comparao feita at
if (strcmp (nome, "fim") == 0) encontrar o caractere \0.
break;
tamanho = strlen (nome);
printf ("Nome com %d caracteres\n", tamanho);
}
}
Programa 10.7
Veja o exemplo:
#include <stdio.h>
#include <strings.h>
printf ("Entre com o seu nome : "); A vantagem da funo sprintf poder
gets (nome); formatar qualquer dado dentro de
uma string.
sprintf (mensagem, "Sr. %s seja bem vindo ao curso\n\n", nome);
puts (mensagem);
}
Programa 10.8
String digitada.
Resultado do Programa 10.8
Entre com o seu nome : Marcos Laureano
Sr. Marcos Laureano seja bem vindo ao curso
Veja o exemplo:
Veja o exemplo:
#include <stdio.h>
#include <string.h>
void main(void)
{
char s1[80],s2[80];
unsigned int tam;
printf("\nEntre com uma frase:");
gets(s1);
printf("\nEntre com outra frase:");
gets(s2);
Clculo simples para garantir que a
tam = 79 strlen(s2); string no tenha o seu tamanho
ultrapassado.
strncat(s2,s1, tam);
A nica diferente em relao funo strcat,
o ltimo parmetro, que informa a quantidade
de caracteres que devem ser concactenadas.
84 Programando em C para Linux, Unix e Windows
printf("\n%s",s2);
}
Programa 10.10
String digitada.
Resultado do Programa 10.10
Entre com uma frase:Ento cuidado !
Veja o exemplo:
#include <stdio.h>
#include <string.h>
void main(void)
{
char str1[]="123456789\0"; Copia os 3 primeiros caracteres da
string str1.
char str2[4];
Veja o exemplo:
#include <stdio.h>
#include <string.h>
void main(void)
{
char senha[]="xP1247";
char s1[80];
int tam;
printf("\nEntre com a senha para ver a mensagem:");
gets(s1);
Compara s at o
tam = strlen(senha); tamanho da senha.
Por ser um endereo, deve-se especificar que tipo de varivel ser encontrado
na posio apontada pelo ponteiro. Assim informado que foi criado um pon-
teiro para um inteiro, um ponteiro para uma estrutura ou um ponteiro para
um arquivo. Quando isto definido, quer dizer que no endereo indicado pelo
ponteiro ser encontrado um valor inteiro e o compilador deve gerar cdigo
para tratar este endereo como tal.
86
Ponteiros 87
Para definir uma varivel do tipo ponteiro, deve-se colocar um asterisco (*)
na frente de uma definio normal daquele tipo. O asterisco deve ser colocado
entre o tipo e o nome da varivel. Pode-se ter um ponteiro para qualquer tipo
de varivel possvel em C, como inteiro, ponto flutuante, estruturas, arquivos
etc.
a = &variavel;
printf ("Endereco %d\n", a);
printf ("Valor %d\n", *a);
88 Programando em C para Linux, Unix e Windows
#include <stdio.h>
void main (void)
{
int *pt_int;
int ivalor;
char *pt_char;
char cvalor;
pt_int = &ivalor;
pt_char = &cvalor;
}
Programa 11.3
Ponteiro para inteiro, adicionando uma
Resultado do programa 11.3 unidade, tem-se o acrscimo de 4 bytes
Endereco de pt_int = 804399220
Endereco de pt_char = 804399228
Ponteiro para caractere, adicionando
Endereco de pt_int = 804399224 uma unidade, tem-se o acrscimo de
1 byte.
Endereco de pt_char = 804399229
Veja o exemplo:
Veja o exemplo:
#include <stdio.h>
void main (void)
{
Ponteiros 91
O outro parmetro que deve ser colocado um vetor de ponteiros. Cada ocor-
rncia deste vetor ser um ponteiro para uma string contendo o argumento
passado para o programa. Contm o nmero de argumentos passados. Ser
sempre pelo menos 1, pois o nome do programa
Veja o exemplo: sempre passado como 1 argumento.
int i;
2 Execuo
#> p11_6 1 2 3 4 5 Linha de comando.
Argumentos digitados
Argumento 1 p11_6
Argumento 2 1
Argumento 3 2
Os espaos em branco na linha comando so
Argumento 4 3 considerados os delimitadores entre os argumentos.
Argumento 5 4
Argumento 6 5
3 Execuo
#> p11_6 "1 2 3 4 5" Linha de comando.
Argumentos digitados
Argumento 1 p11_6
Como foi passado entre (aspas), o programa
Argumento 2 1 2 3 4 5
recebeu como um nico argumento.
Veja o exemplo:
#include <stdio.h>
#include <string.h>
void main(void)
{
Ponteiros 93
char *p;
char frase[] = "isto e um teste";
char *pt_char;
pt_char = frase;
printf("\nEndereo Inicial = %d", pt_char );
p = strstr(frase, "to");
Parmetro de pesquisa. A funo ir retornar o
endereo correspondente localizao deste
pt_char=p; parmetro.
Sintaxe
char * strtok(endereoStr1, endereoStr2);
Veja o exemplo.
#include <stdio.h>
#include <string.h>
94 Programando em C para Linux, Unix e Windows
void main(void)
{
char *p;
char frase[]="Mario Quintana, o maior poeta gacho";
Para se fazer uso destas funes deve ser includo o arquivo header contendo a
descrio dos prottipos, algumas constantes utilizadas etc.
95
96 Programando em C para Linux, Unix e Windows
Se o arquivo pode suportar acesso aleatrio (algumas vezes referido como soli-
citao de posio), abrir esse arquivo tambm inicializa o indicador de posi-
o no arquivo para o comeo do arquivo. Quando cada caractere lido ou es-
crito no arquivo, o indicador de posio incrementado, garantindo pro-
gresso atravs do arquivo.
Veja o exemplo:
FILE *arquivo_in;
FILE *arquivo_out;
O segundo parmetro do fopen indicar qual o tipo de acesso que ser permi-
tido fazer no arquivo. Este parmetro uma string informando a modalidade
de acesso a ser realizada. Pode ser definido nesta string o seguinte:
Parmetro Significado
r Abre o arquivo para leitura somente.
w Abre o arquivo para gravao, criando o arquivo, caso no exista, ou limpan-
do o contedo dele, caso ele j exista.
a Abre o arquivo para gravao, mantendo o contedo do arquivo. O sistema
se posiciona no final do arquivo.
r+ Abre o arquivo para atualizao. Pode-se ler ou gravar no arquivo.
w+ Abre o arquivo para atualizao, permitindo leitura e gravao. Caso o arqui-
vo no exista ser criado, caso exista ser truncado.
a+ Abre o arquivo para atualizao, permitindo leitura e gravao. Se o arquivo
existir, ser posicionado no final do mesmo, mantendo o contedo anterior.
O resultado da funo fopen ser o ponteiro para o arquivo. Este valor deve
ser colocado na varivel definida para o arquivo. Se ocorrer erro na abertura
do arquivo, a funo retornar um valor nulo, que pode ser testado contra a
constante NULL.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
exit (0);
} Finaliza o programa...
else
{
printf("\nArquivo aberto para operaes.. ");
}
/* Operacoes sobre o arquivo */
}
Programa 12.1
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
{
printf ("Erro na abertura do arquivo\n");
exit (0);
Lendo valores inteiros. Cada inteiro tem
}
4 bytes, ou seja, esta chamada funo
fread ir ler at 400 bytes.
qtd = fread (vetor, sizeof (int), 100, arquivo);
printf ("Foram lidos %d itens\n", qtd);
for (i=0; i<qtd; i++)
printf ("%d\n", vetor [i]); O retorno contm a quantidade
de itens e no bytes.
fclose (arquivo);
}
Programa 12.3
Para gravar informaes no arquivo, deve-se utilizar a funo fwrite. Deve ser
informado para esta funo o ponteiro do arquivo aberto para gravao, o
endereo de memria de onde sero buscados os dados para gravao, a
quantidade de itens a serem gravados e o tamanho de cada item.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
i = 0;
while (1)
{
printf ("Entre com um valor :");
Gravando os valores lidos no vetor.
scanf ("%d", &vetor [i]); A quantidade de bytes efetivamente
if (vetor [i] == 0) gravados pode ser obtido atravs de
break; sizeof(int) * i.
i++;
}
qtd = fwrite (vetor, sizeof (int), i, arquivo);
printf ("Foram gravados %d itens\n", i);
fclose (arquivo);
}
Programa 12.4
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
FILE *arquivo;
char vetor [100][100]; Vetor de strings.
char *nome;
int i, j;
fclose (arquivo);
}
Programa 12.5
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
A funo feof indica quando o final do arquivo (end of file) foi atingido. Pas-
sa-se o ponteiro para o arquivo e ser recebido como retorno o seguinte:
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
106 Programando em C para Linux, Unix e Windows
fclose (arq_log);
}
Programa 12.8
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
FILE * fp;
int i;
int k;
108 Programando em C para Linux, Unix e Windows
int termo;
s vezes necessrio que, logo aps uma gravao, a mesma seja realmente
efetivada em disco para que no haja perda. Para isto deve-se chamar a fun-
o fflush e indicar o ponteiro para o arquivo.
Veja o exemplo:
fwrite( buf, sizeof(data_type),1, fp)
fflush(fp);
Garante que o buffer ser descarregado do
sistema operacional.
Manipulao de Arquivos (padro ANSI) 109
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
FILE * fp;
long i;
if( (fp = fopen("texto.dat","r")) == NULL )
{
printf("\nErro ao abrir o arquivo pessoa.dat");
exit(0);
} Posio inicial do arquivo. Como o
retorno da funo um long, a
if((i=ftell(fp))==-1L)
comparao deve ser feita com um
{
valor do tipo long (-1L).
printf("\nErro no arquivo");
}
printf("\nPosio atual do arquivo %d", i);
Posicionando no final do
if( fseek(fp,0L,SEEK_END) != 0 ) arquivo...
{
printf("\nErro no arquivo");
} ...e pegando o tamanho atual do
if((i=ftell(fp))==-1L) arquivo.
{
printf("\nErro no arquivo");
}
fclose(fp);
}
Programa 12.10
110 Programando em C para Linux, Unix e Windows
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
FILE * fp;
long i;
if( (fp = fopen("pessoa.dat","r")) == NULL )
{
printf("\nErro ao abrir o arquivo pessoa.dat");
exit(0);
}
Este teste pode ser realizado sempre que
fseek(fp,0,SEEK_END); houver alguma operao em um arquivo.
if( ferror(fp))
{
Manipulao de Arquivos (padro ANSI) 111
if((i=ftell(fp))==-1L)
{
printf("\nErro no arquivo");
}
fclose(fp);
}
Programa 12.11
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char slinha[20];
fprintf(stdout, "Este programa ir ler da entrada padro e gravar
na sada padro");
L uma linha da entrada padro.
fscanf(stdin, "%s", slinha );
}
Programa 12.12
Linha de comando, redirecionando a
Resultado do Programa 12.12 entrada padro.
$> p12_12 < teste.txt
Este programa ir ler da entrada padro e gravar na sada padro
Isto o que foi digitado:Teste
Pilha
Segmento de
Dados
Segmento de
Cdigo
113
114 Programando em C para Linux, Unix e Windows
Como a funo retorna um ponteiro para o tipo void, deve-se utilizar o type-
cast, transformando este endereo para o tipo de ponteiro desejado. Veja o
exemplo:
#include <stdio.h>
#include <stdlib.h>
Quando no se deseja mais uma rea alocada, deve-se liber-la atravs da fun-
o free. Deve ser passado para a funo o endereo que se deseja liberar,
que foi devolvido quando a alocao da memria ocorreu. Veja o cdigo e-
xemplo (igual ao cdigo anterior):
#include <stdio.h>
#include <stdlib.h>
free (valores);
Libera a memria utilizada.
}
Programa 13.2
#include <stdio.h>
Alocao de Memria 117
#include <stdlib.h>
free (valores);
Libera a memria utilizada.
}
Programa 13.3
Resultado do Programa 13.3
Entre com a quantidade de nmeros:3
Entre com nmero 1 ->2
Entre com nmero 2 ->4
Entre com nmero 3 ->6
2
4
6
s vezes necessrio expandir uma rea alocada. Para isto deve-se usar a fun-
o realloc. Deve-se passar para ela o ponteiro retornado pelo malloc e a in-
dicao do novo tamanho. A realocao de memria pode resultar na troca de
blocos na memria. Veja o exemplo:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Veja o exemplo:
#include <stdio.h>
#include <string.h>
Toda vez que uma varivel declarada...
int main(void)
{
char p[20];
int i;
printf("\n["); ...ela j tem um contedo. Normalmente,
for( i=0; i<20;i++) algum lixo que ficou na memria...
{
printf("%c", p[i]);
}
printf("]\n["); ...e mesmo que venha a ser assinalado
algum valor para a varivel...
strcpy( p, "teste");
for( i=0; i<20;i++)
{ ...o espao de memria no utilizado
printf("%c", p[i]); continua com o contedo...
}
printf("]\n[");
...ento a melhor opo preencher todo o
espao de memria com algum valor
memset( p, 0, sizeof(p)); conhecido, normalmente 0...
for( i=0; i<20;i++)
{
printf("%c", p[i]); ...assim o contedo indesejado
} descartado...
printf("]\n[");
Contedo indesejvel.
Resultado do Programa 13.5
[ZZ ZZ ZZ ZZ ZZ ]
Varivel ainda com contedo indesejvel.
[teste ZZ ZZ ZZ ]
[ ] Memria limpa e com um valor controlado.
[teste ]
A varivel com o contedo correto.
14 Estruturas
A vantagem de ter uma estrutura que ela passa a ser um tipo definido, po-
dendo definir de maneira simplificada uma ou mais variveis. Cada varivel
desta estrutura chamada de campo da estrutura.
120
Estruturas 121
Veja o exemplo:
struct Funcionario
{
char nome [40];
char departamento[10];
int dataNasc;
float salario;
};
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
backup = aluno;
printf ("Nome : %s\n", backup.nome);
printf ("Turno : %c\n", backup.turno);
Estruturas 123
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Criando a estrutura
void main (void) st_aluno...
{
char linha [80];
typedef struct st_aluno
{
char nome [80];
char turno; ...criando um apelido ou
int media; sinnimo chamado
} ALUNO; ALUNO para a estrutura
ALUNO aluno,backup; st_aluno...
FILE * fp;
...e criando outras estruturas
a partir do typedef
if( (fp = fopen("notas.dat","w"))==NULL) definido.
{
printf("\nErro ao abrir arquivo.");
exit(0);
}
while(1)
{
124 Programando em C para Linux, Unix e Windows
if( strcmp(aluno.nome,"FIM") == 0)
break;
backup = aluno;
printf ("Nome : %s\n", backup.nome);
printf ("Turno : %c\n", backup.turno);
printf ("Media : %d\n", backup.media);
Veja o exemplo:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void main(void)
{
FUNCIONARIO f;
char linha[80];
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
i++;
}
fclose (arquivo);
}
Programa 14.5
Veja o exemplo:
struct teste{
int var_a;
int var_b;
} *pVariavel;
pVariavel = (struct teste *) malloc (sizeof(struct teste));
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
Veja o exemplo:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
129
130 Programando em C para Linux, Unix e Windows
#ifdef WINDOWS
No windows, a funo sleep dorme em milissegundos
sleep(5*1000);
#else No Linux/Unix, a funo sleep dorme em segundos
sleep(5);
#endif
Pegando o nmero de segundos como parmetro
time(&hora); (ponteiro) para a funo.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> Para armazenar a quantidade de segundos
int main (void)
{
time_t hora_sist; Para armazenar o formato expandido da data.
struct tm *hora_exp;
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
hora_exp = localtime(&hora_sist);
2 Execuo
Data atual : Mon Apr 4 16:33:56 2005
Valor digitado...
Quantidade de dias no futuro/passado:-30
Data futura: Sat Mar 5 16:33:56 2005
... e data 30 dias antes.
Formato Descrio
%a Nome do dia da semana abreviado
%A Nome completo do dia da semana
%b Nome do ms abreviado
%B Nome completo do ms
%c Data no formato do comando date()
%C O nmero do sculo como um nmero decimal [00-99]
%d Dia do ms com duas posies [01,31]
%D Equivalente ao formato %m/%d/%y
%e Dia do ms com duas posies, sendo que dias com um dgito so precedi-
dos por um branco [1,31]
%h Equivalente a %b
%H Hora com dois dgitos [00,23]
%I Hora no formato de 0 a 12 horas com dois dgitos [01,12]
136 Programando em C para Linux, Unix e Windows
Formato Descrio
%j Dia do ano. Chamado de data juliana [001,366]
%m Nmero do ms com dois dgitos [01,12]
%M Minutos com dois dgitos [00,59]
%n Caractere Line Feed
%p Indicativo de antes ou ps meio-dia [AM/PM]
%r Notao POSIX. Equivalente %I:%M:%S %p
%R Hora no formato de 0 a 24 horas com minutos. Equivalente a %H:%M
%S Nmero de segundos com dois dgitos [00,61]
%t Caractere de tabulao
%T A hora no formato hora/minuto/segundo. Equivalente a %H:%M:%S
%u O dia da semana no formato numrico. 1 para Segunda-feira, 2 para Tera-
feira, etc. [1,7]
%U Nmero da semana no ano, considerando o domingo como primeiro dia da
semana [00,53]. Todos os dias precedentes ao primeiro domingo do ano se-
ro considerados como sendo a semana 0.
%V Nmero da semana no ano, considerando a Segunda-feira como primeiro
dia da semana [00,53]. Se a semana contendo o dia 1 de Janeiro tem quatro
ou mais dias no novo ano, ento ela considerada semana 1, caso contrrio
ser considerada semana 53 do ano anterior.
%w O dia da semana no formato numrico. 0 para Domingo, 1 para Segunda-
feira etc. [1,6]
%W Nmero da semana no ano, considerando a Segunda-feira como primeiro
dia da semana [00,53]. Todos os dias precedendo a primeira Segunda-feira
do ano sero considerados como semana 0.
%x Data no formato configurado por LANG
%X Hora no formato configurado por LANG
%y Nmero do ano sem o sculo, ou seja, com dois dgitos somente [00,99]
%Y Nmero do ano com quatro dgitos
%Z Nome do timezone configurado
%% Caractere %
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
138
Tratamento de Erros 139
Veja o exemplo:
#include <stdio.h>
#include <errno.h>
Veja o exemplo:
140 Programando em C para Linux, Unix e Windows
#include <stdio.h>
#include <errno.h>
#include <string.h>
if (fp==NULL)
Retorno da mensagem de
{ erro a partir do cdigo do
printf ("Codigo de Erro: %d\n", errno); erro contido na varivel
printf ("Erro: %s\n", strerror (errno)); errno.
}
Como a maioria dos erros ocorridos deve ser mostrada de maneira idntica na
sada de erro padro, e baseado principalmente no valor da varivel errno, po-
de-se usar a funo perror que realiza todas estas tarefas automaticamente.
Veja o exemplo:
#include <stdio.h>
#include <errno.h>
if (fp==NULL)
perror(argv[0]);
}
Programa 16.3
142
Definies Avanadas 143
Veja o exemplo:
#include <stdio.h>
typedef union teste
{
unsigned short int valor;
char caractere[2];
} TESTE;
A lista enumerada nada mais que uma lista em que o compilador, para cada
constante colocada, ir atribuir um valor interno.
144 Programando em C para Linux, Unix e Windows
Toda vez que o compilador encontrar esta constante ele a substituir pelo va-
lor interno.
Veja o exemplo:
Ser associada uma seqncia numrica
#include <stdio.h> comeando em 0.
Veja o exemplo:
#include <stdio.h>
Operador Operao
& E
| OU
^ OU Exclusivo
~ Negao
Veja o exemplo:
#include <stdio.h>
Operador Operao
<< Deslocamento esquerda
>> Deslocamento direita
Veja o exemplo:
#include <stdio.h>
vlr1 = 4000;
#include <stdio.h>
void main(void)
{
char i = 255;
char r;
printf("\nOriginal = %d", i );
r = shift_esquerda(i,4);
printf("\n%d", r);
r = shift_direita(r,3);
printf("\n%d", r);
i = 129;
printf("\nOriginal = %d", i );
r = shift_esquerda(i,4);
printf("\n%d", r);
r = shift_direita(r,4);
printf("\n%d", r);
}
Programa 17.6
Nome Funo
read() L um buffer de dados
write() Escreve um buffer de dados
open() Abre um arquivo em disco
close() Fecha um arquivo em disco
lseek() Move ao byte especificado em um arquivo
unlink() Remove um arquivo do diretrio
remove() Remove um arquivo do diretrio
rename() Renomeia um arquivo no diretrio.
148
Manipulao de Arquivos (padro Linux e Unix) 149
Ao contrrio do sistema de E/S de alto nvel (nvel 3), o sistema de baixo nvel
(nvel 2) no utiliza ponteiros de arquivo do tipo FILE, mas descritores de ar-
quivo do tipo int. Na funo de abertura de arquivo, o sistema operacional
devolve para o programa o descritor de arquivo que ele atribuiu ao arquivo.
Todas as outras funes devem receber este descritor para identificar sobre
qual arquivo estamos querendo realizar a operao.
Para abrir um arquivo deve-se chamar a funo open. A funo recebe o nome
do arquivo como parmetro juntamente com o flag indicando o modo de a-
bertura e flags informando opes adicionais de abertura e/ou tratamento de
arquivo. Pode-se colocar todo o caminho do arquivo juntamente com o seu
nome.
Caso ocorra algum erro na abertura, a funo ir retornar o valor 1 como re-
sultado. Na varivel errno estar indicado o erro ocorrido na abertura.
O_RDONLY O arquivo est sendo aberto para leitura. Caso no se coloque ne-
nhum flag adicional e caso o arquivo no exista, a funo de abertura retorna-
r um erro.
O_RDWR O arquivo estar sendo aberto para leitura e gravao. Tambm nes-
te caso, se o arquivo no existir e nenhum flag adicional foi colocado, a funo
retorna erro.
Podem-se colocar alguns flags adicionais com um dos flags antes definidos. Es-
tes flags iro determinar as aes a serem realizadas no processo de abertura
do arquivo e devem ser colocadas com or binrio no segundo parmetro.
Manipulao de Arquivos (padro Linux e Unix) 151
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
152 Programando em C para Linux, Unix e Windows
#include <errno.h>
#include <fcntl.h>
#include <string.h>
close(fd);
if (fd < 0)
fprintf(stderr, "Erro : %s\n", strerror(errno));
else
printf("Arquivo aberto\n");
close (fd);
if (fd < 0)
fprintf (stderr, "Erro : %s\n", strerror(errno));
else
printf ("Arquivo aberto\n");
close (fd);
close (fd);
}
Programa 18.1
2 Execuo
Tentando abrir o arquivo 'file1' para leitura
Erro : No such file or directory
Tentando abrir o arquivo 'file2' para gravao
Erro : No such file or directory
154 Programando em C para Linux, Unix e Windows
Configurao do ambiente
$> umask
Verificando a mscara padro para criao de arquivos no sistema. O
0027 resultado 0027 indica permisso total para usurio (leitura, gravao
e execuo), leitura e execuo para grupo e nenhuma permisso para
outros.
O arquivo ser aberto somente para gravao pois esta funo equivalente
chamada da funo open com os parmetros seguintes.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
Manipulao de Arquivos (padro Linux e Unix) 155
close (fd);
exit (0);
}
Programa 18.2
2 Execuo
$> p18_2 file6
Criando o arquivo file6 com a funcao 'creat()'
Arquivo criado
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <fcntl.h>
void main(int argc, char *argv[]) Esta constante indica o tamanho (de
{ caracteres incluindo diretrios e
int fd; subdiretrios) que um arquivo pode possuir.
Est definido no arquivo limits.h.
gets (sNome);
fd = open (sNome, O_RDONLY);
if (fd < 0)
{
perror (argv[0]);
exit (errno);
}
printf ("Arquivo '%s' aberto\n", sNome);
3 Execuo
Entre com o nome do arquivo : file8
Arquivo 'file8' aberto
Tentando ler 100 bytes do arquivo indicado
Foram lidos 88 bytes do arquivo 'file8'
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
close(fd);
exit(0);
}
Programa 18.4
Aps a execuo da funo, ela retorna a posio atual do arquivo. Caso ocor-
ra algum erro no posicionamento, a funo ir retornar 1.
Veja o exemplo:
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
{
perror (argv[0]);
exit (errno); E gravando o nmero 127 nesta posio.
}
i = 127;
if (write (fd, &i, sizeof(int)) < 0)
{
perror (argv[0]);
exit (errno);
}
close (fd);
exit (0);
}
Programa 18.5
A funo remove apaga o arquivo especificado pela varivel path. Ela devolve
0 (zero) se a operao foi um sucesso e um valor diferente de zero se ocorreu
um erro.
162 Programando em C para Linux, Unix e Windows
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
Isto permite que se faa a remoo de arquivos ainda abertos, sem que haja a
perda de dados enquanto o arquivo estiver aberto. Esta tcnica permite a cria-
o de arquivos temporrios atravs da abertura dos mesmos. Logo em segui-
Manipulao de Arquivos (padro Linux e Unix) 163
Veja o exemplo:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
A funo rename faz com que o arquivo indicado no primeiro parmetro tenha
o seu nome trocado pelo nome informado no segundo parmetro.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
19 Informaes no Linux
e Unix
Juntamente com o PID, o processo possui o PPID, ou Parent Process ID, que
o PID do processo pai que ativou o processo. Na maioria dos casos, quando
um programa executado, o PPID dele ser o PID do processo shell que est
sendo executado.
166
Buscando Algumas Informaes no Linux e Unix 167
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
pid_processo = getpid();
pid_pai = getppid();
exit (0);
}
Programa 19.1
Digite 'echo $$' para obter o PID do processo shell que chamou este
programa
$> echo $$
19579
168 Programando em C para Linux, Unix e Windows
Alm das informaes do PID e PPID, o processo possui mais informaes asso-
ciadas. O processo possui o User Identification (UID) e o Group Identifi-
cation (GID) reais que indicam para o sistema quem o usurio realmente .
Estes dois identificadores so obtidos quando o processo shell da sesso ini-
ciada e os valores so retirados do arquivo /etc/passwd. Normalmente estes
valores no mudam durante a sesso, a no ser que o usurio possua permis-
so de superusurio.
Este valores sero usados pelo sistema operacional para a verificao das per-
misses quando o processo faz algum acesso a um recurso do sistema (arqui-
vos, diretrios, dispositivos, memria compartilhada, filas, named pipes).
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
printf("Valores retornados\n");
printf("User Id real : |%d|\n", uid_real);
printf("User Id efetivo : |%d|\n", uid_efet);
exit(0);
}
Programa 19.2
Digite 'id' para obter o UID do processo shell que chamou este programa
Verificao com o comando id.
$> id
uid=10004(laureano) gid=502(laureano) grupos=502(laureano)
#define UTSLEN 9
#define SNLEN 15
170 Programando em C para Linux, Unix e Windows
struct utsname
{
char sysname[UTSLEN];
char nodename[UTSLEN];
char release[UTSLEN];
char version[UTSLEN];
char machine[UTSLEN];
char idnumber[SNLEN];
};
Caso ocorra algum erro na funo, ser retornado 1 como resultado. O erro
ocorrido ser colocado na varivel errno. A funo retorna valor zero caso a
funo no apresente problemas.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/utsname.h>
exit (0);
}
Programa 19.3
A funo acess ir considerar o UID e GID real do processo no teste das permisses
e no os valores efetivos do processo. As constantes permitidas na funo so:
R_OK Permisso de leitura.
W_OK Permisso de gravao.
X_OK Permisso de execuo.
F_OK Teste para arquivo comum.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
void main (int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "Uso : %s <arquivo>\n", argv[0]);
exit(1);
}
printf("Permissoes para o arquivo %s\n", argv[1]);
if(access(argv[1], R_OK) == 0)
printf("\tLeitura\n");
if(access(argv[1], X_OK) == 0)
printf("\tExecucao\n");
exit(0);
}
Programa 19.4
172 Programando em C para Linux, Unix e Windows
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
Buscando Algumas Informaes no Linux e Unix 173
Macro Funo
S_ISREG() Arquivo comum
S_ISDIR() Diretrio
S_ISCHR() Arquivo de dispositivo orientado a caractere
S_ISBLK() Arquivo de dispositivo orientado a bloco
S_ISFIFO() O arquivo um pipe ou um arquivo FIFO
S_ISLNK() O arquivo um link simblico
S_ISSOCK() O arquivo um arquivo do tipo socket
Veja o exemplo:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
if(argc != 2)
{
fprintf(stderr, "Uso : %s <arquivo>\n", argv[0]);
exit(1);
} Obtendo os atributos do arquivo.
if(S_ISDIR(info.st_mode))
printf("%s --> Diretorio\n", argv[1]);
if(S_ISCHR(info.st_mode))
printf ("%s --> Dispositivo orientado a caracter\n", argv[1]);
if(S_ISBLK(info.st_mode))
printf ("%s --> Dispositivo orientado a bloco\n", argv[1]);
if(S_ISFIFO(info.st_mode))
printf ("%s --> Arquivo pipe ou FIFO\n", argv[1]);
if(S_ISLNK(info.st_mode))
printf ("%s --> Link simbolico\n", argv[1]);
exit(0);
}
Programa 19.5
176 Programando em C para Linux, Unix e Windows
Toda vez que o sistema cria um arquivo ou diretrio, ele utiliza uma mscara
padro de permisso. Esta mscara sempre est assinalada para um valor e ne-
la deve-se colocar quais so as permisses que devem ser desligadas na criao
de arquivos e diretrios. Veja o comando umask do sistema operacional.
Pode-se passar como parmetro o formato octal de permisso aceito pelo co-
mando chmod (desde que precedido por zero para indicar o formato octal) ou
ento utilizar as mesmas constantes definidas no sys/stat.h para obter a
permisso do campo st_mode da estrutura stat.
Veja o exemplo:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
mode_t mask_old;
Buscando Algumas Informaes no Linux e Unix 177
exit(0);
}
Programa 19.6
Portanto, a funo fork chamada uma nica vez e retorna duas vezes, uma
no processo pai e outra no processo filho. Como exemplo, o processo filho
herda informaes do processo pai:
o Usurios (user id) Real, efetivo.
o Grupos (group id) Real, efetivo.
o Variveis de ambiente.
178
Criando Processos no Linux e Unix 179
o Descritores de arquivos.
o Prioridade.
o Todos os segmentos de memria compartilhada assinalados.
o Diretrio corrente de trabalho.
o Diretrio Raiz.
o Mscara de criao de arquivos.
Para criar um novo processo basta chamar a funo fork. criado um novo
processo, chamado de processo filho, que uma cpia quase fiel do processo
pai. Quando do uso da funo fork, em ambos os processos ser executada a
linha seguinte chamada da funo fork. Para identificar de dentro de um
processo qual o cdigo do pai e qual o cdigo do filho, pois geralmente
possuem lgicas distintas, deve-se testar o retorno da funo fork.
Caso a funo fork retorne 0 (zero), o processo filho est sendo executado.
Caso a funo retorne um valor diferente de 0 (zero), mas positivo, o processo
pai est sendo executado. O valor retornado representa o PID do processo fi-
lho criado. A funo retorna -1 em caso de erro, provavelmente devido a ter
atingido o limite mximo de processos por usurio configurado no sistema. Ve-
ja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
180 Programando em C para Linux, Unix e Windows
O status retornado pela funo, apesar de ser um nmero inteiro, possuir in-
formaes codificadas indicando se o processo terminou normalmente ou can-
celou o cdigo de retorno do processo. O arquivo sys/wait.h contm um con-
junto de macros para testar o motivo do trmino do processo filho, bem como
para obter o cdigo de retorno caso o processo tenha sido terminado normal-
mente, ou o nmero do sinal caso o processo tenha sido cancelado.
Veja o exemplo:
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
if (iPid != 0)
{
while(1)
{
printf("\nVerificando o processo filho\n");
sleep(2);
if(waitpid(iPid, &iStatus, WNOHANG) != 0)
{
Verificando se o processo filho terminou...
if(WIFEXITED(iStatus))
printf("\nTermino normal:|%d|\n", WEXITSTATUS(iStatus));
else if (WIFSIGNALED(iStatus))
printf("\nCancelado por sinal:|%d|\n", WTERMSIG(iStatus));
break;
}
}
}
if (iPid == 0)
{
int iVlr;
Criando Processos no Linux e Unix 185
printf("\nDuplicando o processo\n");
iPid = fork ();
if(iPid < 0)
{
perror(argv[0]);
exit(errno);
}
if(iPid != 0)
{
wait (&iStatus);
printf("\nStatus de termino :|%d|\n",
WEXITSTATUS(iStatus));
}
if(iPid == 0)
{ Execuo do
printf("\nExecutando o comando 'ls /home'\n"); comando ls.
execl("/bin/ls", "ls", "/home", (char *) 0);
Veja o exemplo:
#include <stdio.h>
#include <errno.h>
exit(0);
}
Programa 20.5
188
Tratamento de Sinais em Linux e Unix 189
Como cada sinal tem uma ao default configurada e, na maioria dos casos,
esta ao padronizada para os diversos sistemas; deve-se verificar a ao de-
fault configurada para o sinal na documentao do sistema operacional. As
possveis aes padres a serem aplicadas sobre os sinais so:
o O processo terminado O processo que recebe o sinal terminado.
As rotinas de cleanup so executadas normalmente.
190 Programando em C para Linux, Unix e Windows
Para maiores informaes sobre outros sinais, consulte o manual on-line do sis-
tema para ver o comando kill. Para maiores informaes sobre status de pro-
cessos, veja o comando ps.
Para instalar uma funo signal handler ou indicar para o processo ignorar
um sinal, deve-se usar a funo signal. A funo ir receber no primeiro pa-
rmetro o nome do sinal sobre o qual ser efetuado o processamento.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h> Funo que vai tratar os sinais. Para
tratar cada sinal, basta utilizar as
#include <signal.h>
constantes definidas.
#include <unistd.h>
exit (0);
}
Programa 21.1
Recebido o sinal 4.
Recebido o sinal 7. Programa recebeu sinal 9 (KILL).
Recebido o sinal 1.
Recebido o sinal 15.Killed
A funo kill, apesar do nome, serve para enviar um sinal para um determi-
nado processo ou para um grupo de processos. O sinal s ser entregue no
processo destino caso exista permisso para isto. Geralmente um processo com
permisso de root pode enviar qualquer sinal para qualquer processo do sis-
tema. Processos de usurios normais podero enviar sinais somente para
processos pertencentes ao mesmo usurio.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
194 Programando em C para Linux, Unix e Windows
if (iPid == 0)
{
int iVlr;
printf("\nExecutando o processo filho\n");
while(1)
{
printf ("Digite um numero (0 p/ terminar) : ");
scanf ("%d", &iVlr);
if (iVlr == 0)
break; Pegando o PID do pai e
if ((iVlr % 2) == 0) enviando um sinal para ele...
{
if (kill(getppid(), SIGUSR1) < 0)
{
perror(argv[0]);
exit(errno);
}
}
}
}
exit(0);
}
Programa 21.2
A funo raise serve para enviar um sinal para o prprio processo. Indica-se
no parmetro o nmero ou o nome do sinal a ser enviado para o processo. Ve-
ja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
perror(argv[0]);
exit(errno);
}
while(1)
{
printf ("Digite um numero (0 p/ terminar) : ");
scanf ("%d", &iVlr);
if (iVlr == 0)
break;
if ((iVlr % 2) == 0) Envio do sinal SIGUSR1 para
{ o prprio processo.
if( raise(SIGUSR1) < 0)
{
perror(argv[0]);
exit(errno);
}
}
}
exit(0);
}
Programa 21.3
Caso o processo receba um sinal enquanto esteja suspenso pela funo sleep,
o processo volta a rodar e realizada a execuo da funo signal handler
correspondente ao sinal ocorrido. No trmino da funo, caso a mesma no
termine o processo, a funo sleep termina, devolvendo em seu parmetro a
quantidade de segundos ainda restantes no despertador.
Veja o exemplo:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
Segue uma relao de funes que podem ser usadas dentro de funes sig-
nal handlers sem problemas, pois possuem a caracterstica de reentrncia ne-
cessria.
200
Daemons (Servios) em Linux e Unix 201
O conceito de grupo de processo pode ser usado na funo signal, que permi-
te que se mande um sinal para todos os processos pertencentes a um grupo e
na funo waitpid que permite que o processo pai receba o cdigo de retorno
de qualquer processo filho pertencendo a um grupo de processos.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <strings.h>
Daemons (Servios) em Linux e Unix 203
#include <sys/types.h>
#include <sys/stat.h> Headers ou includes Necessrios
#include <fcntl.h> para o daemon
#include <unistd.h>
Rotina usada para transformar o processo
em um processo daemon. O nome
daemon_init uma conveno adotada, sua
int daemon_init (void)
funo pode ter qualquer nome.
{
pid_t iPid;
long iMaxFd;
int i;
i = 1;
while (1) Para fins de testes, o programa abre um arquivo e
{ de 3 em 3 segundos grava uma linha no arquivo.
sleep(3);
sprintf(szBuffer, "Esta eh a linha de numero %04d\n", i++);
write(iFd, szBuffer, strlen (szBuffer));
}
exit (0);
}
Programa 22.1
o Arquivo gerado:
$> ls -l /tmp/daemon246908.arq
-rwx------ 1 laureano prof 527 May 17 07:44 /tmp/daemon246908.arq
Prioridade Descrio
LOG_EMERG Emergncia
LOG_ALERT Condio muito crtica
LOG_CRIT Condio crtica
LOG_ERR Condio de erro
LOG_WARNING Aviso significativo
LOG_NOTICE Aviso normal
LOG_INFO Informao
LOG_DEBUG Mensagem para debug
Veja o exemplo:
#include <stdio.h>
#include <syslog.h>
void main(void)
{
char szmensagem[200];
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
207
208 Programando em C para Linux, Unix e Windows
void main(void)
Criao do ponto de
{ comunicao...
int iSock;
iSock = socket(AF_INET, SOCK_STREAM, 0);
if( iSock == -1)
{
perror("socket:");
exit(1);
}
}
Programa 23.1
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
Programao para Rede 209
my_addr.sin_addr.s_addr = INADDR_ANY;
Preenche com o endereo local.
bzero(&(my_addr.sin_zero), 8);
} Preenchendo com 0 os bytes no
Programa 23.2 utilizados da estrutura.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
210 Programando em C para Linux, Unix e Windows
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
}
Programa 23.3
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
}
}
Programa 23.4
void main(void)
{
int iSock;
struct sockaddr_in dest_addr;
A funo connect inicia uma conexo socket do lado do cliente, no sendo ne-
cessrio associar uma parte no cliente. Na estrutura passada so fornecidas as
informaes relacionadas ao servidor (destino). A funo retorna 0 (zero) se a
conexo foi bem sucedida ou 1 se houve erro. Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main(void)
{
int iSock;
struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(4950);
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(dest_addr.sin_zero), 8);
if( connect (iSock,(struct sockaddr *)&dest_addr, sizeof(struct
sockaddr)) < 0)
{ Tenta a conexo no servidor.
perror("connect:");
exit(1);
}
}
Programa 23.6
Programao para Rede 213
Aps o socket (funo socket) ter sido criado e uma porta associada (funo
bind) necessrio habilitar o socket para receber as conexes. A funo lis-
ten faz justamente este papel, ou seja, habilita que o programa servidor rece-
ba conexes de um programa cliente. Deve-se passar o descritor do socket a-
berto e a quantidade de conexes que podem ficar pendentes at que o
programa trate todas as conexes anteriores. A funo retorna 0 (zero) em ca-
so de sucesso e 1 em caso de erro. Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
}
}
Programa 23.7
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
{
perror("listen:");
exit(1);
} Aceita conexes eternamente.
A funo send utilizada para enviar uma mensagem para outro socket. Para
o envio de mensagens, tambm pode ser utilizada a funo write (o mesmo
que passar o valor 0 em flags da funo send). A funo retorna o nmero de
bytes enviados ou 1 se houve erro.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
216 Programando em C para Linux, Unix e Windows
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
A funo recv utilizada para receber (ler) uma mensagem de um socket. Pa-
ra leitura de mensagens, tambm pode ser utilizada a funo read. A funo
retorna o nmero de bytes lidos ou 1 se houve erro.
Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main(void)
{
int iSock;
int iBytes;
struct sockaddr_in dest_addr;
char buffer[100];
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(4950);
218 Programando em C para Linux, Unix e Windows
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(dest_addr.sin_zero), 8);
printf("Recebido: %s",buffer);
}
Programa 23.10
A funo close finalizada uma conexo socket. A funo shutdown finaliza to-
da ou parte de uma conexo full-duplex. As funes retornam 0 (zero) em caso
de sucesso ou 1 se houve algum erro. Veja o exemplo:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include <sys/types.h>
Programao para Rede 219
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main(void)
{
int iSock;
int iBytes;
struct sockaddr_in dest_addr;
char buffer[100];
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(4950);
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(dest_addr.sin_zero), 8);
printf("Recebido: %s",buffer);
if (argc != 2)
{
printf("Deve-se passar nome da maquina");
exit(1);
}
if ((h=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname:");
exit(1);
}
return 0;
}
Programa 23.12
Programao para Rede 221
Cliente TCP
socket()
void main(void)
{
int iSock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
{
perror("accept:");
exit(1);
}
memset(szMensagem, 0, sizeof(szMensagem));
strcpy(szMensagem, "Ola cliente\n");
if( send( iFd, szMensagem, strlen(szMensagem),0) < 0)
{
perror("send:");
exit(1);
}
close(iFd);
}
}
Programa 23.13
void main(void)
{
int iSock;
int iBytes;
struct sockaddr_in dest_addr;
char buffer[100];
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(4950);
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
bzero(&(dest_addr.sin_zero), 8);
224 Programando em C para Linux, Unix e Windows
buffer[iBytes] = '\0';
printf("Recebido: %s",buffer);
close(iSock);
}
Programa 23.14
socket()
Cliente UDP
bind()
socket()
recvfrom()
sendto()
Requisio
Aguardando envio...
Processa a requisio...
sendto()
Resposta
recvfrom() close()
close()
Programao para Rede 225
int main(void)
{
int iSock;
struct sockaddr_in my_addr;
struct sockaddr_in client_addr;
socklen_t addr_len;
int numbytes;
char buffer[100];
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(4950);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
buffer[numbytes] = '\0';
printf("O conteudo do pacote eh %s\n",buffer);
close(iSock);
}
Programa 23.15
if (argc != 3)
{
printf("Passe o nome do servidor e a mensagem");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
close(iSock);
}
Programa 23.16
Tcnicas de Programao
para Facilitar a Depurao,
24 Documentao, Economia
e Execuo de Processos
Atravs de tcnicas simples, este trabalho visa mostrar como obter maior qua-
lidade no desenvolvimento de software, agilidade na depurao, software au-
to-documentvel e de fcil execuo.
228
Tcnicas de Programao para Facilitar a Depurao, Documentao... 229
Tenha como premissa somente declarar as variveis onde voc for utiliz-las,
no declare uma varivel como global se ela somente for utilizada naquela
funo bem escondida para somar 2 + 2; alm de ocupar memria desnecessa-
riamente, pode ocasionar resultados inesperados.
#include <stdio.h>
void main(void)
{
int a = 10;
int b = 20;
int c;
/* mostrar as variveis com os valores originais */
printf( \nValor de A = %d, a );
printf( \nValor de B = %d, b );
/* trocando os valores entre as variveis */
c = a;
a = b;
b = c;
/* mostrar as variveis com os valores trocados */
230 Programando em C para Linux, Unix e Windows
#include <stdio.h>
void main(void)
{
int a = 10;
int b = 20;
/* mostrar as variveis com os valores originais */
printf( \nValor de A = %d, a );
printf( \nValor de B = %d, b );
/* quero trocar o contedo entre as variveis */
{ /* abro um novo bloco de instrues */
int c; /* declaro uma varivel auxiliar aqui */
c = a;
a = b;
b = c;
} /* ao ser fechado, todas as variveis declaradas dentro deste
bloco so limpas da memria */
/* mostrar as variveis com os valores trocados */
printf( \nValor de A = %d, a );
printf( \nValor de B = %d, b );
}
Programa 24.2
No meu objetivo que voc utilize esta tabela como regra imutvel de codifi-
cao, ela uma sugesto para auxiliar o programador novato e at mesmo o
experiente a adotar um padro. possvel criar uma tabela para cada linguagem
de programao, bastando identificar os tipos de dados possveis nesta lingua-
gem. Torno a frisar que o importante voc ter um padro de declarao de va-
riveis, qualquer que seja, e que este padro seja comum ao seu local de traba-
lho e que esteja disponvel a todos que iro trabalhar com o cdigo fonte.
A = ((B*C)/100)*(F*(3/D))
Caso esta frmula esteja trazendo um valor diferente do esperado, como fazer
para descobrir qual parte da frmula est errada? Voc pode depurar o pro-
grama, capturar o contedo de cada varivel verificando se foram inicializa-
das com os valores corretos e realizar o clculo manualmente. E se, mesmo
assim, o resultado achado manualmente for diferente do que o programa est
calculando supondo que o clculo manual esteja correto ser um erro de
arredondamento? Fica muito mais fcil a depurao deste cdigo e conse-
qentemente a manuteno, se ele fosse declarado da seguinte forma:
Y = (B*C)
X = Y/100
Z = (3/D)
W=F*Z
A=X*W
Acredito que neste momento estou levantando uma polmica entre os pro-
gramadores que defendem a codificao da frmula anterior em somente uma
linha de programa, alegando que o programa executaria mais rpido em
funo de utilizar menos linhas e consumiria menos memria em funo de
no haver a necessidade de se criarem variveis auxiliares.
Passo 1 = B*C
Passo 2 = Passo 1/100
Passo 3 = 3/D
Passo 4 = F * Passo 3
Passo 5 = Passo 4 * Passo 2
E para aplacar a ira dos programadores que julgam estar gastando memria
desnecessariamente ao criar variveis auxiliares, peo para que olhem o exem-
plo a seguir, onde demonstro como criar variveis auxiliares e economizando
memria do sistema.
#include <stdio.h>
void main(void)
{
float A,B,C, D, F;
B = 10.23;
C = 17.87;
D = 89.34;
F = 115.01;
{
float Y, X, Z, W;
Y = (B*C);
X = Y/ 100;
Z = (3/D);
Tcnicas de Programao para Facilitar a Depurao, Documentao... 233
W = F * Z;
A = X * W;
}
/* neste momento, as variveis auxiliares j no esto mais na
memria */
printf( A = %f, A);
}
Programa 24.3
#include <stdio.h>
void main(void)
{
float A,B,C,D, F;
B = 10.23;
C = 17.87;
D = 89.34;
F = 115.01;
A = ((B*C)/100)*(F*(3/D));
printf( "A = %f", A);
}
Programa 24.4
#include <stdio.h>
void main(void)
{
float fSalario;
char szNomeFuncionario[40];
int iNivelCargo;
char szNomeDepartamento[40];
fSalario = 7500.00; /* ainda chego l */
strcpy( szNomeFuncionario, Marcos Aurelio Pchek Laureano);
iNivelCargo = 21;
strcpy( szNomeDepartamento, INBR TSV COM );
printf(\nFuncionario = %s, szNomeFuncionario);
printf(\nSalario = %f, fSalario );
printf(\nNivel Cargo = %d, iNivelCargo );
printf(\nDepartamento = %s, szNomeDepartamento );
}
Programa 24.5
#include <stdio.h>
struct ST_FUNCIONARIO
{
float fSalario;
char szNomeFuncionario[40];
int iNivelCargo;
char szNomeDepartamento[40];
};
Tcnicas de Programao para Facilitar a Depurao, Documentao... 235
void main(void)
{
struct ST_FUNCIONARIO stFuncionario;
stFuncionario.fSalario = 7500.00; /* sonhar no paga imposto */
strcpy(stFuncionario.szNomeFuncionario, Marcos Aurelio Pchek
Laureano);
stFuncionario.iNivelCargo = 21;
strcpy(stFuncionario.szNomeDepartamento, INBR TSV COM );
printf(\nFuncionario = %s, stFuncionario.szNomeFuncionario);
printf(\nSalario = %f, stFuncionario.fSalario );
printf(\nNivel Cargo = %d, stFuncionario.iNivelCargo );
printf(\nDepartamento = %s, stFuncionario.szNomeDepartamento );
}
Programa 24.6
#include <stdio.h>
int main( int iArgc, char ** pszArgv )
{
int iA, iB, iC;
if( iArgc < 3 )
{
236 Programando em C para Linux, Unix e Windows
A = B*C+10
A = (B*C)+10
Pode parecer exagero comentar situaes como a anterior, mas aps dar ma-
nuteno a diversos programas, construdos nas mais variadas linguagens de
programao, vocs no imaginam a quantidade de ocasies nas quais me de-
parei com este tipo de situao.
#include <stdio.h>
void main( int iArgc, char ** pszArgv )
{
int iA[5];
int iContador;
int iB;
Tcnicas de Programao para Facilitar a Depurao, Documentao... 237
iB = atoi(pszArgv[1]);
iA[0]=2;
iA[1]=7;
iA[2]=3;
iA[3]=10;
iA[4]=15;
for( iContador = 0; iContador < 5 && iA[iContador]!= iB; iConta-
dor ++ );
if( iContador < 5 )
printf(\nAchei);
else
printf(\nNao achei);
}
Programa 24.8
#include <stdio.h>
void main( int iArgc, char ** pszArgv )
{
int iA[5];
int iContador;
int iB;
iB = atoi(pszArgv[1]);
iA[0]=2;
iA[1]=7;
iA[2]=3;
iA[3]=10;
iA[4]=15;
for( iContador = 0; iContador < 5; iContador ++ )
if(iA[iContador] == iB ) break;
if( iContador < 5 )
printf(\nAchei);
else
printf(\nNao achei);
}
Programa 24.9
Programas Avanados
Eu posso explicar isso para eles, mas eu no posso entender isso por eles.
Dan Rather, reprter americano
A.1 Recursividade
Na linguagem C, as funes podem chamar a si mesmas. A funo recursiva
se um comando no corpo da funo a chama. Recurso a habilidade que
uma funo tem de chamar a si mesma, ou seja, a tcnica que consiste sim-
plesmente em aplicar uma funo como parte da definio dessa mesma fun-
o.
Para uma linguagem de computador ser recursiva, uma funo deve poder
chamar a si mesma. Um exemplo simples a funo fatorial, que calcula o
fatorial de um inteiro. O fatorial de um nmero N o produto de todos os
nmeros inteiros entre 1 e N. Por exemplo, 3 fatorial (ou 3!) 1 * 2 *3 = 6.
Veja os exemplos:
Verso iterativa.
int fatorialc( int n )
{
int t, f;
f = 1;
for( t = 1; t<=n; t++ )
f = f * t
return f;
}
Programa A.1
239
240 Programando em C para Linux, Unix e Windows
A verso no-recursiva de fatorial deve ser clara. Ela usa um lao que execu-
tado de 1 a n e multiplica progressivamente cada nmero pelo produto mvel.
A principal vantagem das funes recursivas ser possvel utiliz-las para criar
verses mais claras e simples de vrios algoritmos.
A.2 Ordenao
A.2.1 Bolha
A ordenao mais conhecida (e mais difamada) a ordenao bolha. Sua po-
pularidade vem do seu nome fcil e de sua simplicidade. Porm, uma das pi-
ores ordenaes j concebidas.
A ordeno bolha uma ordenao por trocas. Ela envolve repetidas compa-
raes e, se necessrio, a troca de dois elementos adjacentes.
A ordenao bolha dirigida por dois loops. Dados que existem count ele-
mentos na matriz, o loop mais externo faz a matriz ser varrida count-1 vezes.
Isso garante, na pior hiptese, que todo elemento estar na posio correta
quando a funo terminar. O loop mais interno faz as comparaes e as trocas.
Essa verso da ordenao bolha pode ser utilizada para ordenar uma matriz de
caracteres em ordem ascendente. Por exemplo, o programa seguinte ordena
uma string.
242 Programando em C para Linux, Unix e Windows
#include <stdio.h>
#include <string.h>
void main(void)
{
char vetorb[]="3490bn09685lnv 3-49580bgojfog39458=9ugkj n098=526yh";
}
Programa A.4
A.2.2 Quicksort
A Quicksort, inventada e denomina por C.A.R. Hoare, considerada o melhor
algoritmo de ordenao de propsito geral atualmente disponvel. baseada
no mtodo de ordenao por trocas (mas muito superior em termos de de-
sempenho ordeno bolha).
Incio f e d a c b
Passo 1 b c a d e f
Esse processo , ento, repetido para cada seo isso , bca e def. Assim, o
processo essencialmente recursivo por natureza e, certamente, as implemen-
taes mais claras da Quicksort so algoritmos recursivos.
#include <stdio.h>
#include <string.h>
void main(void)
{
char vetorq[]="3490bn09685lnv 3-49580bgojfog39458=9ugkj n098=526yh";
A.3 Pesquisa
Bancos de dados existem para que, de tempos em tempos, um usurio possa
localizar o dado de um registro simplesmente digitando sua chave. H apenas
um mtodo para se encontrarem informaes em um arquivo (matriz) desor-
denado e um outro para um arquivo (matriz) ordenado.
Este programa pode ser adaptado para realizar pesquisas em qualquer tipo de
matriz (inteiros ou estruturas, por exemplo). Exemplo de utilizao das fun-
es.
#include <stdio.h>
#include <string.h>
void main(void)
{
int pos;
char vetors[]=".,/~2r=-dfx-950]gojftg394a8@ugkj n#26yh";
char vetorb[]=".,/~2r=-dfx-950]gojftg394a8@ugkj n#26yh";
246 Programando em C para Linux, Unix e Windows
printf("\nProcurando = binariamente");
pos = binary(vetorb, strlen(vetorb),'=');
printf("\n= encontrado na posicao %d\n", pos );
}
Programa A.9
Ajuda
Exemplos:
o Para ver as opes de compilao do gcc: man gcc
o Para ver como funciona a funo fopen do C: man fopen
o Para ver como funciona o comando man: man man
247
248 Programando em C para Linux, Unix e Windows
NAME
open, creat open and possibly create a file or device
DESCRIPTION
The open() system call is used to convert a pathname into a file
descriptor (a small, non-negative integer for use in subsequent I/O
as with read, write, etc.). When the call is successful, the file
descriptor returned will be the lowest file descriptor not currently
open for the process. This call creates a new open file, not shared
with any other process. (But shared open files may arise via the
fork(2) system call.) The new file descriptor is set to remain open
across exec functions (see fcntl(2)). The file offset is set to the
beginning of the file.
ERRORS
EEXIST pathname already exists and O_CREAT and O_EXCL were used.
EISDIR pathname refers to a directory and the access re-
quested involved writing (that is, O_WRONLY or O_RDWR is set).
Compilando no Linux
251
252 Programando em C para Linux, Unix e Windows
O libc (glibc) uma biblioteca usada por quase todos os programas do Linux;
o libjpeg uma biblioteca usada em todos os programas que trabalham com
o formato JPEG; e assim por diante. No sistema Linux essas bibliotecas so di-
vididas em dois pacotes: um para ser usado por programas j compilados
(glibc e libjpeg, por exemplo), e um para ser usado na compilao de pro-
gramas que dependem dele (glibc-devel e libjpeg-devel, por exemplo).
Portanto, para compilar programas mais complexos, ser necessrio ter esses
dois pacotes instalados.
exclui.o: exclui.c
gcc c exclui.c
consulta.o: cosulta.c
gcc c consulta.c
manipula.o: manipula.c
gcc c manipula.c
principal.o: principal.c
gcc c principal
del.o: del.c
gcc c del.c
main.o: main.c
gcc c main.c
254 Programando em C para Linux, Unix e Windows
Utilizando o LCC-Win32
Quem pode faz. Quem no pode ensina. Quem no sabe ensinar vira chefe.
(Annimo)
D.1 Instalao
Ele pode ser baixado gratuitamente em http://www.cs.virginia.edu/~lcc-win32/.
Sua instalao simples e rpida, bastando dar um duplo clique no executvel
lccwin32.exe. Os prximos passos iro auxili-lo a realizar a instalao.
255
256 Programando em C para Linux, Unix e Windows
4 Passo Licena de uso. A licena diz que o software pode ser utilizado para
fins pessoais ou didticos. Clique em Yes (Sim) para aceitar os termos de uso e
continuar com a instalao.
Agora voc j pode utilizar o programa para criar, compilar e executar os seus
programas.
Toda vez que voc for escrever um novo programa no LCC-Win32 , voc dever
criar um novo projeto. Nesse projeto voc poder incluir arquivos, modificar
propriedades da aplicao e at controlar a verso do seu programa, que o aju-
da a manter uma documentao sobre as mudanas ocorridas ao longo do de-
senvolvimento do projeto. Veja o manual do LCC-Win32 para maiores detalhes.
Agora que voc sabe o que significa um projeto, voc dever entender melhor
o procedimento exigido para a criao de um programa no LCC-Win32.
2 Passo Especifique o nome do projeto e o local onde ele vai ficar armaze-
nado. Depois clique em Create. Para fins de aprendizado, vamos trabalhar
somente com aplicaes de console (Console Aplication), ou seja, que iro
em uma tela parecida com a do sistema DOS.
4 Passo Agora temos que selecionar um arquivo que conter o nosso pro-
grama-fonte. Se voc no tiver criado este arquivo ainda, clique em Cance-
lar. Este tutorial assume que voc ainda no tem um programa pronto.
6 Passo O LCC-Win32 pergunta se voc tem certeza que quer gerar um pro-
jeto vazio (sem arquivos fontes). Confirme a operao clicando em Sim.
8 Passo Nesta tela voc configura onde ser gerado o seu programa executvel e
eventuais arquivos que devem ser linkados ao seu programa. Clique em Avanar.
9 Passo Aqui voc configura a fonte das aplicaes e os parmetros que se-
ro passados ao seu programas (recebidos na funo main, normalmente como
argv e argc). Clique em Concluir.
Parabns. O seu projeto est concludo. Agora temos que criar um programa
para incluir no projeto, compilar e executar.
Utilizando o LCC-Win32 267
4 Passo Agora temos que incluir o novo programa no projeto criado ante-
riormente. V at a opo Project do menu e selecione Add/Delete files...
Utilizando o LCC-Win32 269
das Funes
271
272 Programando em C para Linux, Unix e Windows
_exit Nvel: 2
Prottipo: void _exit(int status);
Retorno: No tem retorno. Header: #include <unistd.h>
Descrio: Termina o programa imediatamente, ou seja, o programa termina-
do e o controle passa automaticamente para o kernel do sistema
operacional.
abort Nvel: 3
Prottipo: void abort(void);
Retorno: No tem retorno. Header: #include <stdlib.h>
Descrio: Causa o trmino de um programa e causa o sinal SIGABRT.
abs Nvel: 3
Prottipo: int abs(int num);
Retorno: Nmero absoluto. Header: #include <stdlib.h>
Descrio: Devolve o nmero absoluto de um nmero.
accept Nvel: 2
Prottipo: int accept(int s, struct sockaddr *addr, socklen_t
*addrlen);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include
<sys/socket.h>
Descrio: Aceita uma conexo em um socket. usada com 'sockets' baseados
em conexo do tipos (SOCK_STREAM, SOCK_SEQPACKET e
SOCK_RDM)
access Nvel: 2
Prottipo: int access(const char *pathname, int mode);
Retorno: O se ok Header: #include <unistd.h>
-1 se houve algum erro
Descrio: Verifica as permisses de acesso de um arquivo.
acos Nvel: 3
Prottipo: double acos(double num);
Retorno: Arco co-seno ou erro de Header: #include <math.h>
domnio.
Descrio: Retorna arco co-seno do nmero, num deve estar entre 1 e 1.
Guia de Referncia das Funes 273
alarm Nvel: 2
Prottipo: unsigned int alarm(unsigned int seconds);
Retorno: 0 ou nsegundos setados Header: #include <unistd.h>
anteriormente.
Descrio: Envia o sinal SIGALRM para o processo aps ter passado os segun-
dos setados.
alloca Nvel: 3
Prottipo: char *alloca(int size);
Retorno: Ponteiro para a memria Header: #include <stdlib.h>
ou NULL em caso de erro.
Descrio: Alocao dinmica de memria. A memria liberada
automaticamente ao trmino da funo que a chamou, portanto a fun-
o free no deve ser chamada para liberar o espao de memria.
asctime Nvel: 3
Prottipo: char *asctime(const struct tm *tm);
Retorno: Ponteiro para string con- Header: #include <time.h>
tendo a data/hora.
Descrio: Retorna a data em formato string especificada pelo contedo da
struct tm.
asin Nvel: 3
Prottipo: double asin(double num);
Retorno: Arco seno ou erro de do- Header: #include <math.h>
mnio.
Descrio: Retorna arco seno do nmero, num deve estar entre 1 e 1.
assert Nvel: 3
Prottipo: void assert (int expression);
Retorno: No tem retorno. Header: #include <assert.h>
Descrio: Abortar a execuo do programa se a premissa for falsa.
atan Nvel: 3
Prottipo: double atan(double num);
Retorno: Arco tangente. Header: #include <math.h>
Descrio: Retorna arco tangente do nmero.
atexit Nvel: 3
Prottipo: int atexit(void (*function)(void));
Retorno: 0 se OK Header: #include <stdlib.h>
!= 0 se houve erro.
Descrio: Registra funes para serem executadas aps o trmino normal de
um programa.
274 Programando em C para Linux, Unix e Windows
atof Nvel: 3
Prottipo: double atof(const char *str);
Retorno: Nmero real. Header: #include <stdlib.h>
Descrio: Converte uma string para um nmero do tipo double.
atoi Nvel: 3
Prottipo: int atoi(const char *str);
Retorno: Nmero inteiro. Header: #include <stdlib.h>
Descrio: Converte uma string para um nmero do tipo int.
atol Nvel: 3
Prottipo: long atol(const char *str);
Retorno: Nmero inteiro. Header: #include <stdlib.h>
Descrio: Converte uma string para um nmero do tipo long.
atoll Nvel: 3
Prottipo: long long atoll(const char *nptr);
Retorno: Nmero inteiro. Header: #include <stdlib.h>
Descrio: Converte uma string para um nmero do tipo long long.
basename Nvel: 3
Prottipo: char *basename(char *path);
Retorno: Ponteiro para string Header: #include <libgen.h>
Descrio: Manipulao (parse) de nome de arquivos. Captura o nome do arquivo
a partir do caminho completo.
bind Nvel: 2
Prottipo: int bind(int sockfd, struct sockaddr *my_addr, sock-
len_t addrlen);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include
<sys/socket.h>
Descrio: Associa um nome a um socket.
bsearch Nvel: 3
Prottipo: void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size, int (*compar)(const void
*, const void *));
Retorno: Ponteiro para o item Header: #include <stdlib.h>
NULL se no achar
Descrio: Busca um item semelhante ao indicado por key num vetor com nmemb
itens iniciado no endereo indicado por base. Os itens tm tamanho
size.
Guia de Referncia das Funes 275
calloc Nvel: 3
Prottipo: void *calloc(size_t nmemb, size_t size);
Retorno: Ponteiro para a memria Header: #include <stdlib.h>
ou NULL em caso de erro.
Descrio: Alocao dinmica de memria.
cbrt Nvel: 3
Prottipo: double cbrt( double x );
Retorno: Raiz cbica. Header: #include <math.h>
Descrio: Retorna a raiz cbica.
ceil Nvel: 3
Prottipo: double ceil(double num);
Retorno: Menor nmero possvel Header: #include <math.h>
maior que num.
Descrio: Menor nmero possvel que no seja menor que nmero, por exem-
plo, ceil(1.03) devolver 2.0.
chdir Nvel: 2
Prottipo: int chdir(const char *path);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Mudana do diretrio de trabalho.
chmod Nvel: 2
Prottipo: int chmod(const char *path, mode_t mode);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/stat.h>
Descrio: Mudana de permisses de um arquivo.
chown Nvel: 2
Prottipo: int chown(const char *path, uid_t owner, gid_t group);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Muda o usurio (owner) de um arquivo.
chroot Nvel: 2
Prottipo: int chroot(const char *path);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Altera o diretrio raiz para aquele especificado.
clearerr Nvel: 3
Prottipo: void clearerr(FILE *stream);
Retorno: No tem retorno. Header: #include <stdio.h>
Descrio: Limpa os indicadores de erro de um arquivo.
276 Programando em C para Linux, Unix e Windows
clearenv Nvel: 3
Prottipo: int clearenv(void);
Retorno: 0 se OK Header: #include <stdlib.h>
-1 se houve erro.
Descrio: Elimina/apaga todas as variveis de ambiente e seu contedo.
clock Nvel: 3
Prottipo: clock_t clock(void);
Retorno: O tempo de CPU usado Header: #include <time.h>
no formato clock_t.
Descrio: Retorna uma aproximao do tempo de processamento usado pelo
programa. Para obter o nmero de segundos, divida por
CLOCKS_PER_SEC.
close Nvel: 2
Prottipo: int close(int fd);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Fecha o arquivo apontado por fd (aberto por open).
closedir Nvel: 3
Prottipo: int closedir(DIR *dir);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <dirent.h>
Descrio: Fecha um diretrio (aberto por opendir)
closelog Nvel: 3
Prottipo: void closelog(void);
Retorno: No tem retorno. Header: #include <syslog.h>
Descrio: Fecha o descritor para envio de logs (ver syslog).
connect Nvel: 3
Prottipo: int connect(int sockfd, const struct sockaddr
*serv_addr, socklen_t addrlen);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include
<sys/socket.h>
Descrio: Inicializa uma conexo socket.
copysign Nvel: 3
Prottipo: double copysign(double x, double y);
Retorno: Nmero. Header:
Descrio: Retorna um valor cujo valor absoluto igual a x, mas cujo sinal
igual ao de y.
Guia de Referncia das Funes 277
cos Nvel: 3
Prottipo: double cos(double num);
Retorno: Co-seno. Header: #include <math.h>
Descrio: Devolve o co-seno do nmero. O nmero deve estar em radianos.
creat Nvel: 2
Prottipo: int creat(const char *pathname, mode_t mode);
Retorno: >0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/stat.h>
#include <fcntl.h>
Descrio: Cria e abre um arquivo.
crypt Nvel: 3
Prottipo: char *crypt(const char *key, const char *salt);
Retorno: String criptografada. Header: #include <unistd.h>
Descrio: a funo de encriptao de senhas. baseada no algoritmo DES.
ctermid Nvel: 3
Prottipo: char *ctermid(char *s);
Retorno: Ponteiro para o terminal. Header: #include <stdio.h>
Descrio: Obtm o nome do terminal controlador.
ctime Nvel: 3
Prottipo: char *ctime(const time_t *timep);
Retorno: Ponteiro para string con- Header: #include <time.h>
tendo a data/hora.
Descrio: Retorna uma string com a data/hora.
cuserid Nvel: 3
Prottipo: char *cuserid(char *string);
Retorno: Ponteiro para string. Header: #include <stdio.h>
Descrio: Retorna o nome do usrio do processo.
daemon Nvel: 3
Prottipo: int daemon (int nochdir, int noclose);
Retorno: -1 se houver erro. Header: #include <unistd.h>
Descrio: Desvincula o programa do terminal controlador e o faz executar em
background como um daemon.
difftime Nvel: 3
Prottipo: double difftime(time_t time1, time_t time0);
Retorno: Diferena em segundos. Header: #include <time.h>
Descrio: Retorna o nmero de segundos transcorridos entre time1 e time0.
278 Programando em C para Linux, Unix e Windows
dirname Nvel: 3
Prottipo: char *dirname(char *path);
Retorno: Ponteiro para string. Header: #include <libgen.h>
Descrio: Manipulao (parse) de nomes de arquivos. Retorna o nome do dire-
trio de um nome completo de um arquivo.
div Nvel: 3
Prottipo: div_t div(int numer, int denom);
Retorno: Estrutura div_t com os Header: #include <stdlib.h>
valores calculados.
Descrio: Calcula o resto e o quociente de uma diviso de inteiros.
dup Nvel: 2
Prottipo: int dup(int oldfd);
Retorno: >0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Retorna um novo descritor para o arquivo.
dup2 Nvel: 2
Prottipo: int dup2(int oldfd, int newfd);
Retorno: >0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Retorna um novo descritor (apontado por newfd) para o arquivo.
endgrent Nvel: 3
Prottipo: void endgrent(void);
Retorno: No tem retorno. Header: #include <sys/types.h>
#include <grp.h>
Descrio: Fecha o arquivo /etc/group.
endpwent Nvel: 3
Prottipo: void endpwent(void);
Retorno: No tem retorno. Header: #include <sys/types.h>
#include <pwd.h>
Descrio: Fecha o arquivo /etc/passwd.
execl Nvel: 3
Prottipo: int execl(const char *path, const char *arg, ...);
Retorno: Se retornar, um int espe- Header: #include <unistd.h>
cificando o erro.
Descrio: Substitui o processo atual por um novo processo a ser carregado
(passado como parmetro).
Guia de Referncia das Funes 279
execle Nvel: 3
Prottipo: int execle(const char *path, const char *arg ,
..., char * const envp[]);
Retorno: Se retornar, um int espe- Header: #include <unistd.h>
cificando o erro.
Descrio: Substitui o processo atual por um novo processo a ser carregado
(passado como parmetro).
execlp Nvel: 3
Prottipo: int execlp(const char *file, const char *arg, ...);
Retorno: Se retornar, um int espe- Header: #include <unistd.h>
cificando o erro.
Descrio: Substitui o processo atual por um novo processo a ser carregado
(passado como parmetro).
execv Nvel: 3
Prottipo: int execv(const char *path, char *const argv[]);
Retorno: Se retornar, um int espe- Header: #include <unistd.h>
cificando o erro.
Descrio: Substitui o processo atual por um novo processo a ser carregado
(passado como parmetro).
execve Nvel: 2
Prottipo: int execve(const char *filename, char *const
argv [], char *const envp[]);
Retorno: Se retornar, um int espe- Header: #include <unistd.h>
cificando o erro.
Descrio: Substitui o processo atual por um novo processo a ser carregado
(passado como parmetro).
execvp Nvel: 3
Prottipo: int execvp(const char *file, char *const argv[]);
Retorno: Se retornar, um int espe- Header: #include <unistd.h>
cificando o erro.
Descrio: Substitui o processo atual por um novo processo a ser carregado
(passado como parmetro).
exit Nvel: 3
Prottipo: void exit(int status);
Retorno: No tem retorno. Header: #include <stdlib.h>
Descrio: Termina o programa. Arquivos abertos sero fechados, buffers des-
carregados e funes cadastradas atravs da funo atexit sero
executadas. Somente aps todos esses passos o controle passa para
o kernel do sistema operacional.
280 Programando em C para Linux, Unix e Windows
exp Nvel: 3
Prottipo: double exp(double num);
Retorno: Logaritmo natural Header: #include <math.h>
Descrio: Devolve logaritmo natural e elevado potncia de nmero.
fabs Nvel: 3
Prottipo: double fabs(double num);
Retorno: Valor absoluto. Header: #include <math.h>
Descrio: Devolve o valor absoluto de nmero.
fchdir Nvel: 2
Prottipo: int fchdir(int fd);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Mudana de diretrio, idntica funo chdir, somente utilizado
um identificador de arquivo para o diretrio.
fchmod Nvel: 2
Prottipo: int fchmod(int fildes, mode_t mode);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro. #include <sys/stat.h>
Descrio: Mudana de permisses de um arquivo, idntica funo chmod, so-
mente utilizado um identificador de arquivo.
fchown Nvel: 2
Prottipo: int fchown(int fd, uid_t owner, gid_t group);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro. #include <unistd.h>
Descrio: Mudana de usurio/grupo de um arquivo, idntica funo chown,
somente utilizado um identificador de arquivo.
fclose Nvel: 3
Prottipo: int fclose(FILE *stream);
Retorno: 0 se OK Header: #include <stdio.h>
EOF se houve erro.
Descrio: Fecha um arquivo.
fcntl Nvel: 2
Prottipo: int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
Retorno: -1 se ouve erro Header: #include <unistd.h>
Depende de cmd se OK #include <fcntl.h>
Descrio: Realiza vrias permisses em um arquivo (indicado pelo descritor do
arquivo). As operaes sero determinadas por cmd.
Guia de Referncia das Funes 281
fdopen Nvel: 3
Prottipo: FILE * fdopen (int FileDescriptor, const char *type)
Retorno: Ponteiro para FILE (OK) Header: #include <stdio.h>
NULL (Erro)
Descrio: Transforma um descritor de arquivo (aberto com as funes de nvel
2, como open, por exemplo) em um ponteiro para FILE.
feof Nvel: 3
Prottipo: int feof(FILE *stream);
Retorno: !=0 se o final do arquivo foi Header: #include <stdio.h>
alcanado
0 se no
Descrio: Verifica se o final do arquivo foi alcanado.
ferror Nvel: 3
Prottipo: int ferror(FILE *stream);
Retorno: !=0 se existe erro Header: #include <stdio.h>
0 se no
Descrio: Verifica se existe algum erro no arquivo.
fflush Nvel: 3
Prottipo: int fflush(FILE *stream);
Retorno: 0 se OK Header: #include <stdio.h>
EOF se houve erro.
Descrio: Fora o descarregamento do buffer de gravao de um arquivo.
fgetc Nvel: 3
Prottipo: int fgetc(FILE *stream);
Retorno: Caractere se OK Header: #include <stdio.h>
EOF se houve erro ou o fi-
nal do arquivo foi alcana-
do.
Descrio: L um caractere do arquivo.
fgetgrent Nvel: 3
Prottipo: struct group *fgetgrent(FILE *stream);
Retorno: Ponteiro para estrutura Header: #include <stdio.h>
NULL se no existem mais #include <sys/types.h>
grupos ou se ocorreu um #include <grp.h>
erro.
Descrio: Ponteiro para a estrutura de grupo (/etc/group).
282 Programando em C para Linux, Unix e Windows
fgetpwen Nvel: 3
Prottipo: struct passwd *fgetpwent(FILE *stream);
Retorno: Ponteiro para estrutura Header: #include <stdio.h>
NULL se no existe mais #include <sys/types.h>
usurio ou se ocorreu um #include <pwd.h>
erro.
Descrio: Ponteiro para a estrutura de usurios/senhas (/etc/passwd).
fgetpos Nvel: 3
Prottipo: int fgetpos(FILE *stream, fpos_t *pos);
Retorno: 0 se OK Header: #include <stdio.h>
!= 0 seno
Descrio: Retorna a posio atual do arquivo. Equivalente funo ftell.
fgets Nvel: 3
Prottipo: char *fgets(char *s, int size, FILE *stream);
Retorno: NULL em caso de erro Header: #include <stdio.h>
Ponteiro para os dados lidos.
Descrio: Leitura de dados do arquivo.
fileno Nvel: 3
Prottipo: int fileno(FILE *stream);
Retorno: Descritor do arquivo (int) Header: #include <stdio.h>
associado ao stream.
Descrio: Retorna o descritor do arquivo (em formato de um inteiro e como uti-
lizado nas funes de nvel 2) associado ao stream indicado.
flock Nvel: 2
Prottipo: int flock(int fd, int operation);
Retorno: 0 se OK Header: #include <sys/file.h>
-1 se houve erro.
Descrio: Aplica ou remove uma trava no arquivo.
floor Nvel: 3
Prottipo: Double floor(double num);
Retorno: Maior nmero possvel me- Header: #include <math.h>
nor que num.
Descrio: Devolve o maior nmero possvel que no seja maior que nmero, por
exemplo, floor(1.4) retornar 1.0.
fopen Nvel: 3
Prottipo: FILE * fopen(const char *path, const char *type)
Retorno: Ponteiro para FILE (OK) Header: #include <stdio.h>
NULL (Erro)
Descrio: Abre um arquivo e retorna uma stream do tipo FILE para o arquivo
aberto.
Guia de Referncia das Funes 283
fopen64 Nvel: 3
Prottipo: FILE * fopen64(const char *path, const char *type)
Retorno: Ponteiro para FILE (OK) Header: #include <stdio.h>
NULL (Erro)
Descrio: Abre um arquivo e retorna uma stream do tipo FILE para o arquivo
aberto.
fork Nvel: 2
Prottipo: pid_t fork(void);
Retorno: PID se OK Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Cria um processo filho idntico ao pai.
fpathconf Nvel: 3
Prottipo: long fpathconf(int filedes, int name);
Retorno: -1 se houve erro Header: #include <unistd.h>
!=0 se OK (depende de
name)
Descrio: Retorna informaes referentes configurao do arquivo.
fprintf Nvel: 3
Prottipo: int fprintf (FILE *stream, const char *format,
[value, . . .])
Retorno: >0 se OK Header: #include <stdio.h>
<0 em caso de erro
Descrio: Formata uma sada e grava em arquivo apontado por stream.
fputc Nvel: 3
Prottipo: int fputc(int c, FILE *stream);
Retorno: Prprio caractere se OK Header: #include <stdio.h>
EOF se houve erro
Descrio: Grava um caractere no arquivo.
fputs Nvel: 3
Prottipo: int fputs(const char *s, FILE *stream);
Retorno: >0 se OK Header: #include <stdio.h>
EOF se houve erro.
Descrio: Grava uma string no arquivo.
fread Nvel: 3
Prottipo: size_t fread ( (const void *) pointer, size_t size,
size_t NumberOfItems, FILE * stream)
Retorno: Nmero de bytes lidos. Header: #include <stdio.h>
Descrio: Realiza a leitura de bytes (size * NumberOfItems) de um arquivo.
284 Programando em C para Linux, Unix e Windows
free Nvel: 3
Prottipo: void free(void *ptr)
Retorno: No tem retorno. Header: #include <stdlib.h>
Descrio: Libera espao previamente alocado com malloc, realloc ou cal-
loc.
freopen Nvel: 3
Prottipo: FILE * freopen ( const char *path, const char *type,
FILE * stream)
Retorno: Ponteiro para FILE (OK) Header: #include <stdio.h>
NULL (Erro)
Descrio: Abre outro arquivo e associa a uma stream do tipo FILE de um ar-
quivo j aberto.
freopen64 Nvel: 3
Prottipo: FILE * freopen64 ( const char *path, const char
*type, FILE * stream)
Retorno: Ponteiro para FILE (OK) Header: #include <stdio.h>
NULL (Erro)
Descrio: Abre outro arquivo e associa a uma stream do tipo FILE de um ar-
quivo j aberto.
fscanf Nvel: 3
Prottipo: int fscanf(FILE *stream, const char *format, ...);
Retorno: Quantidade de dados lidos. Header: #include <stdio.h>
EOF se erro
Descrio: L as informaes de um arquivo de acordo com os parmetros pas-
sados (como na funo scanf).
fseek Nvel: 3
Prottipo: int fseek(FILE *stream, long offset, int whence);
Retorno: 0 se OK Header: #include <stdio.h>
!=0 se houve erro.
Descrio: Posiciona o ponteiro do arquivo dentro do arquivo especificado.
fsetpos Nvel: 3
Prottipo: int fsetpos(FILE *stream, fpos_t *pos);
Retorno: 0 se OK Header: #include <stdio.h>
!=0 se houve erro.
Descrio: Posiciona o ponteiro do arquivo. Equivalente funo fseek passan-
do o parmetro SEEK_SET.
Guia de Referncia das Funes 285
fstat Nvel: 2
Prottipo: int fstat(int filedes, struct stat *buf);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro. #include <sys/stat.h>
#include <unistd.h>
Descrio: Retorna informaes (atributos) a respeito do arquivo.
fsync Nvel: 2
Prottipo: int fsync(int fd);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Sincroniza um arquivo (totalmente) em disco.
ftell Nvel: 3
Prottipo: long ftell(FILE *stream);
Retorno: Posio atual do arquivo. Header: #include <stdio.h>
-1L se houve erro
Descrio: Retorna a posio atual do ponteiro dentro do arquivo em bytes (em
forma de um long) .
ftime Nvel: 3
Prottipo: int ftime(struct timeb *tp);
Retorno: Sempre 0. Header: #include <sys/timeb.h>
Descrio: Retorna a data e hora corrente no ponteiro passado.
ftruncate Nvel: 2
Prottipo: int ftruncate(int fd, off_t length);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro. #include <sys/types.h>
Descrio: Trunca o arquivo para o tamanho especificado.
fwrite Nvel: 3
Prottipo: size_t fwrite(const void pointer, size_t size,
size_t NumberOfItems, FILE * stream)
Retorno: Nmero de bytes gravados. Header: #include <stdio.h>
Descrio: Realiza a gravao de bytes em um arquivo.
getc Nvel: 3
Prottipo: int getc(FILE *stream);
Retorno: Caractere se OK Header: #include <stdio.h>
EOF se houve erro ou o fi-
nal do arquivo foi alcana-
do.
Descrio: L um caractere do arquivo (equivalente funo fgetc).
286 Programando em C para Linux, Unix e Windows
getchar Nvel: 3
Prottipo: int getchar(void);
Retorno: Caractere se OK Header: #include <stdio.h>
EOF se houve erro ou o final
do arquivo foi alcanado.
Descrio: L um caractere da entrada padro.
getcwd Nvel: 3
Prottipo: char *getcwd(char *buf, size_t size);
Retorno: Ponteiro para dados lidos Header: #include <unistd.h>
NULL em caso de erro
Descrio: Recupera o nome do completo para o diretrio de trabalho atual.
getdate Nvel: 3
Prottipo: struct tm *getdate (const char *string);
Retorno: Estrutura para data Header: #include <time.h>
NULL se houve erro
Descrio: Retorna uma estrutura tm para string de data passada.
getegid Nvel: 2
Prottipo: gid_t getegid (void);
Retorno: Nmero do GID Header: #include <unistd.h>
#include <sys/types.h>
Descrio: Retorna o nmero do GID do grupo efetivo que est executando o
processo.
getenv Nvel: 3
Prottipo: char *getenv(const char *name;)
Retorno: Ponteiro para o contedo Header: #include <stdlib.h>
da varivel NULL se a vari-
vel no existir
Descrio: Retorna o contedo de um varivel de ambiente.
geteuid Nvel: 2
Prottipo: uid_t geteuid(void);
Retorno: Nmero do UID Header: #include <sys/types.h>
#include <unistd.h>
Descrio: Retorna o nmero do UID do usurio efetivo que est executando o
processo.
getgid Nvel: 2
Prottipo: gid_t getgid (void);
Retorno: Nmero do GID Header: #include <unistd.h>
#include <sys/types.h>
Descrio: Retorna o nmero do GID do grupo real que est executando o pro-
cesso.
Guia de Referncia das Funes 287
getgrent Nvel: 3
Prottipo: struct group *getgrent(void);
Retorno: Estrutura de grupos Header: #include <sys/types.h>
#include <grp.h>
Descrio: Retorna as informaes do arquivo /etc/group em uma estrutura
(na forma de um ponteiro).
getgrgid Nvel: 3
Prottipo: struct group *getgrgid(gid_t GID)
Retorno: Ponteiro para estrutura Header: #include <sys/types.h>
NULL se o grupo no exis- #include <grp.h>
tir ou no estiver dispon-
vel
Descrio: Retorna as informaes de um grupo especfico a partir do nmero do
GID. As informaes so retiradas do arquivo /etc/group.
getgrnam Nvel: 3
Prottipo: struct group *getgrnam(const char * name)
Retorno: Ponteiro para estrutura Header: #include <sys/types.h>
NULL se o grupo no exis- #include <grp.h>
tir ou no estiver dispon-
vel
Descrio: Retorna as informaes de um grupo especfico a partir do seu nome.
As informaes so retiradas do arquivo /etc/group.
getgroups Nvel: 2
Prottipo: int getgroups(int ngroups, gid_t GIDSet)
Retorno: # de grupos Header: #include <sys/types.h>
-1 se erro #include <unistd.h>
Descrio: Retorna os GIDs (em GIDSet) dos grupos suplementares de um pro-
cesso.
gethostid Nvel: 2
Prottipo: long gethostid(void);
Retorno: Indentificador do host Header: #include <unistd.h>
Descrio: Retorna o identificador nico do host.
gethostname Nvel: 2
Prottipo: int gethostname(char * name, int length)
Retorno: 0 se OK Header: #include <unistd.h>
-1 se erro
Descrio: Retorna o nome do host da mquina. O tamanho do nome limitado
por length.
288 Programando em C para Linux, Unix e Windows
getlogin Nvel: 3
Prottipo: char *getlogin (void)
Retorno: Ponteiro para o login Header: #include <sys/types.h>
NULL se houve erro. #include <unistd.h>
#include <limits.h>
Descrio: Retorna o login name do usurio que est executando o processo.
getlogin_r Nvel: 3
Prottipo: int getlogin_r(char * name, size_t length);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro. #include <unistd.h>
#include <limits.h>
Descrio: Retorna o login name do usurio a partir do arquivo /etc/utmp. Indica-
do para processos multi-thread.
getmsg Nvel: 2
Prottipo: int getmsg (int fd, struct strbuf *ctlptr, struct
strbuf *dataptr, int *flags);
Retorno: >1 se OK Header: #include <stropts.h>
-1 se houve erro
Descrio: L as mensagens da fila de um arquivo.
getopt Nvel: 3
Prottipo: int getopt(int argc, char * const argv[], const char
*optstring);
Retorno: Opo pesquisada Header: #include <unistd.h>
: se uma opo foi achada
mas exige parmetro
? se a opo for desconhe-
cida
-1 se o final da lista foi al-
canado
Descrio: Pega os parmetros (passados como opes) na linha de comando.
getpeername Nvel: 2
Prottipo: int getpeername(int s, struct sockaddr *name, sock-
len_t *namelen);
Retorno: 0 se OK Header: #include
-1 se houve erro <sys/socket.h>
Descrio: Captura o nome do ponto conectado ao socket.
getpgid Nvel: 2
Prottipo: pid_t getpgid(pid_t pid);
Retorno: Process Group ID Header: #include <unistd.h>
Descrio: Retorna o nmero de identificao do grupo para o processo especifi-
cado.
Guia de Referncia das Funes 289
getpgrp Nvel: 2
Prottipo: pid_t getpgrp (void);
Retorno: Nmero GID. Header: #include <unistd.h>
Descrio: Retorna o nmero do GID de grupo do processo.
getpid Nvel: 2
Prottipo: pid_t getpid(void);
Retorno: Nmero do PID. Header: #include <sys/types.h>
#include <unistd.h>
Descrio: Retorna o nmero do processo.
getpmsg Nvel: 3
Prottipo: int getpmsg (int fd, struct strbuf *ctlptr, struct
strbuf *dataptr, int *bandp, int *flags);
Retorno: >1 se OK Header: #include <stropts.h>
-1 se houve erro.
Descrio: L as mensagens da fila de um arquivo. Idntico a getmsg, exceto
que especificada a prioridade da mensagem que ser quer ler.
getppid Nvel: 2
Prottipo: pid_t getppid (void);
Retorno: Nmero PID. Header: #include <sys/types.h>
#include <unistd.h>
Descrio: Retorna o PPID (PID do processo pai) do processo corrente.
getpwent Nvel: 3
Prottipo: struct passwd *getpwent (void);
Retorno: Ponteiro para estrutura Header: #include <sys/types.h>
NULL se houve erro ou o #include <pwd.h>
final do arquivo foi alcan-
ado.
Descrio: Retorna as informaes do prximo usurio (informaes so retiradas
de /etc/passwd)
getpwnam Nvel: 3
Prottipo: struct passwd *getpwnam(char *name)
Retorno: Ponteiro se OK Header: #include <sys/types.h>
NULL se houve erro #include <pwd.h>
Descrio: Retorna as informaes do usurio especificado em name (informa-
es so retiradas de /etc/passwd).
290 Programando em C para Linux, Unix e Windows
getpwuid Nvel: 3
Prottipo: struct passwd *getpwuid(uid_t uid);
Retorno: Ponteiro se OK Header: #include <sys/types.h>
NULL se houve erro #include <pwd.h>
Descrio: Retorna as informaes do usurio especificado em uid (informaes
so retiradas de /etc/passwd).
gets Nvel: 3
Prottipo: char *gets(char * string)
Retorno: String se OK Header: #include <stdio.h>
NULL se houve erro ou se
o final do arquivo foi
alcanado.
Descrio: L os dados da entrada padro (stdin) e guarda na string.
getsid Nvel: 2
Prottipo: pid_t getsid(pid_t pid);
Retorno: ID se OK Header: #include <unistd.h>
-1 se houve erro.
Descrio: Retorna o ID de seo do processo.
getsockname Nvel: 2
Prottipo: int getsockname(int s, struct sockaddr * name,
socklen_t * namelen);
Retorno: 0 se OK Header: #include
-1 se houve erro <sys/socket.h>
Descrio: Retorna o nome de um socket.
gmtime Nvel: 3
Prottipo: struct tm *gmtime(time_t *time)
Retorno: Ponteiro para a estrutura. Header: #include <time.h>
Descrio: Retorna uma estrutura com as informaes referentes a data/hora a
partir da hora informada (hora informada em formato long)
gettimeofday Nvel: 2
Prottipo: int gettimeofday(struct timeval *tv, struct time-
zone *tz);
Retorno: 0 se OK Header: #include <sys/time.h>
-1 se houve.
Descrio: Retorna hora do sistema.
getuid Nvel: 2
Prottipo: uid_t getuid(void);
Retorno: Nmero do UID Header: #include <sys/types.h>
#include <unistd.h>
Descrio: Retorna o UID do usurio que est executando o processo.
Guia de Referncia das Funes 291
getumask Nvel: 3
Prottipo: mode_t getumask(void);
Retorno: Mscara padro. Header: #include <sys/types.h>
#include <sys/stat.h>
Descrio: Retorna a mscara padro para criao de arquivos.
initgroups Nvel: 3
Prottipo: int initgroups(char *user, int GID)
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro. #include <sys/types.h>
isalnum Nvel: 3
Prottipo: int isalnum(int ch);
Retorno: !=0 se ch for letra Header: #include <ctype.h>
!=0 se ch for dgito
0 se ch no for alfanumri-
co
Descrio: Verifica se um caractere alfanumrico ou no.
isalpha Nvel: 3
Prottipo: int isalpha(int ch);
Retorno: !=0 se for uma letra Header: #include <ctype.h>
0 se no for uma letra
Descrio: Verifica se um caractere uma letra. Na lngua portuguesa de Aa at
Zz.
iscntrl Nvel: 3
Prottipo: int iscntrl(int ch)
Retorno: !=0 se for um caractere de Header: #include <ctype.h>
controle
0 se no for um caractere
de controle
Descrio: Verifica se um caractere um caractere de controle entre 0 e 0x1F ou
0x7F (DEL).
isdigit Nvel: 3
Prottipo: int isdigit(int ch);
Retorno: !=0 se for dgito Header: #include <ctype.h>
0 se no for dgito
Descrio: Verifica se um caractere dgito (entre 0 e 9).
292 Programando em C para Linux, Unix e Windows
isgraph Nvel: 3
Prottipo: int isgraph(int ch);
Retorno: !=0 se pode ser impresso Header: #include <ctype.h>
0 se no pode ser impresso
Descrio: Verifica se um caractere pode ser impresso (depende do sistema ope-
racional). Exclui o espao.
islower Nvel: 3
Prottipo: int islower
Retorno: !=0 se minscula Header: #include <ctype.h>
0 se no
Descrio: Verifica se um caractere (letra) minscula ou no.
isprint Nvel: 3
Prottipo: int isprint(int ch);
Retorno: !=0 se pode ser impresso Header: #include <ctype.h>
0 se no pode ser impresso
Descrio: Verifica se um caractere pode ser impresso (depende do sistema ope-
racional). Inclui o espao.
ispunct Nvel: 3
Prottipo: int ispunct(int ch);
Retorno: !=0 se for pontuao Header: #include <ctype.h>
0 se no.
Descrio: Verifica se um caractere um caractere de pontuao.
isspace Nvel: 3
Prottipo: int isspace(int ch);
Retorno: !=0 se for um espao Header: #include <ctype.h>
0 se no
Descrio: Verifica se o caractere espao, tabulao, caractere de nova linha
ou retorno de carro.
isupper Nvel: 3
Prottipo: int isupper(int ch);
Retorno: !=0 se maiscula Header: #include <ctype.h>
0 se no
Descrio: Verifica se um caractere (letra) maiscula.
isxdigit Nvel: 3
Prottipo: int isxdigit(int ch);
Retorno: !=0 se for digtio Header: #include <ctype.h>
0 se no for
Descrio: Verifica se o caractere um digto hexadecimal (0 at 9 e A at F).
Guia de Referncia das Funes 293
kill Nvel: 2
Prottipo: int kill(int process, int signal);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro. #include <signal.h>
Descrio: Envia um sinal para o processo.
killpg Nvel: 2
Prottipo: int killpg(int pgrp, int sig);
Retorno: 0 se OK Header: #include <signal.h>
-1 se houve erro.
Descrio: Envia um sinal para um grupo de processos. Deve especificar o grupo
de processo em pgrp.
labs Nvel: 3
Prottipo: long labs(long num);
Retorno: Nmero absoluto. Header: #include <stdlib.h>
Descrio: Devolve o nmero absoluto de um nmero.
llabs Nvel: 3
Prottipo: long long int llabs(long long int j);
Retorno: Nmero absoluto. Header: #include <stdlib.h>
Descrio: Devolve o nmero absoluto de um nmero.
lchown Nvel: 2
Prottipo: int lchown (const char *path, uid_t owner, gid_t
group);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Muda usurio/grupo de um link simblico (mesmo que chown).
link Nvel: 2
Prottipo: int link(const char *path1, const char *path2);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Cria um hard link para o arquivo.
listen Nvel: 2
Prottipo: int listen(int s, int backlog);
Retorno: 0 se OK Header: #include
-1 se houve erro <sys/socket.h>
Descrio: Habilita conexes para um socket.
294 Programando em C para Linux, Unix e Windows
localtime Nvel: 3
Prottipo: Struct tm *localtime(const time_t * time);
Retorno: Ponteiro para estrutura. Header: #include <time.h>
Descrio: Retorna uma estrutura com as informaes referentes a data/hora a
partir da hora informada (hora informada em formato long)
log Nvel: 3
Prottipo: Double log(double num);
Retorno: Logaritmo natural. Header: #include <math.h>
Descrio: Devolve o logaritmo natural do nmero. O nmero no pode ser nega-
tivo.
log10 Nvel: 3
Prottipo: Double log10(double num);
Retorno: Logaritmo base de num. Header: #include <math.h>
Descrio: Retorna o logartmo de base 10 do nmero. O nmero no pode ser
negativo.
login Nvel: 3
Prottipo: void login(const struct utmp *ut);
Retorno: No tem retorno. Header: #include <utmp.h>
Descrio: Informa que um usurio se conectou (grava informaes em
/var/run/utmp e /var/log/wtmp).
logout Nvel: 3
Prottipo: int logout(const char *ut_line);
Retorno: 1 se OK Header: #include <utmp.h>
0 se houve erro
Descrio: Informa que um usurio se desconectou (grava informaes em
/var/run/utmp e /var/log/wtmp).
lseek Nvel: 2
Prottipo: off_t lseek (int fd, off_t offset, int whence)
Retorno: Nova posio do arquivo Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Posiciona o ponteiro de leitura/gravao dentro do arquivo (equivalen-
te a fseek).
lseek64 Nvel: 2
Prottipo: off64_t lseek64 (int fd, off64_t offset, int whence)
Retorno: Nova posio do arquivo Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Posiciona o ponteiro de leitura/gravao dentro do arquivo (equivalen-
te a fseek).
Guia de Referncia das Funes 295
lstat Nvel: 2
Prottipo: int lstat(const char *path, Buffer)
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/stat.h>
#include <unistd.h>
Descrio: Obtm informaes (atributos, hora de criao etc.) de um link simb-
lico.
malloc Nvel: 3
Prottipo: void *malloc(size_t size);
Retorno: Ponteiro para a memria Header: #include <stdlib.h>
ou NULL em caso de erro.
Descrio: Alocao dinmica de memria.
memchr Nvel: 3
Prottipo: void *memchr(const void *s, int c, size_t n);
Retorno: Ponteiro para o byte en- Header: #include <string.h>
contrado
NULL se no foi encontra-
do.
Descrio: Procura um caractere nos primeiros n bytes da string.
memcmp Nvel: 3
Prottipo: int memcmp(const void *s1, const void *s2, size_t n);
Retorno: 0 se as strings so iguais Header: #include <string.h>
<0 se s1 < s2
>0 se s1 > s2
Descrio: Compara n bytes entre duas strings.
memcpy Nvel: 3
Prottipo: void *memcpy(void *dest, const void *src, size_t n);
Retorno: Ponteiro para dest Header: #include <string.h>
Descrio: Copia n bytes da origem para o destino.
memmove Nvel: 3
Prottipo: void *memmove(void *dest, const void *src, size_t n);
Retorno: Ponteiro para dest Header: #include <string.h>
Descrio: Copia n bytes da origem para o destino.
memset Nvel: 3
Prottipo: void *memset(void *s, int c, size_t n);
Retorno: Ponteiro para s Header: #include <string.h>
Descrio: Preenche o ponteiro passado (nos n primeiros bytes) com o caractere
informado.
296 Programando em C para Linux, Unix e Windows
mkdtemp Nvel: 3
Prottipo: char *mkdtemp(char *template);
Retorno: Ponteiro para string Header: #include <stdlib.h>
NULL se houve erro.
Descrio: Cria um diretrio temporrio nico no sistema de arquivos.
mkdir Nvel: 2
Prottipo: int mkdir(const char *path, mode_t mode)
Retorno: 0 se OK Header: #include <sys/stat.h>
-1 se houve erro #include <sys/types.h>
Descrio: Cria um diretrio no sistema de arquivos.
mkfifo Nvel: 3
Prottipo: int mkfifo (const char *path, mode_t mode)
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/stat.h>
Descrio: Cria um FIFO (first-in-first-out) no sistema de arquivos.
mknod Nvel: 2
Prottipo: int mknod(const char *pathname, mode_t mode, dev_t
dev);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
Descrio: Cria um arquivo especial (device, pipe etc.) no sistema de arquivos.
mkstemp Nvel: 3
Prottipo: int mkstemp(char *template);
Retorno: Descritor do arquivo Header: #include <stdlib.h>
-1 se houve erro.
Descrio: Cria um arquivo temporrio nico.
mktemp Nvel: 3
Prottipo: char *mktemp(char *template);
Retorno: Ponteiro para arquivo Header: #include <stdlib.h>
NULL se houve erro.
Descrio: Cria um arquivo temporrio nico.
mktime Nvel: 3
Prottipo: time_t mktime(struct tm *timeptr)
Retorno: long para tempo Header: #include <time.h>
-1 se houve erro
Descrio: A partir da estrutura de data/hora, retorna um novo valor para hora
(segundos decorridos desde 01/01/1970).
Guia de Referncia das Funes 297
mmap Nvel: 2
Prottipo: caddr_t *mmap(void *addr, size_t len, int prot, int
flags, int fildes, off_t off);
void *mmap(void *addr, size_t len, int prot, int
flags, int fildes, off_t off);
Retorno: Ponteiro para incio do Header: #include <sys/types.h>
endereo #include <sys/mman.h>
-1 se houve erro.
Descrio: Cria um novo mapeamento de memria em disco.
mount Nvel: 2
Prottipo: int mount(const char *source, const char *target,
const char *filesystemtype, unsigned long mount-
flags, const void *data);
Retorno: 0 se OK Header: #include <sys/mount.h>
-1 se houve erro.
Descrio: Monta um sistema de arquivos.
mremap Nvel: 2
Prottipo: void * mremap(void *old_address, size_t old_size ,
size_t new_size, unsigned long flags);
Retorno: Ponteiro para o novo en- Header: #include <unistd.h>
dereo #include <sys/mman.h>
-1 se houve erro.
Descrio: Remapeia a memria mapeada anteriormente.
msync Nvel: 2
Prottipo: int msync(const void *start, size_t length, int
flags);
Retorno: 0 se OK Header:
-1 se houve erro.
Descrio: Envia as alteraes feitas em um arquivo mapeado em memria u-
sando mmap de volta para o disco.
munmap Nvel: 2
Prottipo: int munmap(void *start, size_t length);
Retorno: 0 se OK Header: #include <sys/mman.h>
-1 se houve erro
Descrio: Desmapeia um mapeamento de memria em disco.
nice Nvel: 2
Prottipo: int nice(int inc);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Altera a prioridade do processo.
298 Programando em C para Linux, Unix e Windows
open Nvel: 2
Prottipo: int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
Retorno: Descritor para arquivo. Header: #include <sys/types.h>
-1 se houve erro. #include <sys/stat.h>
#include <fcntl.h>
Descrio: Cria/abre um arquivo no sistema de arquivos.
opendir Nvel: 3
Prottipo: DIR *opendir(const char *name);
Retorno: Ponteiro para diretrio Header: #include <sys/types.h>
NULL se houve erro #include <dirent.h>
Descrio: Abre um diretrio especfico.
openlog Nvel: 3
Prottipo: void openlog( char *ident, int option, int facility);
Retorno: No tem retorno. Header: #include <syslog.h>
Descrio: Abre um arquivo (conexo) para o sistema de logs do sistema opera-
cional. Utilize sempre syslog.
pause Nvel: 2
Prottipo: int pause(void);
Retorno: -1 sempre Header: #include <unistd.h>
Descrio: Faz com o que processo que a chama aguarde at que um sinal seja
recebido.
pathconf Nvel: 3
Prottipo: long pathconf(char *path, int name);
Retorno: Limite se existir Header: #include <unistd.h>
-1 se houve erro.
Descrio: Obtm um valor para a opo de configurao name para o nome de
arquivo.
pclose Nvel: 3
Prottipo: int pclose(FILE *stream);
Retorno: Cdigo de retorno do pro- Header: #include <stdio.h>
cesso.
-1 se houve erro.
Descrio: Fecha um canal de comunicao pipeline.
perror Nvel: 3
Prottipo: void perror(const char *s);
Retorno: No tem retorno. Header: #include <stdio.h>
Descrio: Mostra a mensagem do erro em funo da varivel errno.
Guia de Referncia das Funes 299
pipe Nvel: 2
Prottipo: int pipe(int filedes[2]);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Cria um par de descritores de arquivo, apontando para um inode
pipe, e o coloca no vetor apontado por filedes. filedes[0]
para leitura, filedes[1] para escrita.
popen Nvel: 3
Prottipo: FILE *popen(const char *command, const char *type);
Retorno: Ponteiro para arquivo Header: #include <stdio.h>
NULL se houve erro
Descrio: Abre um processo atravs de um pipe.
pow Nvel: 3
Prottipo: double pow(double base, double exp);
Retorno: baseexp Header: #include <math.h>
Descrio: Devolve o nmero base elevada ao nmero exponencial.
printf Nvel: 3
Prottipo: int printf(const char *format, [Value, ...]);
Retorno: >0 se ok Header: #include <stdio.h>
<0 em caso de erro
Descrio: Imprime uma mensagem formatada
psignal Nvel: 3
Prottipo: void psignal(int sig, const char *s);
Retorno: No tem retorno. Header: #include <signal.h>
Descrio: Mostra uma mensagem na sada de erro padro contendo o sinal re-
cebido.
ptrace Nvel: 2
Prottipo: long ptrace(enum __ptrace_request request, pid_t
pid, void *addr);
Retorno: Dados requisitados ou 0 se Header: #include
OK <sys/ptrace.h>
-1 se houve erro
Descrio: Habilita o acompanhamento das chamadas de sistemas (veja co-
mando strace).
putc Nvel: 3
Prottipo: int putc(int c, FILE *stream);
Retorno: Caractere gravado. Header: #include <stdio.h>
Descrio: Grava um caractere no arquivo.
300 Programando em C para Linux, Unix e Windows
putchar Nvel: 3
Prottipo: int putchar(int c);
Retorno: Caractere gravado. Header: #include <stdio.h>
Descrio: Grava um caractere na sada padro.
putenv Nvel: 3
Prottipo: int putenv(const char *string);
Retorno: 0 se OK Header: #include <stdlib.h>
-1 se houve erro
Descrio: Cria/modifica uma varivel de ambiente.
putgrent Nvel: 3
Prottipo: int putgrent(const struct group *grp, FILE *fp);
Retorno: 0 se OK Header: #include <grp.h>
-1 se houve erro
Descrio: Grava as informaes de grupos no arquivo especificado (no formato
de /etc/group).
putpwent Nvel: 3
Prottipo: int putpwent(const struct passwd *p, FILE *stream);
Retorno: 0 se OK Header: #include <pwd.h>
-1 se houve erro #include <stdio.h>
#include <sys/types.h>
Descrio: Grava as informaes de usurio no arquivo especificado (no formato
de /etc/passwd).
puts Nvel: 3
Prottipo: int puts(const char *s);
Retorno: >0 se OK Header: #include <stdio.h>
EOF se houve erro
Descrio: Grava uma string na sada padro.
qsort Nvel: 3
Prottipo: void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Retorno: No tem retorno. Header: #include <stdlib.h>
Descrio: Classifica/ordena um vetor.
raise Nvel: 3
Prottipo: int raise (int sig);
Retorno: 0 se OK Header: #include <signal.h>
<0 se houve erro
Descrio: Envia um sinal para o prprio processo.
Guia de Referncia das Funes 301
rand Nvel: 3
Prottipo: int rand(void);
Retorno: Nmero pseudo-randmico. Header: #include <stdlib.h>
Descrio: Gera e devolve uma seqncia de nmeros pseudo-randmicos. O va-
lor retornado ser um int entre 0 e RAND_MAX.
read Nvel: 2
Prottipo: ssize_t read(int fd, void *buf, size_t count);
Retorno: 0 Final do arquivo Header: #include <unistd.h>
# bytes lidos
-1 se houve erro
Descrio: L bytes de um arquivo.
readv Nvel: 3
Prottipo: int readv(int filedes, const struct iovec *vector,
size_t count);
Retorno: # bytes lidos Header: #include <sys/uio.h>
-1 se houve erro
Descrio: L informaes de vrios buffers.
realloc Nvel: 3
Prottipo: void *realloc(void *ptr, size_t);
Retorno: Ponteiro para a memria. Header: #include <stdlib.h>
Descrio: Realocao dinmica de memria.
readdir Nvel: 2
Prottipo: struct dirent *readdir(DIR *dp);
Retorno: Ponteiro para estrutura Header: #include <sys/types.h>
NULL se o final do diret- #include <dirent.h>
rio foi alcanado.
Descrio: Retorna as informaes referentes a um diretrio.
readlink Nvel: 2
Prottipo: int readlink(const char *path, char *buf, size_t
bufsize);
Retorno: # bytes lidos se OK Header: #include <unistd.h>
-1 se houve erro.
Descrio: L valor de uma ligao simblica
recvfrom Nvel: 2
Prottipo: ssize_t recvfrom(int s, void *buf, size_t len int
flags, struct sockaddr *from, socklen_t *fromlen
Retorno: # bytes recebidos Header: #include <sys/types.h>
-1 se houve erro #include
<sys/socket.h>
Descrio: Recebe mensagens de um socket.
302 Programando em C para Linux, Unix e Windows
remove Nvel: 3
Prottipo: int remove(const char *pathname);
Retorno: 0 se OK Header: #include <stdio.h>
-1 se houve erro
Descrio: Remove um arquivo do sistema de arquivos.
rename Nvel: 2
Prottipo: int rename(const char *oldpath, const char
*newpath);
Retorno: 0 se OK Header: #include <stdio.h>
-1 se houve erro
Descrio: Muda de local ou renomeia um arquivo.
rewind Nvel: 3
Prottipo: void rewind( FILE *stream);
Retorno: No tem retorno. Header: #include <stdio.h>
Descrio: Seta o indicador de posio de arquivo para o incio do arquivo.
rewinddir Nvel: 3
Prottipo: void rewinddir(DIR *dir);
Retorno: No tem retorno. Header: #include <sys/types.h>
#include <dirent.h>
Descrio: Posiciona o ponteiro na primeira entrada (incio) do diretrio.
rmdir Nvel: 2
Prottipo: int rmdir(const char *pathname);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Apaga um diretrio, o qual deve estar vazio.
scanf Nvel: 3
Prottipo: int scanf(const char *format, ...);
Retorno: Quantidade de dados lidos. Header: #include <stdio.h>
EOF se erro
Descrio: Leitura de dados digitados (entrada padro) de acordo com os forma-
tos utilizados (int, float, string etc.)
seekdir Nvel: 3
Prottipo: void seekdir(DIR *dir, off_t offset);
Retorno: No tem retorno. Header: #include <dirent.h>
Descrio: Pesquisa e posiciona o ponteiro na entrada correspondente.
Guia de Referncia das Funes 303
select Nvel: 2
Prottipo: int select(int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
Retorno: # de descritores Header: #include <sys/time.h>
-1 se houve erro #include <sys/types.h>
#include <unistd.h>
Descrio: Multiplexao sncrono de E/S. Aguarda a mudana de status de
um nmero de descritores de arquivo.
semctl Nvel: 2
Prottipo: int semctl(int semid, int semnum, int cmd);
Retorno: >0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/ipc.h>
#include <sys/sem.h>
Descrio: Operaes de controle de semforo.
semget Nvel: 2
Prottipo: int semget(key_t key, int nsems, int semflg);
Retorno: >0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/ipc.h>
#include <sys/sem.h>
Descrio: L/obtm um identificador para semforo.
semop Nvel: 2
Prottipo: int semop(int semid, struct sembuf *sops, unsigned
nsops);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/ipc.h>
#include <sys/sem.h>
Descrio: Operaes de semforo.
send Nvel: 2
Prottipo: ssize_t send(int s, const void *buf, size_t len int
flags);
Retorno: # bytes enviados Header: #include <sys/types.h>
-1 se houve erro #include
<sys/socket.h>
Descrio: Envia mensagem para o socket.
sendto Nvel: 2
Prottipo: ssize_t sendto(int s, const void *buf, size_t len int
flags, const struct sockaddr *to, socklen_t tolen);
Retorno: # bytes enviados Header: #include <sys/types.h>
-1 se houve erro #include
<sys/socket.h>
Descrio: Envia mensagem para o socket.
304 Programando em C para Linux, Unix e Windows
setbuf Nvel: 3
Prottipo: void setbuf(FILE *stream, char *buf);
Retorno: 0 se OK Header: #include <stdio.h>
<0 se houve erro
Descrio: Seta as operaes (comportamento) de buffer do arquivo.
setbuffer Nvel: 3
Prottipo: void setbuffer(FILE *stream, char *buf, size_tsize);
Retorno: 0 se OK Header: #include <stdio.h>
<0 se houve erro
Descrio: Seta as operaes (comportamento) de buffer do arquivo.
setenv Nvel: 3
Prottipo: int setenv(const char *name, const char *value, int
overwrite);
Retorno: 0 se OK Header: #include <stdlib.h>
-1 se houve erro
Descrio: Cria ou modifica uma varivel de ambiente (similar a putenv).
seteuid Nvel: 2
Prottipo: int seteuid(uid_t euid);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Seta o ID efetivo do usurio no processo.
setegid Nvel: 2
Prottipo: int setegid(gid_t egid);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Seta o GID efetivo do grupo no processo.
setgid Nvel: 2
Prottipo: int setgid(gid_t gid);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro #include <sys/types.h>
Descrio: Seleciona a identidade de grupo efetiva do processo atual.
setgrent Nvel: 3
Prottipo: void setgrent(void);
Retorno: No tem retorno. Header: #include <grp.h>
#include <sys/types.h>
Descrio: Retorna o ponteiro do arquivo para o incio de /etc/group.
Guia de Referncia das Funes 305
setgroups Nvel: 2
Prottipo: int setgroups(size_t size, const gid_t *list);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro. #include <unistd.h>
Descrio: Seleciona os grupos suplementares para o processo. Somente o supe-
rusurio pode usar esta funo.
sethostid Nvel: 2
Prottipo: int sethostid(long hostid);
Retorno: Identificador da mquina Header: #include <unistd.h>
Descrio: Seta o identificador do host (armazenado em /etc/hostid).
sethostname Nvel: 2
Prottipo: int sethostname(const char *name, size_t len);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Altera o nome do host do sistema em uso.
setlinebuf Nvel: 3
Prottipo: void setlinebuf(FILE *stream);
Retorno: 0 se OK Header: #include <stdio.h>
<0 se houve erro
Descrio: Seta as operaes (comportamento) de buffer do arquivo.
setlocale Nvel: 3
Prottipo: char *setlocale(int category, const char * locale);
Retorno: Ponteiro para string Header: #include <locale.h>
NULL se houve erro
Descrio: Seta/obtm as configuraes locais do sistema operacional.
setpgid Nvel: 2
Prottipo: int setpgid(pid_t pid, pid_t pgid);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Seta o identificador de grupo para o processo.
setpgrp Nvel: 2
Prottipo: int setpgrp(void);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Seta o identificador de grupo para o processo. Equivalente a
setpgid(0,0).
306 Programando em C para Linux, Unix e Windows
setpwent Nvel: 3
Prottipo: void setpwent(void);
Retorno: No tem retorno. Header: #include <sys/types.h>
#include <pwd.h>
Descrio: Reposiciona o ponteiro para o incio do arquivo /etc/passwd.
settimeofday Nvel: 2
Prottipo: int settimeofday(const struct timeval *tv , const
struct timezone *tz);
Retorno: 0 se OK Header: #include <sys/time.h>
-1 se houve.
Descrio: Seta a hora do sistema.
setsid Nvel: 2
Prottipo: pid_t setsid(void);
Retorno: ID da sesso Header: #include <unistd.h>
-1 se houve erro. #include <sys/types.h>
Descrio: Cria uma nova sesso se o processo chamador no um lder de gru-
po de processo. Torna o processo lder da sesso.
setuid Nvel: 2
Prottipo: int setuid(uid_t uid);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <unistd.h>
Descrio: Seleciona a ID efetiva de usurio do processo atual.
setvbuf Nvel: 3
Prottipo: int setvbuf(FILE *stream, char *buf, int mode ,
size_t size);
Retorno: 0 se OK Header: #include <stdio.h>
<0 se houve erro
Descrio: Seta as operaes (comportamento) de buffer do arquivo.
shutdown Nvel: 2
Prottipo: int shutdown(int s, int how);
Retorno: 0 se OK Header: #include
-1 se houve erro <sys/socket.h>
Descrio: Faz todas, ou partes, das conexes full-duplex em um socket, associ-
ado com s serem fechados.
siginterrupt Nvel: 3
Prottipo: int siginterrupt(int sig, int flag);
Retorno: 0 se OK Header: #include <signal.h>
-1 se houve erro
Descrio: Habilita um sinal para interromper uma chamada de sistema.
Guia de Referncia das Funes 307
sleep Nvel: 3
Prottipo: unsigned int sleep(unsigned int seconds);
Retorno: 0 se terminou o tempo in- Header: #include <unistd.h>
formado
# segundos que faltavam
para o trmino.
Descrio: Paraliza o processo (dorme) com a quantidade de segundos informado.
signal Nvel: 2
Prottipo: typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
Retorno: Outros sinais se OK Header: #include <signal.h>
SIG_ERR em caso de erro
Descrio: Instala uma funo para tratar os sinais que o processo recebe.
sin Nvel: 3
Prottipo: double sin(double num);
Retorno: Seno de num. Header: #include <math.h>
Descrio: Devolve o seno de nmero. Nmero deve ser informado em radianos.
socket Nvel: 2
Prottipo: int socket(int domain, int type, int protocol);
Retorno: Descritor para arquivos Header: #include <sys/types.h>
-1 se houve erro. #include
<sys/socket.h>
Descrio: Cria um socket para comunicao.
sprintf Nvel: 3
Prottipo: int sprintf(char *string, const char * format,
[Value, ]);
Retorno: >0 se ok Header: #include <stdio.h>
<0 em caso de erro
Descrio: Formata uma sada e coloca em uma string.
sqrt Nvel: 3
Prottipo: double sqrt(double num);
Retorno: Raiz Quadrada ou erro. Header: #include <math.h>
Descrio: Devolve a raiz quadrada do nmero ou erro se nmero for negativo.
srand Nvel: 3
Prottipo: void srand(int seed);
Retorno: No tem retorno. Header: #include <stdlib.h>
Descrio: Estabelece um ponto de partida para uma seqncia gerada pela fun-
o rand.
308 Programando em C para Linux, Unix e Windows
stat Nvel: 2
Prottipo: int stat(const char *file_name, struct stat *buf);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <sys/stat.h>
#include <unistd.h>
Descrio: Retorna informaes a respeito de um arquivo.
stime Nvel: 2
Prottipo: int stime(time_t *t);
Retorno: 0 se OK Header: #include <time.h>
-1 se houve erro
Descrio: Ajusta a hora e a data do sistema.
strcasecmp Nvel: 3
Prottipo: int strcasecmp(const char *s1, const char *s2);
Retorno: 0 se iguais Header: #include <string.h>
<0 se s1 < s2
>0 se s1 > s2
Descrio: Compara duas strings ignorando se so maisculas ou minsculas.
strcat Nvel: 3
Prottipo: char *strcat(char *dest, const char *src);
Retorno: Ponteiro para string Header: #include <string.h>
Descrio: Concatena string origem na string destino.
strchr Nvel: 3
Prottipo: char *strchr(const char *s, int c);
Retorno: Ponteiro para string Header: #include <string.h>
NULL se no existir o ca-
ractere
Descrio: Retorna a primeira ocorrncia do caractere na string.
strcmp Nvel: 3
Prottipo: int strcmp(const char *s1, const char *s2);
Retorno: 0 se iguais Header: #include <string.h>
<0 se s1 < s2
>0 se s1 > s2
Descrio: Compara duas strings para verificar se so iguais.
strcoll Nvel: 3
Prottipo: int strcoll(const char *s1, const char *s2);
Retorno: 0 se iguais Header: #include <string.h>
<0 se s1 < s2
>0 se s1 > s2
Descrio: Compara duas strings para verificar se so iguais (utilizando as confi-
guraes locais para a verificao, veja setlocale).
Guia de Referncia das Funes 309
strcpy Nvel: 3
Prottipo: char *strcpy(char *dest, const char *src);
Retorno: Ponteiro para a string Header: #include <string.h>
destino.
Descrio: Copia uma string (src) para outra (dest).
strdup Nvel: 3
Prottipo: char *strdup(const char *s);
Retorno: Ponteiro para a string Header: #include <string.h>
Descrio: Duplica uma string.
strerror Nvel: 3
Prottipo: char *strerror(int errnum);
Retorno: Ponteiro para a string Header: #include <string.h>
Descrio: Retorna uma string contendo o erro indicado.
strftime Nvel: 3
Prottipo: size_t strftime(char *s, size_t max, const char
*format const struct tm *tm);
Retorno: # caracteres colocados na Header: #include <time.h>
string
Descrio: Formata uma data/hora em um string conforme os parmetros especi-
ficados.
strlen Nvel: 3
Prottipo: size_t strlen (const char *string)
Retorno: Tamanho da string Header: #include <string.h>
Descrio: Retorna o tamanho de uma string terminada com \0 (NULL)
strncasecmp Nvel: 3
Prottipo: int strncasecmp(const char *s1, const char *s2,
size_t n);
Retorno: 0 se iguais Header: #include <string.h>
<0 se s1 < s2
>0 se s1 > s2
Descrio: Compara duas strings (at n caracteres) ignorando se so maisculas
ou minsculas.
strncat Nvel: 3
Prottipo: char *strncat(char *dest, const char *src, size_t
n);
Retorno: Ponteiro para string Header: #include <string.h>
Descrio: Concatena string origem na string destino (at n bytes).
310 Programando em C para Linux, Unix e Windows
strncmp Nvel: 3
Prottipo: int strncmp(const char *s1, const char *s2, size_t
n);
Retorno: 0 se iguais Header: #include <string.h>
<0 se s1 < s2
>0 se s1 > s2
Descrio: Compara duas strings (at n bytes) para verificar se so iguais.
strncpy Nvel: 3
Prottipo: char *strncpy(char *dest, const char *src, size_t
n);
Retorno: Ponteiro para a string Header: #include <string.h>
destino.
Descrio: Copia uma n bytes de string (src) para outra (dest)
strnlen Nvel: 3
Prottipo: size_t strnlen (const char *s, size_t maxlen);
Retorno: # de bytes Header: #include <string.h>
Descrio: Retorna a quantidade de bytes da string at o mximo indicado.
strpbrk Nvel: 3
Prottipo: char *strpbrk(const char *s, const char *accept);
Retorno: Ponteiro para string Header: #include <string.h>
NULL se no encontrou
Descrio: Pesquisa e retorna a primeira ocorrncia de accept em s.
strptime Nvel:
Prottipo: char *strptime(const char *s, const char *formato,
struct tm *tm);
Retorno: Ponteiro para string Header: #include <time.h>
NULL se no ocorreu a
converso
Descrio: Converte uma representao de hora do tipo string para uma estrutura
de hora tm.
strrchr Nvel: 3
Prottipo: char *strrchr(const char *s, int c);
Retorno: Ponteiro para string Header: #include <string.h>
NULL se no existir o ca-
ractere
Descrio: Retorna a ltima ocorrncia do caractere na string.
Guia de Referncia das Funes 311
strstr Nvel: 3
Prottipo: char *strstr(const char *haystack, const char *needle);
Retorno: Ponteiro para string Header: #include <string.h>
NULL se no encontrou
Descrio: Procura uma substring dentro de uma string maior.
strtok Nvel: 3
Prottipo: char *strtok(char *s, const char *delim);
Retorno: Ponteiro para a prxima Header: #include <string.h>
posio
NULL se no existe ou se
chegou ao final da string.
Descrio: Retorna um token (posio) do delimitador dentro da string.
sscanf Nvel: 3
Prottipo: int sscanf(const char *str, const char *format,
...);
Retorno: # de dados lidos. Header: #include <stdio.h>
EOF se erro
Descrio: L os dados de uma string. A leitura realizada de forma similar
funo scanf.
symlink Nvel: 2
Prottipo: int symlink(const char *oldpath, const char *newpath);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Cria um link simblico para o arquivo.
sync Nvel: 2
Prottipo: int sync(void);
Retorno: 0 sempre. Header: #include <unistd.h>
Descrio: Sincroniza as informaes que esto no cache do sistema com o disco.
sysconf Nvel: 3
Prottipo: long sysconf(int name);
Retorno: Configurao do ambiente Header: #include <unistd.h>
Descrio: Obtm informaes de configurao do sistema operacional em tempo
de execuo.
syslog Nvel: 3
Prottipo: void syslog( int priority, char *format, ...);
Retorno: No tem retorno. Header: #include <syslog.h>
Descrio: Gera e envia mensagens para o sistema de logs do sistema operacio-
nal.
312 Programando em C para Linux, Unix e Windows
sysctl Nvel: 2
Prottipo: int sysctl(struct __sysctl_args *args);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro #include
<linux/unistd.h>
#include
<linux/sysctl.h>
Descrio: L/escreve parmetros do sistema/kernel. Por exemplo:nome da m-
quina, nmero mximo de arquivos abertos.
system Nvel: 3
Prottipo: int system (const char * string);
Retorno: >0 se OK Header: #include <stdlib.h>
127 se no foi possvel
executar
-1 se houve algum erro
Descrio: Executa um comando no sistema operacional.
tan Nvel: 3
Prottipo: double tan(double num);
Retorno: Tangente de num. Header: #include <math.h>
Descrio: Devolve a tangente do nmero. Nmero deve ser informado em radianos.
telldir Nvel: 3
Prottipo: off_t telldir(DIR *dir);
Retorno: Posio atual Header: #include <dirent.h>
-1 se houve erro.
Descrio: Retorna a posio atual dentro da estrutura de diretrios.
tempnam Nvel: 3
Prottipo: char *tempnam(const char *dir, const char *pfx);
Retorno: Ponteiro para o nome Header: #include <stdio.h>
Descrio: Retorna um nome de arquivo temporrio nico para uso no sistema
operacional.
time Nvel: 2
Prottipo: time_t time(time_t *t);
Retorno: Tempo em segundos. Header: #include <time.h>
Descrio: Retorna o tempo desde 01 de Janeiro de 1970 s 00:00:00 UTC, me-
dido em segundos.
times Nvel: 2
Prottipo: clock_t times(struct tms *buf);
Retorno: Nmero de tiques do rel- Header: #include <sys/times.h>
gio desde que foi ativado.
Descrio: Armazena o tempo do processo atual em buf.
Guia de Referncia das Funes 313
tmpfile Nvel: 3
Prottipo: FILE *tmpfile (void);
Retorno: Ponteiro para arquivo Header: #include <stdio.h>
NULL se houve erro
Descrio: Cria um arquivo temporrio nico para uso dentro do sistema opera-
cional.
tmpnam Nvel: 3
Prottipo: char *tmpnam(char *s);
Retorno: Ponteiro para nome Header: #include <stdio.h>
NULL se houve erro
Descrio: Cria um nome para arquivo temporrio.
toascii Nvel: 3
Prottipo: int toascii (int c);
Retorno: Caractere convertido. Header: #include <ctype.h>
Descrio: Converte um caractere para o seu cdigo ASCII.
toupper Nvel: 3
Prottipo: int toupper (int c);
Retorno: Caractere convertido. Header: #include <ctype.h>
Descrio: Converte um caractere para maiscula.
tolower Nvel: 3
Prottipo: int tolower (int c);
Retorno: Caractere convertido. Header: #include <ctype.h>
Descrio: Converte um caractere para minscula.
trunc Nvel: 3
Prottipo: double trunc(double x);
Retorno: Nmero Header: #include <math.h>
Descrio: Trunca o nmero (arredonda).
truncate Nvel: 2
Prottipo: int truncate(const char *path, off_t length);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro #include <sys/types.h>
Descrio: Trunca o arquivo conforme o tamanho passado.
umask Nvel: 2
Prottipo: mode_t umask(mode_t mask);
Retorno: Mscara anterior. Header: #include <sys/types.h>
#include <sys/stat.h>
Descrio: Seleciona a mscara de criao dos arquivos.
314 Programando em C para Linux, Unix e Windows
umount Nvel: 2
Prottipo: int umount(const char *target);
int umount2(const char *target, int flags);
Retorno: 0 se OK Header: #include <sys/mount.h>
-1 se houve erro
Descrio: Desmonsta um sistema de arquivos montado atravs de mount.
uname Nvel: 2
Prottipo: int uname(struct utsname *buf);
Retorno: 0 se OK Header: #include
-1 se houve erro <sys/utsname.h>
Descrio: Obtm o nome e as informaes sobre o sistema atual.
unlink Nvel: 2
Prottipo: int unlink(const char *pathname);
Retorno: 0 se OK Header: #include <unistd.h>
-1 se houve erro
Descrio: Apaga um nome a partir do sistema de arquivos; se o nome tem a l-
tima ligao (inode) no sistema de arquivos, o arquivo removido e o
inode liberado.
unsetenv Nvel: 3
Prottipo: void unsetenv(const char *name);
Retorno: No tem retorno. Header: #include <stdlib.h>
Descrio: Remove uma varivel de ambiente.
usleep Nvel: 3
Prottipo: void usleep(unsigned long usec);
Retorno: No tem retorno. Header: #include <unistd.h>
Descrio: Suspende a execuo do processo em microssegundos.
utime Nvel: 2
Prottipo: int utime(const char *filename, struct utimbuf
*buf);
Retorno: 0 se OK Header: #include <sys/types.h>
-1 se houve erro #include <utime.h>
Descrio: Altera a data de acesso ou modificao de um inode.
va_end Nvel: 3
Prottipo: void va_end( va_list ap);
Retorno: No tem retorno. Header: #include <stdarg.h>
Descrio: Finaliza a lista de parmetros variveis que uma funo pode receber.
Guia de Referncia das Funes 315
va_copy Nvel: 3
Prottipo: void va_copy(va_list dest, va_list src);
Retorno: No tem retorno. Header: #include <stdarg.h>
Descrio: Copia uma lista de parmetros para outra.
va_start Nvel: 3
Prottipo: void va_start( va_list ap, last);
Retorno: No tem retorno. Header: #include <stdarg.h>
Descrio: Inicializa a lista de parmetros variveis que uma funo pode rece-
ber.
wait Nvel: 2
Prottipo: pid_t wait(int *status);
Retorno: PID do filho Header: #include <sys/types.h>
-1 se houve erro #include <sys/wait.h>
Descrio: Aguarda o trmino do filho.
waitpid Nvel: 2
Prottipo: pid_t waitpid(pid_t pid, int *status, int options);
Retorno: PID do filho Header: #include <sys/types.h>
-1 se houve erro #include <sys/wait.h>
Descrio: Verifica se um processo filho terminou e com qual status.
write Nvel: 2
Prottipo: ssize_t write(int fd, const void *buf, size_t
count);
Retorno: # bytes gravados Header: #include <unistd.h>
-1 se houve erro
Descrio: Grava bytes em um arquivo.
writev Nvel: 3
Prottipo: int writev(int filedes, const struct iovec *vector,
size_t count);
Retorno: # bytes gravados Header: #include <sys/uio.h>
-1 se houve erro
Descrio: Grava informaes em vrios buffers.
Bibliografia
317
ndice Remissivo
Bolha 241
# break 42
#define 58
#else 59 C
#endif 59
#error 65 C ANSI 4
#if 59 C ISO 4
#ifdef 62 C99 5
#ifndef 62 calloc 116
#include 57 Case Sensitive 10
#undef 63 clearerr 110
close 155, 218
connect 212
? Constantes 6
continue 43
? 35
creat 154
Criao de processos 178
A ctime 131
accept 214
access 171 D
Ajuda 247
ANSI 95 daemon 200
asctime 131 do...while 41
atexit 54
E
B
errno 138
bind 210 Erros 138, 205
319
320 Programando em C para Linux, Unix e Windows
strerror 139
Q Strings 75, 90
strlen 78
Quicksort 242
strncat 83
strncmp 85
R strncpy 84
strstr 92
raise 196 strtok 93
read 156 switch...case 36
realloc 117 syslog 205
Recursividade 239 system 187
recv 217
recvfrom 218
remove 161 T
rename 164
TCP 221, 222, 223
return 49
time 129
typedef 17, 123
S
scanf 24 U
send 215
UDP 224, 225, 226
sendto 218
umask 176
setsid 202
uname 169
sfrtime 135
Unies 142
shutdown 218
Unix 148, 166, 188, 247
signal 191
unlink 162
Sinais 188
sizeof 18
sleep 198 V
sockaddr 208
socket 207 Variveis 14, 50
sprintf 82 Vetores 69
sscanf 82
stat 172
static 53 W
strcat 79
strcmp 80 wait 181
strcpy 80 waitpid 183
Streams 111 while 40
write 158
Sumrio
Introduo..................................................................................................1
1. Informaes Bsicas...............................................................................3
1.1 Histria............................................................................................................ 3
1.2 C de K&R........................................................................................................ 4
1.3 C ANSI e C ISO .............................................................................................. 4
1.4 C99 ................................................................................................................. 5
1.5 Comentrios ................................................................................................... 6
1.6 Constantes Numricas ................................................................................... 6
1.7 Outras Constantes.......................................................................................... 7
1.8 Estrutura de um Programa ............................................................................. 8
1.9 Funo main ................................................................................................... 9
1.10 O que main devolve.................................................................................... 10
1.11 O C "Case Sensitive"............................................................................... 10
1.12 Palavras Reservadas do C......................................................................... 11
2. Tipos de Dados ....................................................................................12
2.1 Tipos Bsicos ............................................................................................... 12
2.2 Abrangncia e Modificadores de Tipo.......................................................... 13
2.3 Nomenclatura de Variveis .......................................................................... 14
2.4 Definio de Variveis.................................................................................. 16
2.5 Atribuio de Valores ................................................................................... 16
2.6 Definio de Constantes .............................................................................. 16
2.7 Converso de Tipos ..................................................................................... 17
2.8 Declarao typedef....................................................................................... 17
2.9 Operador sizeof ............................................................................................ 18
X Programando em C para Linux, Unix e Windows
3. Entrada e Sada....................................................................................20
3.1 Funo printf................................................................................................. 20
3.2 Formatadores de Tipos ................................................................................ 21
3.3 Indicando o Tamanho................................................................................... 21
3.4 Funo putchar............................................................................................. 24
3.5 Funo scanf ................................................................................................ 24
3.6 Funo getchar............................................................................................. 25
4. Operadores ..........................................................................................26
4.1 Operadores Aritmticos................................................................................ 26
4.2 Operadores Unrios ..................................................................................... 26
4.3 Operadores de Atribuio............................................................................. 27
4.4 Operadores Relacionais ............................................................................... 28
4.5 Prioridade de Avaliao................................................................................ 28
4.6 Operadores Lgicos ..................................................................................... 29
4.7 Assinalamento de Variveis ......................................................................... 30
4.8 Parnteses e Colchetes como Operadores...................................................... 31
4.9 Operador & e * para Ponteiros ..................................................................... 32
5. Comandos de Seleo..........................................................................33
5.1 Comando if ................................................................................................... 33
5.2 Comando if...else.......................................................................................... 34
5.3 Operador ? :.................................................................................................. 35
5.4 Comando switch...case ................................................................................ 36
6. Comandos de Repetio ......................................................................39
6.1 Comando for ................................................................................................. 39
6.2 Comando while ............................................................................................. 40
6.3 Comando do...while...................................................................................... 41
6.4 Comando break ............................................................................................ 42
6.5 Comando continue ....................................................................................... 43
6.6 Comando goto .............................................................................................. 44
6.7 Comando exit................................................................................................ 45
7. Definies de Funes .........................................................................47
7.1 Criao de Funes ..................................................................................... 47
7.2 Funo e Prottipo (assinatura da funo) .................................................. 47
7.3 Definindo Funes........................................................................................ 48
7.4 Comando return............................................................................................ 49
7.5 Escopo de Variveis ..................................................................................... 50
7.6 Variveis Globais.......................................................................................... 50
7.7 Variveis Locais ........................................................................................... 51
7.8 Definio extern............................................................................................ 52
7.9 Definio static ............................................................................................. 53
7.10 Funo atexit .............................................................................................. 54
Sumrio XI
8. Pr-Compilao ....................................................................................56
8.1 Fases de uma compilao............................................................................ 56
8.2 Diretiva #include ........................................................................................... 57
8.3 Diretiva #define............................................................................................. 58
8.4 Diretivas #if, #else e #endif .......................................................................... 59
8.5 Diretivas #ifdef e #ifndef ............................................................................... 62
8.6 Diretiva #undef ............................................................................................. 63
8.7 Diretiva #error ............................................................................................... 65
8.8 Variveis predefinidas .................................................................................. 66
9. Vetores e Matrizes...............................................................................69
9.1 Definindo Vetores ......................................................................................... 69
9.2 Definindo Matrizes ........................................................................................ 70
9.3 Matrizes n-Dimensionais .............................................................................. 71
9.4 Inicializando Matrizes ................................................................................... 72
9.5 Matrizes como Parmetros........................................................................... 73
10. Strings ................................................................................................75
10.1 Implementao de Strings.......................................................................... 75
10.2 Entrada/Sada de Strings ........................................................................... 76
10.3 String como vetor ....................................................................................... 77
10.4 Funo strlen .............................................................................................. 78
10.5 Funo strcat .............................................................................................. 79
10.6 Funo strcpy ............................................................................................. 80
10.7 Funo strcmp............................................................................................ 80
10.8 Funo sprintf ............................................................................................. 82
10.9 Funo sscanf ............................................................................................ 82
10.10 Funo strncat .......................................................................................... 83
10.11 Funo strncpy ......................................................................................... 84
10.12 Funo strncmp........................................................................................ 85
11. Ponteiros ............................................................................................86
11.1 Conceito Bsico.......................................................................................... 86
11.2 Definio de Ponteiros ............................................................................... 86
11.3 Uso de Ponteiros ........................................................................................ 87
11.4 Parmetros de Sada.................................................................................. 88
11.5 Operaes com Ponteiros .......................................................................... 89
11.6 Ponteiros e Matrizes ................................................................................... 89
11.7 Ponteiros e Strings ..................................................................................... 90
11.8 Argumentos de Entrada.............................................................................. 91
11.9 Funo strstr............................................................................................... 92
11.10 Funo strtok ............................................................................................ 93
XII Programando em C para Linux, Unix e Windows