Você está na página 1de 25

Universidade Federal de So Carlos Centro de Cincias Exatas e de Tecnologia Departamento de Computao

Sumrio 1 2 Introduo .................................................................................1 Arquiteturas de rede: breve reviso ................................................1 2.1 2.2 3 ARQUITETURA OSI.................................................................................................... 2 ARQUITETURA TCP/IP .............................................................................................. 3

A camada de transporte ................................................................4 3.1 TCP........................................................................................................................... 4

C U R S O L A T O- S E N S U E M RE D E S D E C O MPU T A D O RE S

3.1.1 Estabelecimento e trmino de conexo ................................................................ 5 3.1.2 Sada de dados TCP ............................................................................................. 6 3.2 3.3 3.4 4 UDP .......................................................................................................................... 7 NMEROS DE PORTAS ................................................................................................ 8 LIMITAES .............................................................................................................. 8 3.2.1 Sada de dados UDP ............................................................................................ 8

Unix: breve reviso......................................................................9 4.1 4.2 4.3 4.4 O NCLEO DO SISTEMA E PROGRAMAS....................................................................... 9 USURIOS, GRUPOS E PERMISSES............................................................................. 9 PROGRAMAS E PROCESSOS....................................................................................... 10 ARQUIVOS E TIPOS DE ARQUIVOS............................................................................. 10

Material de Suporte para Programao para Redes

Comunicao entre processos: sockets ........................................... 11 5.1 5.2 5.3 ESTRUTURAS DE ENDEREO DE SOCKET ................................................................... 11 FUNES PARA USO DE SOCKETS EM COMUNICAO TCP ....................................... 12 FUNES PARA USO DE SOCKETS EM COMUNICAO UDP ...................................... 16

Jander Moreira

Interpretadores de comandos: Shells.............................................. 17 6.1 6.2 6.3 6.4 6.5 6.6 A SHELL E O SISTEMA ............................................................................................... 17 FUNES DA SHELL.................................................................................................. 17 CONCEITOS BSICOS ............................................................................................... 20 RECURSOS DE PROGRAMAO DA SHELL ................................................................. 22 PROGRAMAS ............................................................................................................ 24 AMBIENTE ............................................................................................................... 29

7 8

Concluses .............................................................................. 30 Bibliografia .............................................................................. 30 Comandos importantes................................................ 31 i

Abril/2005

Apndice A

Jander Moreira

Apndice B B.I B.II B.III IV.a IV.b B.V V.a V.b V.c Apndice C C.I C.II

Programao e compilao C/C++ .................................. 33

Lista de tabelas
Tabela I. Bits de permisso para arquivos e seus significados............................................................ 10 Tabela II. Codificao octal para os bits de permisso. ...................................................................... 10 Tabela III. Famlias de protocolos para o socket................................................................................. 14 Tabela IV. Tipos de comunicao para o socket. ................................................................................ 14 Tabela V. Resultado de combinaes especficas de famlias de protocolos e tipos de comunicao.14 Tabela VI. Caracteres curingas. .......................................................................................................... 21 Tabela VII. Smbolos de direcionamento de entrada e sada. ............................................................. 21 Tabela VIII. Argumentos para scripts................................................................................................. 25 Tabela IX. Exemplos de variveis de ambiente. ................................................................................. 29 Tabela X. Alguns dos sinais usados nos processos. ............................................................................ 39

COMPILADORES ...................................................................................................... 33 FUNDAMENTOS DE COMPILAO ............................................................................ 33 MAKEFILES ............................................................................................................. 34 Bibliotecas......................................................................................................... 35 Chamadas do sistema........................................................................................ 35 ROTINAS ................................................................................................................. 35 Manipulao de processos................................................................................ 35 Sinais ................................................................................................................. 38 Comunicao interprocessos ............................................................................ 40 Principais componentes de cabealhos IP......................... 43 IPV4........................................................................................................................ 43 IPV6........................................................................................................................ 44 Diagrama transio de estados ...................................... 45 Lista de figuras

B.IV RECURSOS DE ROTINAS ........................................................................................... 35

Apndice D

Figura 1. Camadas em um software de rede: (a) Interface entre camadas adjacentes; (b) Comunicao entre camadas de mesmo nvel em duas mquinas distintas. ....................................................... 2 Figura 2. Esquema da comunicao sob a ptica do modelo OSI......................................................... 3 Figura 3. Arquitetura de rede TCP/IP. .................................................................................................. 5 Figura 4. Protocolos da arquitetura TCP/IP. ......................................................................................... 5 Figura 5. Esquema das trocas de mensagens para o estabelecimento de uma conexo TCP. ............... 6 Figura 6. Esquema das trocas de mensagens para o trmino de uma conexo TCP. ............................ 6 Figura 7. Passos envolvido no envio de dados por parte da aplicao para o protocolo TCP. ............. 7 Figura 8. Passos envolvido no envio de dados por parte da aplicao para o protocolo UDP. O buffer do UDP no existe realmente, portanto indicado com a linha pontilhada. ................................ 7 Figura 9. Funes de socket em uma comunicao modelo cliente-servidor usando TCP. ................ 13 Figura 10. Funes de socket em uma comunicao modelo cliente-servidor usando UDP. ............. 16 Figura 10. Esquema do processo de gerao do programa executvel. .............................................. 34 Figura 11. Esquema da utilizao de um mesmo arquivo por dois processos distintos. ..................... 36 Figura 12. Diagrama dos principais estados de um processo.............................................................. 37 Figura 13. Formato do cabealho Ipv4................................................................................................ 43 Figura 14. Formato do cabealho Ipv6................................................................................................ 44 Figura 15. Diagrama de estados TCP.................................................................................................. 45

ii

iii

Introduo

1 Introduo
Este texto faz a apresentao dos principais aspectos de programao para redes de computadores em ambientes Unix, sem entanto se aprofundar no assunto. Seu objetivo proporcionar um material de suporte e referncia, abrangendo assim vrios assuntos alm dos sockets na comunicao via rede. O texto organizado em sees e apndices, como se segue. Cobre, na seo 2, uma rpida introduo a arquiteturas de redes de computadores, contextualizada especificamente sob o enfoque de programao. Na seqncia, uma rpida reviso da camada de transporte apresentada (seo 3), abordando pontos importantes para programao de redes, o que inclui uma descrio sobre os protocolos TCP e UDP. Embora no seja parte dos objetivos principais deste texto, uma breve reviso sobre aspectos importantes do sistema Unix so apresentados na seo 4, pois se julga importante como material de referncia. As funes bsicas para programao de redes esto na seo 5. Complementarmente, na seo 6, aspectos sobre o interpretador de comandos, sua funcionalidade e seu potencial, juntamente com comandos e programas teis do sistema so apresentados (em especial, as referncias de operao e utilizao so em relao a shell denominada Bourne Again Shell bash*). Nos apndices, so abordados aspectos de programao em C/C++, com enfoque utilizao de bibliotecas e chamadas do sistema, bem como aspectos de processos e comunicao interprocessos. Incluem, tambm, informaes sobre o formato dos cabealhos de pacotes IP (verses 4 e 6) e o diagrama de estados para conexes TCP. Salienta-se que este material bsico e no tem o objetivo de ensinar a programao de redes de computadores, mas fornecer subsdios para entender seus conceitos bsicos.

2 Arquiteturas de rede: breve reviso


A organizao do software que gerencia a comunicao atravs de uma rede de uma complexidade bastante elevada. Para que se controle sobre o cdigo produzido, o software dividido em camadas funcionais (Figura 1), cada uma com responsabilidades especficas e interface bem definida. A manuteno de uma interface correta permite que detalhes e algoritmos internos a uma dada camada possam ser alterados sem que isso gere implicaes em outras camadas. Assim, sendo cada camada de software independente, o controle sobre seu funcionamento e seu modo de operao fica facilitado. Uma camada somente se comunica com a camada adjacente imediatamente acima ou abaixo, o que feito atravs dos chamados pontos de acesso. Uma outra forma de comunicao se d entre camadas de mesmo nvel, situadas em mquinas diferentes. Para que isso ocorra, necessrio que uma camada se utilize das outras inferiores para a transmisso real da informao, at chegar sua par, em outro equipamento. Uma dada camada prov servios para sua camada imediatamente superior e utiliza os servios da camada abaixo dela. Atravs da interface entre as camadas se d o acesso de uma camada por outra. Quando uma camada se comunica com sua par, necessrio um protocolo para esta comunicao. O protocolo define claramente quais as regras para iniciar a comunicao, mant-la durante a troca de informaes e termin-la adequadamente. Os protocolos so

Outras shells devem ter seu manual consultado para verificao do formato dos comandos e possveis diferenas semnticas.

Jander Moreira Camada A Camada B


(a)
Interface

Arquiteturas de rede: breve reviso


Aplicao Apresentao Sesso Aplicao Apresentao Sesso Transporte Rede Enlace Fsica Rede Enlace Fsica Rede Enlace Fsica

Camada A
(b)

Camada A

Transporte Rede Enlace Fsica

Figura 1. Camadas em um software de rede: (a) Interface entre camadas adjacentes; (b) Comunicao entre camadas de mesmo nvel em duas mquinas distintas.

responsveis, tambm, pela definio da unidade de transmisso de dados, pelo estabelecimento de endereamento, pelo controle de fluxo e pelo tratamento de erros, entre outros aspectos. A transmisso de dados por um software de rede envolve, desta forma, as definies de como o sinal ser codificado sobre o meio fsico, mecanismos de acesso ao meio fsico, caso este seja compartilhado, definies do formato da informao transmitida e formato do endereamento para identificao dos equipamentos pertencentes a uma comunicao. H vrias arquiteturas de rede atualmente em uso. Dentre estas destacam-se a didtica OSI e a TCP/IP, esta ltima com larga utilizao global. Outras, no menos importantes, incluem ATM, IPX/SPX, DECnet e SNA, entre outras. 2.1 Arquitetura OSI

Figura 2. Esquema da comunicao sob a ptica do modelo OSI.

Rede A camada de rede responsvel pelo conhecimento das interconexes e caminhos disponveis para a transmisso dos dados. Faz o envio de pacotes de dados da mquina origem para a mquina destino, utilizando para isso as camadas de rede de outras mquinas intermedirias no caminho. Mantm controle sobre a topologia da sub-rede de comunicao e sobre o trfego na rede. Prov, tambm, uniformidade global de endereos. Enlace de dados Para que dois equipamentos remotos se comuniquem preciso que outras mquinas, no meio do caminho, retransmitam os dados. A camada de enlace responsvel pela transmisso de dados entre mquinas vizinhas, controlando erros, fluxo e ordem dos dados. Fsica Finalmente, a camada fsica responsvel pelo acesso ao meio de transmisso (cabos, antenas etc.). Define como o sinal transmitido, sua codificao e representao de bits, controle da sincronizao e a taxa de transmisso. A Figura 2 ilustra o esquema de camadas e destaca, na rea hachurada, o subsistema de comunicao, o qual possui, usualmente, somente at a camada de rede, que faz o encaminhamento dos dados ao destinatrio correto. 2.2 Arquitetura TCP/IP

A arquitetura de rede chamada Open Systems Interconnection, ou interconexo de sistemas abertos, define um esquema de software de rede organizado em sete camadas. Aplicao A camada de aplicao cuida da interface do programa do usurio com o software de rede, permitindo a este o uso da infra-estrutura de comunicao. Apresentao Como existem diferentes sistemas operacionais, equipamentos, fabricantes etc. com diferentes implementaes de uma mesma especificao de rede, por vezes necessrio fazer uma adaptao dos dados que so transmitidos pela rede para o sistema em particular. Entre estas adaptaes esto, por exemplo, o formato de representao de inteiros (nmero de bytes, byte mais significativo) e a representao de caracteres (ASCII, EBCDIC). Sesso A camada de sesso mantm controle sobre uma dada comunicao de dados aberta entre duas mquinas, monitorando-a at que a sesso de comunicao se encerre. Transporte Responsvel pelo correto envio de informaes entre mquinas, faz a quebra dos dados em unidades menores. Controla o fluxo da transmisso, garante a entrega dos dados, controla erros e possveis retransmisses. Estabelece, na comunicao, uma conexo entre duas mquinas.

A arquitetura TCP/IP tambm um modelo de referncia estruturado em camadas projetado para ser tolerante a falhas nos segmentos interconectados. Seu nome derivado de seus dois principais protocolos: TCP Tranmission Control Protocol e IP Internet Protocol. Suas camadas tambm so funcionalmente divididas e h uma semelhana direta com algumas das camadas do modelo OSI.

3 2

Jander Moreira

A camada de transporte
Aplicao Transporte Inter-rede Enlace
Figura 3. Arquitetura de rede TCP/IP.
TCP dump mrouted ping traceroute Aplicao

Aplicao Da mesma forma que no modelo OSI, a camada de aplicao est associada aos processos de nvel alto dos usurios e aplicativos. Abrange tambm um bom nmero de protocolos conhecidos, como FTP, TELNET, HTTP e DNS. Transporte A camada de transporte* a responsvel pela transmisso de um fluxo de bytes entre origem e destino, ou seja, entre as camadas pares. Um protocolo importante existente nesta camada o TCP, que um protocolo fim-a-fim orientado a conexo, confivel e que garante a entrega de dados com controle de erros e de fluxo. Outro protocolo o UDP (User Datagram Protocol), que no apresenta conexo e tem seus pacotes de dados menores. Apresenta-se como um protocolo rpido, mas no controla erros, perda de dados ou fluxo na comunicao. Inter-rede Tambm conhecida simplesmente como camada de rede, a camada de inter-rede responsvel pelo estabelecimento de endereamentos para as mquinas, de forma a permitir que os dados sejam transmitidos na forma de pacotes. Cada pacote flui independentemente na sub-rede de comunicao. tambm funo desta camada proporcionar o trajeto para cada pacote, o que envolve o estabelecimento de rotas e controle de trfego e congestionamento. O protocolo IP pertence a esta camada e cuida do trfego de pacotes. Enlace A camada de enlace, ou camada host-net, detm a funo de fazer acesso ao meio fsico para a transmisso efetiva dos dados. O modelo de referncia no especifica nenhum protocolo em particular para esta camada, exceto pelo fato de estabelecer que um protocolo deve ser usado para o envio de dados, dando suporte transmisso dos pacotes. A Figura 3 apresenta a arquitetura TCP/IP, enquanto a Figura 4 ilustra os principais protocolos.

TCP

UDP

ICMP

IGMP

IP

ARP

RARP

BPF DLPI

Linha de dados

Figura 4. Protocolos da arquitetura TCP/IP.

sua duplicidade. O TCP faz o controle do fluxo, controlando a capacidade de recebimento de dados (em um buffer) modificando o nmero de bytes que podem ser transmitidos em um dado momento. Controlando a transmisso, tambm permite que o envio de dados seja em modo full-duplex. Proporciona, assim, confiabilidade e garantia na entrega dos dados. 3.1.1 Estabelecimento e trmino de conexo A conexo feita seguindo-se as seguintes etapas; O servidor preparado para aceitar conexes; O cliente solicita a conexo (SYN), determinando um nmero inicial para a seqncia; O servidor reconhece o SYN (respondendo com um ACK), mandando tambm seu prprio SYN com nmero de seqncia; O cliente responde ao SYN do servidor (com ACK).

3 A camada de transporte
A camada de transporte do TCP/IP a que fornece a ligao entre a aplicao do usurio e o software de rede. Em outras palavras, a que fornece a interface de programao com a rede. Oferece, para isso, os dois protocolos para envio de dados: TCP e UDP. 3.1 TCP

O protocolo TPC orientado conexo. Em outras palavras, opera atravs do estabelecimento de uma conexo, seguida pelo envio e recebimento de dados e, ento, terminada pelo encerramento da conexo. A conexo permite o estabelecimento de vrios parmetros. O controle de seqncia dos dados feito pela numerao dos segmentos, que so fornecidos aplicao (camada superior) na ordem correta, permitindo verificar, tambm, sobre ausncia de segmentos ou

A Figura 5 mostra a seqncia da conexo no tempo. Aps estes passos, os nmeros de seqncia esto definidos, bem como outros parmetros para controle de fluxo. O encerramento da conexo, por sua vez, segue os passos abaixo. Considera-se que a mquina A toma a iniciativa do trmino da conexo j existente com a mquina B. Tanto A como B podem ser clientes ou servidores. A envia um FIN, o que indica um encerramento ativo; 5

Esta camada tratada em mais detalhes na seo 3.

Jander Moreira
Cliente Servidor

A camada de transporte
Aplicao

Buffer da aplicao (qualquer tamanho)

SYN c

escrita Buffer do socket (ajustado na criao do socket) TCP Segmentos de tamanho MSS

SYN s, ACK c+1

ACK s+1

IP

Figura 5. Esquema das trocas de mensagens para o estabelecimento de uma conexo TCP.
A B

Pacotes de tamanho MTU Fila de sada da linha de dados

FIN K

Figura 7. Passos envolvido no envio de dados por parte da aplicao para o protocolo TCP.
ACK K+1

Aplicao

Buffer da aplicao (qualquer tamanho)

FIN N

envio
ACK N+1

Buffer virtual do socket (ajustado na criao) UDP

Figura 6. Esquema das trocas de mensagens para o trmino de uma conexo TCP.

Datagrama UDP

IP

B recebe o FIN e responde com ACK, caracterizando um encerramento passivo; B, ao receber o FIN, repassa para a aplicao um indicador de fim-de-arquivo, o que a leva, aps algum tempo, a identificar o fim dos dados e enviar tambm um FIN; A recebe o FIN e responde com ACK. Na Figura 6 est a troca de mensagens que ilustra o trmino da conexo.

Pacotes de tamanho MTU Fila de sada da linha de dados

3.1.2 Sada de dados TCP O envio dos dados por parte da aplicao feito atravs da escrita destes no socket aberto (Figura 7). A aplicao pode manter um buffer para o envio de dados de tamanho segundo suas necessidades. Ao enviar para o TCP, estes dados so guardados em um buffer de tamanho negociado na abertura da conexo. A escrita de dados no socket corresponde transferncia dos dados do buffer da aplicao para o buffer do TCP. Se no h espao no buffer TCP para guardar todos os dados, o comando de escrita aguarda que este seja liberado, somente retornando quando a transferncia for completada. Ento, o TCP envia os dados para sua camada par (TCP na mquina remota). Somente quando chaga a resposta do recebimento que o buffer liberado para receber mais dados da aplicao. Este envio feito efetivamente atravs de um conjunto de pacotes IP, nos quais os dados so distribudos. Para cada segmento h a incluso do cabealho TCP. O protocolo

Figura 8. Passos envolvido no envio de dados por parte da aplicao para o protocolo UDP. O buffer do UDP no existe realmente, portanto indicado com a linha pontilhada.

IP agrega a estes dados seu prprio cabealho, verifica as rotas e envia os pacotes, o que feito atravs da linha de dados adequada. 3.2 UDP

O protocolo UDP projetado para ser simples e rpido, que opera sem o estabelecimento de conexes. Um datagrama, que a unidade de envio do UDP, encapsulado um pacote IP para envio pela rede. No existe garantia de recebimento e como no h numerao de seqncia, no h garantia de recebimento ordenado. O protocolo no fornece, portanto, confiabilidade.

7 6

Jander Moreira

Unix: breve reviso

Diferentemente do TCP, que opera a transmisso de um fluxo de bytes, o UDP envia datagramas que contm um nico registro com dados. 3.2.1 Sada de dados UDP O envio de dados pelo protocolo UDP (Figura 8) feito pela escrita de dados no socket UDP, que tem tamanho mximo indicado quando de sua criao. Como o protocolo no precisa manter os dados, pois no verifica erros, o buffer no existe na realidade, havendo simplesmente a transmisso dos dados para os pacotes IP, quebrando os dados em fragmentos, se necessrio. 3.3 Nmeros de portas

4 Unix: breve reviso


O Unix um sistema verstil e tem se tornado, nos ltimos anos, mais popular, mesmo entre os chamados leigos. O conhecimento de alguns de seus detalhes importante como base para melhor compreenso do texto, qualificando, principalmente, as relaes entre usurios, as permisses de acesso e as noes bsicas de processos e programas. 4.1 O ncleo do sistema e programas

As transmisses de dados da camada de transporte, seja atravs de TCP ou UDP, so feitas por sockets, que so uma implementao do modelo de referncia TCP/IP. Para que sejam identificadas as vrias transmisses de dados, um nmero de porta associado ao socket. Nmeros de portas so definidos usando 16 bits. Os servidores usam nmeros de portas conhecidos, ou seja, dependendo do servio fornecido, h um nmero padro para ele. No caso dos clientes, como o nmero da porta no relevante, h uma associao de um nmero temporrio, o que faz a porta ser chamada de efmera. As portas conhecidas so numeradas de 0 a 1023, que so as portas restritas. H tambm portas conhecidas de 1024 a 49151, chamadas de portas registradas. Finalmente, as portas efmeras (que so dinmicas), tm nmeros de 49152 a 65535.* Uma transmisso de dados, ento, ocorre entre um par de sockets, caracterizados cada um por seu endereo IP e nmero de porta. Exemplo: conexo TCP entre <IPA,PortaA> e <IPB,PortaB>. 3.4 Limitaes

O ncleo do sistema, chamado kernel, consiste em uma parte do software que gerencia o equipamento. O ncleo carregado para a memria durante o processo de bootstrap, enquanto o sistema iniciado. Uma vez na memria, l permanece at o equipamento ser desligado. , assim, responsvel pelo gerenciamento do sistema. Alm do ncleo, h tambm um conjunto de programas que o sistema disponibiliza como padro, os quais ficam armazenados em disco e so carregados para a memria sob demanda, sendo removidos aps seu trmino. 4.2 Usurios, grupos e permisses

Cada usurio no sistema identificado por um nmero inteiro positivo distinto, o qual atribudo durante o cadastro do usurio. Este identificador referenciado UID. O administrador do sistema, root, tem UID igual a zero, o que lhe confere privilgios especiais de acesso. Alm da identificao individual, cada usurio est associado a um grupo primrio. Assim como usurios, os grupos so identificados por valores inteiros positivos, chamados GIDs. Cada usurio, alm de seu grupo primrio, pode estar associado a outros grupos, chamados secundrios.
$ groups user staff paralelo

O envio de dados afetado por uma srie de fatores, afetando at o tamanho dos pacotes IP. Enumeram-se abaixo algumas destas limitaes: O tamanho mximo de um pacote IP 65535 bytes. Para a verso 6, Ipv6, este limite de 65575 bytes; Dependendo das caractersticas locais da rede, h um tamanho mximo para a unidade de dados: MTU Maximum Transmission Unit. Por exemplo, redes ethernet tm MTU igual a 1500 bytes, enquanto conexes SLIP apresentam MTU tpica de 296 bytes. Quando o tamanho do pacote maior que o MTU, o pacote quebrado em fragmentos. Pacotes IPv4 podem inibir a fragmentao com um bit 1 no campo DF (Dont Fragment); pacotes IPv6 nunca so fragmentados, exceto diretamente na origem. Fragmentaes exigem a montagem do pacote original, o que exige um buffer para armazenamento dos fragmentos. Este buffer tem tamanho mnimo de 576 bytes para IPv4 e 1500 bytes para IPv6). No protocolo TCP, h uma negociao no estabelecimento de uma conexo em particular, a qual identifica um determinado tamanho de mximo de segmento, o qual tenta evitar a fragmentao. Este valor conhecido como MSS Maximum Segment Size.

Os UIDs so o terceiro campo no arquivo /etc/passwd , enquanto os GIDs so o terceiro campo no arquivo /etc/group. Neste ltimo arquivo consta, tambm, para cada grupo, a lista dos usurios que lhe pertencem.*. Cada arquivo no sistema pertence a um usurio, o que feito pela associao de um UID. H, tambm, um GID associado ao arquivo. Atravs destes dois atributos, o sistema verifica quem tem acesso ao arquivo e como este acesso pode ser feito.
$ ls l exemplo -rwxr-xr-1 fulano $ ls ln exemplo -rwxr-xr-1 683 user 112 17500 Oct 25 17500 Oct 25 1999 exemplo 1999 exemplo

No exemplo, o dono do arquivo exemplo o usurio fulano, que pertence ao grupo user. O arquivo tem UID 683 e GID 112.

* Em sistemas que utilizam o NIS, possvel obter a listagem dos usurios e grupos com os comandos ypcat passwd e ypcat group. Se o NIS+ for utilizado, os resultados podem ser obtidos por niscat passwd.org_dir e niscat group.org_dir.

Note que o termo arquivo usado, aqui, no sentido descrito na seo 4.4.

Deve-se notar que, dependendo do sistema, estes intervalos podem variar.

Jander Moreira
Tabela I. Bits de permisso para arquivos e seus significados. Mnemnico
r w x

Comunicao entre processos: sockets Os diretrios indicam agrupamentos lgicos de arquivos de quaisquer tipos, inclusive outros diretrios. Entradas especiais para diretrios incluem o . (ponto), que indica o diretrio corrente e o .. (ponto, ponto), que indica o diretrio pai, i.e., o predecessor na hierarquia; barras normais (/) so usadas para a separao entre diretrios. Arquivos de dispositivos de caracteres ou de blocos permitem ao sistema a comunicao com hardware e perifricos. Mdulos* do kernel so conectados na iniciao do sistema de arquivos, passando a gerenci-los. Acessos a estes arquivos so interceptados pelo kernel, que repassa as chamadas s rotinas dos drivers. Dispositivos de caracteres gerenciam fluxos de bytes com resoluo de um caractere, mantendo buffers de entrada e sada prprios. Dispositivos de blocos lidam com dados em grupos de bytes (usualmente mltiplos de 512), sendo que o kernel o responsvel pelo controle dos buffers. Exemplos de arquivos de dispositivos so os que indicam os discos rgidos, os disquetes, as portas seriais etc. Arquivos socket so especificaes BSD utilizadas para a comunicao entre processos, principalmente processos de rede. Similares aos sockets, os named pipes so arquivos para comunicao entre processos independentes em uma mesma mquina. Finalmente, arquivos de link so referencias a outros arquivos de quaisquer tipos. Em tarefas cotidianas, o sistema no distingue o link do arquivo real, localizando os dados diretamente. Os links podem ser rgidos ou simblicos (hard e symbolic, respectivamente).
% ls -ld /etc/{aliases,csh.cshrc} /var /dev/{xdb,zqft0,zqft1} brw-r----crw-rw---crw-rw----rw-r--r-1 root 1 root 1 root 1 root disk disk disk root 13, 27, 27, 64 May 5 1998 /dev/xdb 1999 /dev/zqft0 1999 /dev/zqft1 1999 /etc/aliases 1999 /etc/csh.cshrc -> 16 Apr 17 16 Apr 17 732 Apr 19 21 Dec 8

Diretrios Listagem dos arquivos do diretrio Criao, remoo, alterao de nomes de arquivos e diretrios Acesso ao diretrio (comando cd)

Demais arquivos Leitura do contedo Alterao do contedo Execuo como um processo

Tabela II. Codificao octal para os bits de permisso. Octal


0 1 2 3 4 5 6 7

Bits
000 001 010 011 100 101 110 111

Permisses
----x -w-wx r-r-x rwrwx

Alm de pertencer a um usurio e a um grupo, os arquivos tm atributos chamados permisses. As permisses verificam a forma de acesso ao arquivo e seus dados, sendo identificadas por r, w e x. A Tabela I mostra os significados de cada atributo, que depende do tipo de arquivo. Na Tabela II encontram-se as codificaes numricas (em octal e em binrio), alm do significado produzido pelo comando ls. O primeiro grupo de permisses refere-se aos acessos do usurio, o segundo a outros usurios pertencentes ao grupo associado ao arquivo e o terceiro a todos os outros usurios. No exemplo acima, o dono do arquivo pode ler, alterar e executar (rwx), usurios do grupo user podem ler e executar (rx) e os demais usurios podem apenas ler o contedo (r--). 4.3 Programas e processos

lrwxrwxrwx 1 root root /leopardo2/adm/.cshrc drwxr-xr-x 14 root root

Um programa um arquivo contendo um cdigo capaz de ser executado, podendo ser tanto um programa compilado (em C, C++ ou Pascal) ou interpretado (como scripts em Perl ou shell). Quando um programa posto em execuo, o sistema cria um processo, o qual, alm do cdigo do programa, tem sua rea de dados e outros controles utilizados pelo sistema. Dentre estes controles, mantido o dono do processo (usurio) e seu grupo, assim como a identificao do processo (um nmero inteiro positivo denominado PID). Todo processo pertence a um usurio e a um grupo, tendo, portanto, seu UID e seu GID. Alguns processos podem pertencer a um dado usurio e executar com as permisses de outro. Outros dois atributos dos processos so seu EUID e seu EGID: os valores efetivos de usurio e grupo. Atravs do EUID e do EGID o sistema determina quais so as permisses de acesso que o processo tem em relao ao sistema e aos arquivos. 4.4 Arquivos e tipos de arquivos

1024 Jun 14 19:22 /var

5 Comunicao entre processos: sockets


Existem vrias formas de comunicao entre processos (aplicaes) no Unix. Estas podem ser vistas no Apndice V.c. Quando a comunicao se d atravs da rede, a forma mais comum pelo uso de sockets. Os sockets proporcionam uma interface com o ncleo do sistema, permitindo a passagem de estruturas para o ncleo e obtendo estruturas do ncleo. Em outras palavras, o socket permite aplicao o acesso ao software de rede. 5.1 Estruturas de endereo de socket

Os arquivos, no Unix, representam, alm de conjuntos de dados, outras entidades do sistema. Arquivos normais so os arquivos no sentido mais usual da palavra, ou seja, agrupamentos de bytes que representam alguma informao. Estas informaes podem ser textos, imagens, cdigos de programas em uma dada linguagem, o cdigo executvel (compilado) de um programa, cdigos de bibliotecas de funes etc. Para estes arquivos, tanto acesso seqencial como aleatrio so, geralmente, permitidos.

A maior parte das funes de manipulao de sockets necessita da especificao de uma estrutura de endereo de protocolo. Esta estrutura de endereo corresponde especificao dos dados necessrios a uma comunicao, como por exemplo o endereo da mquina na rede, a porta utilizada etc. Para o IPv4, a estrutura definida como abaixo.

Nesta acepo, a palavra mdulo define os device drivers, tanto os compilados com o kernel quanto os carregados dinamicamente (por demanda).

11 10

Jander Moreira
struct in_addr{ in_addr_t }; struct sockaddr_in{ uint8_t sa_family_t in_port_t struct in_addr char };
Conexo
connect() bind() socket()

Comunicao entre processos: sockets


s_addr; /* endereo de 32 bits */

sin_len; sin_family; sin_port; sin_addr; sin_zero[8];

/* comprimento da estrutura */ /* AF_INET */ /* nmero de porta TCP/UDP */ /* endereo IPv4 */ /* sem uso */

Servidor TCP

listen() socket() accept()

Os principais pontos a serem destacados na estrutura so:


sin_len: o nmero total de bytes da estrutura; sin_family: especifica o a famlia de protocolos, atravs de valores pr-definidos. Para o caso do IPv4, este valor o da constante AF_INET; sin_port: indica o nmero da porta usado em uma transmisso. No caso de uma comuRequisio read() Processamento write() Resposta read() write()

nicao usando TCP, contm o nmero da porta relacionada a um dado servio;


sin_addr: o campo que contm o endereo de rede do socket. Por exemplo, pode ser

o endereo IP de uma mquina; Existe mais um campo, o sin_zero, que apenas arredonda complementa o tamanho de bytes do registro, devendo sempre conter valores iguais a zero. usual preencher toda a estrutura com zeros e, ento, preencher os demais campos. Para o IPv6, a estrutura utilizada a apresentada abaixo. Os campos so semelhantes em contedo e significado, diferenciando-se, destacadamente, no nmero de bytes do endereo.
struct in6_addr{ uint8_t }; struct sockaddr_in{ uint8_t sa_family_t in_port_t uint32_t struct in6_addr }; sin6_len; sin6_family; sin6_port; sin6_flowinfo; sin6_addr; /* comprimento da estrutura */ /* AF_INET6 */ /* nmero de porta TCP/UDP */ /* prioridade e fluxo */ /* endereo IPv4 */ s6_addr[16]; /* endereo de 128 bits */
EOF read() close()

close()

Figura 9. Funes de socket em uma comunicao modelo cliente-servidor usando TCP.

do servidor ser disponibilizado. Ento o servidor executa listen para entrar no modo passivo e aceitar conexes. Uma conexo aceita atravs do comando accept, que fica aguardando um pedido eventual de conexo. No lado do cliente, a funo socket tambm cria o acesso rede, sendo seguida de connect, que solicita a conexo ao servidor. Criada a conexo, cliente e servidor entram em um ciclo de solicitaes por parte do cliente e respostas por parte do servidor, at que o cliente decida encerrar a conexo, o que feito pela funo close. Ao fechar a conexo, o cliente a indica ao servidor enviando uma notificao de fim-de-arquivo (EOF). Na prxima leitura por parte do servidor, o EOF reconhecido e o close encerra a conexo por parte do servidor. Na seqncia so apresentadas as descries das principais funes utilizadas. socket Esta funo permite a comunicao via rede, indicando o tipo de protocolo a ser usado (e.g., TCP ou UDP).
int socket(famlia, tipo, protocolo)

5.2

Funes para uso de sockets em comunicao TCP

O acesso aos sockets feito atravs de um conjunto de funes, as quais permitem criar, enviar e receber dados e encerrar uma dada comunicao. Em geral, as aplicaes operam no modelo cliente-servidor, com uma aplicao servidora aguardando conexes e aplicaes clientes, as quais fazem requisies ao servidor. A Figura 9 apresenta este modelo cliente-servidor baseado em conexo TCP, ilustrando o uso das funes. Assume-se, inicialmente, que o servidor iniciado. A aplicao do servidor deve primeiro criar o socket para acesso rede, o que feito pela funo socket. A funo bind permite associar o endereo da mquina e especificar a porta na qual o servido 12

O parmetro famlia especifica a famlia de protocolos, indicando, por exemplo, sockets do Unix, IPv4, IPv6. Tipo especifica o formato da comunicao, indicando se por 13

Clente TCP

Jander Moreira
Tabela III. Famlias de protocolos para o socket. Constante
AF_INET AF_INET6 AF_LOCAL

Comunicao entre processos: sockets Caso um endereo no seja especificado para um socket, uma porta efmera associada automaticamente pelo ncleo do sistema. Nestes casos (e tambm em outros), possvel saber os valores associados ao endereo atravs da funo getsockname , a qual retorna uma estrutura-de-endereo. listen O servidor converte um socket para funcionar em formato passivo (para aceitar conexes) com a funo listen, a qual especifica tambm o nmero mximo de conexes que podem ser atendidas pelo servidor neste socket.
int listen(sockid, max-conexes)

Significado Protocolo IPv4. Protocolo IPv6. Protocolo de sockets do Unix.

Tabela IV. Tipos de comunicao para o socket. Constante


SOCK_STREAM SOCK_DGRAM SOCK_RAW

Significado Comunicao por fluxo de bytes. Comunicao por datagramas. Comunicao direta com o socket.

Tabela V. Resultado de combinaes especficas de famlias de protocolos e tipos de comunicao. O termo vlido indica que a opo usada, mas no existe um nome para ela; invlido representa uma combinao sem sentido.
AF_INET SOCK_STREAM SOCK_DGRAM SOCK_RAW AF_INET6 AF_LOCAL

Max-conexes indica este nmero mximo de conexes aceitas, que compreedem tanto as j completadas como as que j foram solicitas e ainda no completadas. * accept Os pedidos de conexes que chegam ao servidor so mantidos em uma fila. A funo
accept processa o primeiro pedido da fila. Se a fila estiver vazia, o processo do servidor

TCP UDP IPv4

TCP UDP IPv6

Vlido Vlido Invlido

fluxo de bytes, datagrama ou direta. Finalmente, protocolo assume geralmente valor zero, exceto para o tipo direto. Na Tabela III esto as famlias de protocolos e a Tabela IV apresenta os tipos de comunicao para o socket. O resultado de combinaes de famlias de protocolos e tipos so ilustrados na Tabela V. Por exemplo, AF_INET (IPv4) e SOCK_STREAM (fluxo de bits) indicam uma comunicao TCP usando a verso 4 do protocolo IP. O valor de retorno da funo socket um nmero inteiro positivo, que usado como identificador do socket criado, devendo ser usado nas demais funes. connect
connect usado pelo cliente para estabelecer uma conexo com o servidor.
int connect(sockid, estrutura-de-endereo, tamanho)

suspenso at que um pedido chegue.


int accept(sockid, estrutura-de-endereo, tamanho)

Sockid o socket no qual a conexo est sendo esperada e, ao receber o pedido, os dados do cliente so retornados na estrutura-de-endereo, juntamente com seu tamanho. Se no houver interesse nos dados do cliente, pode-se especificar null para ambos os parmetros. Se a conexo for estabelecida, um novo descritor criado pelo ncleo, sendo seu identificador o valor de retorno do accept. O identificador sockid o socket do servidor; o identificador retornado pela funo um novo socket, que compe a conexo recm criada com o cliente. close O close utilizado para terminar a conexo e para fechar o socket, deixando o sockid utilizado sem qualquer uso posterior. Se ainda houver dados na fila de sada da conexo, estes dados sero enviados antes do trmino da conexo.
int close(sockid)

O socket usado para a conexo identificado pelo parmetro sockid. O parmetro estrutura-de-endereo (apresentado na seo 5.1) deve ser preenchido com os dados do servidor com o qual a conexo deve ser feita. Como esta estrutura pode ter tamanhos diferentes, que dependem da famlia de protocolos utilizada, seu tamanho tambm especificado para a funo. Se a funo for bem sucedida e a conexo estabelecida, seu valor de retorno zero. Em caso de erros, o valor de retorno pode ser, entre outros: ETIMEDOUT, quando o servidor no responde; ECONNREFUSED, quando o servidor no dispe de nenhum servio para a porta especificada; EHOSTUNREACH ou ENETUNREACH, quando no h caminho para a mquina ou para a rede especificada, respectivamente. bind O termo bind usado para associar um endereo de protocolo ao socket.
int bind(sockid, estrutura-de-endereo, tamanho)

getsockname, getpeername As funes getsockname e getpeername so usadas para obter os endereos de protocolo associados, respectivamente, ao socket local e ao socket remoto.
int getsockname(sockid, estrutura-de-endereo, tamanho) int getpeername(sockid, estrutura-de-endereo, tamanho)

Ambas as funes retornam zero se forem bem-sucedidas e -1 caso falhem.

O socket a ser usado na associao o identificado por sockid. Os endereos de rede e porta, que so o endereo de protocolo, esto indicados na estrutura-de-endereo, que deve ser passada com seu respectivo nmero de bytes (tamanho). Deve-se notar que o endereo IP deve ser de uma interface vlida da mquina. 14

Os nmeros exatos e o comportamento dependem da implementao especfica e do sistema operacional utilizado.

15

Jander Moreira
socket()

Interpretadores de comandos: Shells de retorno para as duas -1 em caso de erro, ou o nmero de bytes transferidos quando bem sucedidas.
Clente UDP
size_t recvfrom(sockid, buffer, nmero-de-bytes, parmetros, estrutura-de-endereo, tamanho) size_t sendto(sockid, buffer, nmero-de-bytes, parmetros, estrutura-de-endereo, tamanho)

Servidor UDP

bind()

recvfrom() socket() Espera at recebimento de datagrama Requisio

Os parmetros sockid, buffer e nmero-de-bytes so os mesmos de read e write. Parmetros so usados para alterar alguns comportamentos de envio e recebimento. Estrutura-de-endereo o registro que identifica o interlocutor remoto da comunicao (para quem enviar os dados ou de quem receb-los). Devem, evidentemente, especificar endereo e porta. O tamanho da estrutura pode variar conforme o protocolo usado (e.g., IPv4 ou IPv6), portanto o tamanho da estrutura tambm consiste um parmetro. Para o caso do sendto, devem ser preenchidos os dados do destinatrio; quando se usa o recvfrom, os dados so preenchidos com o endereo do remetente, permitindo identificar a origem do datagrama.

sendto()

Processamento

sendto()

Resposta recvfrom()

6 Interpretadores de comandos: Shells


close()

Figura 10. Funes de socket em uma comunicao modelo cliente-servidor usando UDP.

Uma shell, conhecida principalmente pelo seu papel de interpretao de comandos, muito mais que uma interface entre o usurio e o sistema, desempenhando vrios outras funes. 6.1 A shell e o sistema

read, write As funes read e write so usadas para enviar dados (bytes) para um descritor ou para recuperar dados de um descritor. O descritor, neste caso, pode ser tanto um descritor de arquivos como, no caso de programao para redes, um descritor de socket criado pela funo socket.
int read(fd, buffer, nmero-de-bytes) int write(fd, buffer, nmero-de-bytes)

A iniciao do sistema comea com a ROM carregando o ncleo do sistema, o qual assume o papel da execuo e faz a anlise do hardware e carrega o software necessrio para utilizar os discos, a placa de rede e os demais dispositivos conectados. Ento, so criados os chamados processos espontneos, que so os principais processos de gerenciamento do sistema. Segue-se a esta etapa a execuo das rotinas de configurao e a entrada no sistema no modo multiusurio. Dentre os processos espontneos, o init (ou xinit, em algumas verses mais recentes) o responsvel pelo gerenciamento dos demais processos. Uma de suas atribuies acionar um outro processo, conhecido pelo nome genrico getty*. O getty monitora as portas de acesso ao sistema, aguardando a tentativa de utilizao por parte do usurio. Quando reconhecida esta tentativa, o processo de login disparado, sendo o responsvel por autenticar o usurio no sistema e lhe permitir o acesso. Este acesso, em sua forma mais comum, feito provendo o usurio de um interpretador de comandos: a shell. Terminada a utilizao da shell, o init informado e o ciclo se reinicia. 6.2 Funes da shell A shell , sim, um interpretador de comandos, mas assume muitas outras funes: Execuo de programas; Direcionamento de entrada e sada;

Em ambas as funes, fd indica um descritor de arquivos ou socket. O buffer uma rea de dados do qual sero copiados os dados ou para o qual os dados sero transferidos. A quantidade de dados disponvel (em bytes) o ltimo parmetro. 5.3 Funes para uso de sockets em comunicao UDP

A comunicao utilizando UDP tem suas diferenas em relao TCP, sendo a principal a ausncia de conexo. Outras diferenas incluem ser o UDP um protocolo de datagramas e no apresentar confiabilidade. A Figura 10 mostra esta comunicao. O cliente no estabelece uma conexo com o servidor, mas apenas faz o envio de solicitaes atravs da funo sendto, a qual tem o endereo do destinatrio como parmetro. Analogamente, o servidor no fica aguardando conexes, ficando apenas o aguardo de datagramas enviados por clientes. recvfrom, sendto As funes sendto e recvfrom tm operao similar s funes read e write. Seus parmetros, entretanto, so diferentes, pois acrescentam outras funcionalidades. O valor 16

A nomenclatura varia consideravelmente de acordo com o sistema operacional utilizado.

17

Jander Moreira

Interpretadores de comandos: Shells


adduser maillog secure wtmp

Controle de variveis e substituio de nomes; Criao e controle de pipelines; Controle do ambiente do usurio; Disponibilizao de uma linguagem de programao.

Pipelines Um pipeline (ou pipe) um canal de comunicao entre processos, o que faz com que a sada de um seja redirecionada como entrada do outro. vivel, assim, encadear vrios comandos sem a necessidade de gravar resultados temporrios em arquivos
$ ls *gz | wc l 17

Execuo de programas A shell, enquanto interagindo com o usurio, opera ciclicamente, cobrindo as seguintes etapas: Apresentao do prompt ao usurio; Espera da digitao dos comandos e o pressionamento da tecla ENTER; Acionamento do programa especificado; Espera do trmino da execuo.

Quando no interagindo com o usurio, a shell faz o papel de acionamento da execuo de um programa, provendo o ambiente necessrio para sua correta operao. Quando o usurio digita uma linha de comando, a shell a interpreta, buscando reconhecer o comando que deve ser executado e seus argumentos. A separao entre os elementos em uma linha de comando feito atravs da utilizao dos espaos em branco, que so caracteres que indicam para a shell a distino entre os elementos contidos na linha de comando. Assim, os comandos abaixo contm como programa o comando ls e argumentos a, prog.C e texto.txt , mesmo havendo o uso de vrios espaos na segunda linha apresentada.
$ ls a prog.C texto.txt $ ls a prog.C texto.txt

O comando ls faz a listagem de cada arquivo terminado em gz, sendo que cada arquivo apresentado em uma linha. O comando wc, por sua vez, apresenta o nmero de linhas (opo l) que sua entrada tem. O resultado do pipe que a sada da listagem no apresentada na tela, mas usada como entrada para o wc, o qual indica o resultado: 17 arquivos terminados com gz. Durante a execuo de processos conectados por pipes, no so utilizados arquivos temporrios, sendo que o ncleo do sistema gerencia como os dados fluem entre cada par de processos. No exemplo seguinte, o comando ls tem o tamanho dos arquivos separados pelo cut (colunas de 28 a 30); os tamanhos so ordenados numericamente pelo comando sort.
$ ls -la | cut -c 28-33 | sort -n 396 398 512 512 512 512 512 732 980 992 1024 1071 1391 2880 2884 4855

O primeiro elemento considerado o comando ou a especificao de um programa, enquanto os demais so os argumentos que o programa estar utilizando. Direcionamento de E/S A shell permite que entradas e sadas sejam redirecionadas, ou seja, seja associadas a outro dispositivo ou arquivo. Desta forma torna-se possvel que os resultados produzidos por um comando sejam armazenados em um arquivo (redirecionados para o arquivo) e que os dados de entrada sejam obtidos a partir de um dispositivo de fita magntica (a entrada associada ao dispositivo). Ao ser executado, o programa processa os dados contidos na fita e armazena os resultados em um arquivo. Eventuais mensagens de erro, neste exemplo, continuam a ser apresentadas na tela, j que a entrada de erros no foi redirecionada.
$ wc <texto >resultados

No exemplo acima, o comando wc executado tendo como dados o que est contido no arquivo texto e grava os resultados no arquivo resultados. Variveis e substituio de nomes Alm de interpretar comandos, a shell mantm controle sobre variveis, permitindo que o usurio tenha maior flexibilidade na elaborao de comandos.
$ diretrio=/var/log $ ls $diretrio # definio da varivel # acesso ao contedo da varivel

Controle do ambiente O ambiente um conjunto de configuraes mantido pela shell para que os comandos sejam executados corretamente. Inclui informaes sobre quem o usurio, qual diretrio o atual, em quais outros diretrios programas sero procurados quando digitados na linha de comando, qual o tipo de terminal que est sendo utilizado etc.
$ env

19 18

Jander Moreira HOSTNAME=mig LD_LIBRARY_PATH=/home/alunos/ingres/lib:/usr/lib:/usr/openwin/lib MANPATH=/usr/share/man:/usr/local/man:/usr/openwin/man:/usr/dt/man USER=fulano MACHTYPE=i386-pc-openbsd2.8 MAIL=/var/mail/fulano TOMCAT_HOME=/usr/local/tomcat JAVA_HOME=/usr/local/jdk1.1.8
Tabela VI. Caracteres curingas. Caractere
* ? [listacaracteres] [!listacaracteres]

Interpretadores de comandos: Shells

Significado Coincide com qualquer seqncia de zero ou mais caracteres. Coincide com exatamente um caractere qualquer. Coincide com qualquer caractere especificado na lista de caracteres indicada. Coincide com qualquer caractere que no esteja especificado na lista; o smbolo ! indica a negao.

Tabela VII. Smbolos de direcionamento de entrada e sada. Smbolo


>arquivo >>arquivo

Linguagem de programao Um dos recursos mais poderosos das shell tornar disponvel uma linguagem de programao. Esta linguagem tem sintaxe variada conforme o tipo de shell utilizada, mas so fornecidos recursos semelhantes em todas elas. A linguagem permite, assim, controle sobre: Variveis; Comandos condicionais; Comandos de repetio; Acesso a parmetros; Criao de subrotinas; etc.

<arquivo 2>arquivo comando1|comando2

Significado Faz com que a sada padro seja direcionada para o arquivo especificado. Faz com que a sada padro seja direcionada para o final do arquivo especificado, acrescentando sempre novos dados ao seu final. Faz com que a entrada padro seja direcionada, pegando informaes a partir do arquivo especificado. Faz com que a sada de erros seja direcionada para o arquivo indicado. Faz o pipe entre os comandos, direcionando a sada de comando1 como entrada de comando2.

each named directory, ls displays the names of files contained within that directory, as well as any requested, associated information. If no operands are given, the contents of the current directory are displayed. If more than one operand is given, non-directory operands are displayed first; directory and non-directory operands are sorted separately and in lexicographical order. The options are as follows: -A List all entries except for ``.'' and ``..''. Always set for the superuser.

Como o reconhecimento de comandos e outros elementos da linguagem so feitos medida que o texto obtido, a linguagem interpretada. Assim, no se gera um cdigo executvel, mas so utilizados scripts (arquivos com comandos) para a especificao de programas usando a linguagem da shell. 6.3 Conceitos bsicos

Alm dos comandos, a shell permite o uso de vrios outros recursos para a manipulao de como os comandos so interpretados, como pipes podem ser criados, etc. Alguns destes conceitos bsicos so apresentados na seqncia. Caracteres curingas Alguns caracteres so especiais para a shell, apresentando significado especfico. Estes caracteres curingas permitem a substituio do texto digitado na linha de comando por nomes de arquivos presentes nos diretrios. Na Tabela VI encontram-se as especificaes dos caracteres curingas e seus significados. Na utilizao prtica, estes caracteres so combinados com outros, permitindo selees de nomes de arquivos de forma bem verstil. Exemplos: a* indica todos os arquivos que iniciam com a letra a; p*c so os arquivos iniciados com a letra p e terminados com a letra c (pc, produtoc, prog1.c, prog2.c etc.); ??? coincide com qualquer nome de arquivo com exatamente trs caracters (abc, a.c, pr1 etc.); ex.[cCh] representa os arquivos de nome ex com extenses .c, .C ou .h; ex.[!cCh] so todos os outros arquivos de nome ex, exceto os com as extenses .c, .C e .h. Combinaes destes caracteres so possveis, criando expresses como [Cc]ap*[123], que coincidiria com arquivos de nome capitulo1, cap_1, Capitulos_1_a_3, capitalismo2 etc.

H uma imensa lista de programas disponvel para o usurio. Alguns deles esto presentes neste texto e so utilizados de formas diversas. A consulta sobre as opes de cada um ou sobre uma descrio mais detalhada fica a cargo do leitor. Como auxlio, importante colocar que um dos comandos mais importantes do Unix o comando man. Atravs dele possvel consultar as pginas do manual para a grande maioria dos comandos disponveis. So apresentadas descries sobre a funcionalidade dos comandos, sobre seu parmetros e sobre comandos correlatos.
$ man ls LS(1) NAME ls - list directory contents SYNOPSIS ls [-1ACFLRSTWacdfgiklmnopqrstux] [file ...] DESCRIPTION For each operand that names a file of a type other than directory, ls displays its name as well as any requested, associated information. For OpenBSD Reference Manual LS(1)

21 20

Jander Moreira

Interpretadores de comandos: Shells


$ echo a $inexistente b a b

Entrada e sada padro; sada padro de erros Associado a cada programa em execuo, existem a entrada padro, a sada padro e a sada de erros, respectivamente chamadas standard input, standard output e standard error. A entrada padro o dispositivo atravs do qual o programa consegue obter dados e , na sua forma mais comum, associada ao teclado, pegando informaes digitadas pelo usurio. A sada padro, geralmente associada ao terminal de vdeo, corresponde canal atravs do qual os dados produzidos pelo programa so apresentados. A segunda sada, a sada de erros, tambm associada ao terminal de vdeo e utilizada para a apresentao de mensagens de erro produzidas pelo programa. A alterao das entrada e sadas padro, como j mencionado, conhecido como direcionamento. Os smbolos >, >>, < e | so interpretados pela shell para fazer estas alteraes, conforme a Tabela VII.
$ ls > arqtmp $ wc l < arqtmp 43 $ wc l < arqtmp > cont $ ls | wc l > cont $ ls *.c >> arqtmp # entrada: arqtmp; sada: cont # sem o uso do temporrio arqtmp # acrescenta dados ao arquivo arqtmp # erros armazenados em arquivo # resultado do comando para o arquivo # usa arqtmp como entrada para o wc

Quando necessrio concatenar uma varivel a um texto, preciso isolar o nome da varivel do texto.
$ nome=prog $ echo $nome01.c .c $ echo ${nome}01.c prog01.c # ${nome} equivale a $nome # varivel $nome01 no existe

Caracteres especiais, como tabulaes, podem ser especificados como contedo de variveis ou em outras situaes. Cada shell tem um modo diferente de representar estes caracteres. Uma possibilidade usar o formato $\t para a tabulao; outros caracteres possveis so, por exemplo, \n para mudana de linha, \r para carriage return, \b para backspace, \f para form feed, ou \nnn para qualquer caractere, usando um valor octal. Quotes Vrios caracteres so especiais no modo de interpretao da shell, como *, ? e $. Este significado especial pode ser removido utilizando-se o que chamado quote*. A forma mais simples o uso do caractere de barra reversa \, o qual elimina o significado especial do caractere que o segue.
$ nome=prog $ echo $nome prog $ echo \$nome $nome

$ ls *.h *.c > arqtmp 2> arqerros

Tambm so equivalentes as notaes 1> e > para direcionamento da sada padro, bem como pode ser usado o formato 2>> para acrescentar erros a um arquivo. Listas de comandos As shells permitem que vrios comandos sejam especificados em uma nica linha, usando-se pontos-e-vrgulas para a separao.
$ cd /etc; more motd # muda de diretrio e executa more

Outra forma atravs do uso de aspas, que podem ser simples (), duplas () ou reversas (`). Cada uma tem suas caractersticas distintas. Aspas simples removem o significado especial de quaisquer caracteres nela inseridos, incluindo espaos (que so separadores), variveis, substituio de nomes de arquivos, direcionamentos de entrada e sada e aspas reversas.
$ nome=Fulado Tal Tal: command not found $ nome=Fulano Tal $ echo $nome = $nome $nome = Fulano Tal $ echo * agenda idades nomes telefones $ echo * * # * indica qualquer arquivo # dois valores # erro no formato # espao no mais separador

6.4

Recursos de programao da shell

A linguagem de programao interpretada que a shell implementa permite utilizar vrios recursos de programao, desde variveis e comandos condicionais at repeties e sub-rotinas, alm de permitir controle de processos. Variveis As variveis so criadas conforme a demanda e no possuem tipo. Algumas implementaes de shell, porm, permitem variveis tipadas. Uma varivel especificada atravs do uso do caractere $ antes de seu identificador.
$ v=prog.c $ echo $v prog.c $ ls la $v -rw-r--r-1 fulano 300 # lista informaes 40 Jan 21 10:48 prog.c # cria varivel v # mostra seu contedo

Variveis inexistentes, quando tm seu valor consultado, retornam vazio, mas no h mensagens de erro. 22

Citao, pois a forma mais comum colocar os caracteres entre aspas.

23

Jander Moreira

Interpretadores de comandos: Shells


Tabela VIII. Argumentos para scripts. Varivel
$0 $1, $2 $9 $# $* $@ $$ $! $?

Aspas duplas operam da mesma forma que aspas simples, sendo, porm, menos restritivas. Dentro de aspas duplas ainda so avaliadas as variveis e so considerados os significados especiais com o uso da barra reversa e aspas reversas.
$ nome=Fulano Tal $ echo $nome = $nome Fulano Tal = Fulano Tal $ echo * * # espao no mais separador

Significado Nome do programa. Cada um dos nove primeiros parmetros. Nmero de parmetros. Todos os parmetros. Todos os parmetros, cada um contido em aspas duplas. Nmero de processo do script. Nmero de processo do ltimo processo executado. Valor de retorno do ltimo processo executado.

Finalmente, as aspas reversas permitem a execuo de um comando, substituindo seu lugar pelo resultado produzido.
$ date Tue Mar 19 15:20:32 BRT 2002 $ echo hoje: date hoje: date $ echo hoje: `date`. # date executado antes de echo

shift permite acesso aos demais parmetros. Usar shift n equivale a executar o comando

n vezes. Outras variveis teis incluem a verificao do nmero atual de parmetros, valores dos identificadores de processos, entre outros. Estas variveis esto sumariadas na Tabela VIII. Como, em geral, opes passadas para os programas assumem o formado de um sinal de menos seguido de uma letra simples*, o programa getopts pode ser usado para verificar quais as opes passadas e checar se cada uma delas exige um argumento especfico ou no. Cada vez que chamado, modifica o valor de uma varivel com a opo (e.g., -m). Atualiza, tambm, as variveis $OPTIND e $OPTARG com, respectivamente, o nmero de opes e com o argumento da opo corrente. O trecho de programa seguinte mostra um exemplo de uso do getopts. Os parmetros reconhecidos so m e t argumento, o que indicado no parmetro mt:.
while getopts mt: opcao do case opcao in m) t) *) esac done trata m ;; trata t; argumento=$OPTARG ;; trata erro de opo invlida ;;

hoje: Tue Mar 19 15:21:50 BRT 2002. $ echo Existem `who | wc l` usurios no sistema Existem 10 usurios no sistema

6.5

Programas

Programas na linguagem da shell so armazenados em arquivos texto, com o atributo de execuo ajustado. Ao se executar um destes programas, chamados scripts, a shell interpreta seu contedo. Tudo o que possvel fazer em uma shell interativa em termos de programas, possvel fazer em um script. A recproca tambm verdadeira. Assim, scripts utilizam variveis, comandos condicionais, repeties, direcionamentos de entrada e sada etc., assim como estes podem ser utilizados diretamente na shell interativa. Comentrios so iniciados aps o caractere #, sendo que todo o restante da linha ignorado.
$ more exemplo # Exemplo de um script simples, para informar quantos usuarios # estao conectados ao sistema no momento echo Existem `who | wc l` usurios no sistema $ ls l exemplo -rwxr-xr-x $ exemplo Existem 14 usurios no sistema 1 fulano 300 389 Jan 21 10:46 exemplo

O trecho acima aceita opes como m, -t 10, -m t 10 ou -t 10 m. Note-se, ainda, que as opes devem estar antes de quaisquer outros argumentos quando especificados na lista de comandos. Comandos condicionais O comando condicional assume sua forma principal como if., alm de construes como case, && e ||. O comando if tem o formato padro indicado a seguir. Caso comandoteste retorne valor igual a zero, os comandos associados ao then so executados; caso retorne diferente de zero, os comandos relativos ao else so executados. A clusula do else opcional.

Como recursos de programao, existe a possibilidade de passagem de parmetros, comandos condicionais e de repetio, os quais so tratados a seguir. Argumentos (parmetros) Parmetros de linha de comando so acessveis no script atravs de variveis especiais. O valor da varivel $0 contm o nome do programa (o script) sendo executado. As variveis de $1 a $9 contm os nove primeiros parmetros. Caso haja mais que nove parmetros, o comando shift elimina o argumento $1, de forma que $1 passa a conter o valor de $2, $2 o de $3, e assim sucessivamente at $9 conter o valor do dcimo parmetro. Repeties do 24

Esta tendncia j no to forte, com a proliferao de opes no formato --nomeopo.

25

Jander Moreira if comandoteste then


comandos

Interpretadores de comandos: Shells Para o caso do &&, a execuo do segundo comando somente ocorrer se o primeiro terminar retornando valor zero, o que indica, por conveno, que no houve erros em sua execuo. A alternativa do || para o caso de se querer executar o segundo comando quando o valor de retorno do primeiro for no nulo (indicando erros). Comandos de repetio Comandos de repetio assumem as formas de for, while e until. O comando for tem o formato apresentado abaixo, no qual os comandos so executados para cada palavra indicada na lista. A varivel de controle assume o valor de uma palavra especificada para cada execuo do lao.
for var in listapalavras do comandos done

else comandos fi

Para auxiliar as comparaes, o sistema disponibiliza o programa test, o qual permite avaliar expresses relacionais, lgicas e fazer testes de atributos de arquivos e em cadeias de caracteres. Quando o nmero de ifs aninhados grande, pode-se usar o elif, que equivale a else if, sem a necessidade de fechar cada comando.
if comandoteste1 then
comandos

elif comandoteste2 then comandos elif comandoteste_k then comandos else comandos fi

Como caso especial, a parte que contm o in listapalavras pode ser omitido, e o lao executado para cada parmetro passado na linha de comando. Repeties baseadas em condies so feitas pelos comandos while e until.
while comandoteste do comandos done

O while repete o lao tantas vezes quanto necessrias at que comandoteste retorne valor diferente de zero; pode-se ler o comando como enquanto no h erros, execute os comandos.
until comandoteste do comandos done

O comando case se apresenta como um seletor mltiplo e tem o formato bsico apresentado abaixo.
case padro in p1) p2) pk) esac comandopk_1 comandopk_n;; comandop1_1 comandop1_n;; comandop2_1 comandop2_n;;

A repetio com o until apenas inverte a condio: os comandos sero executados repetidamente at que comandoteste retorne valor no nulo. Ou seja, enquanto h erros, execute os comandos. Quebras de estruturao A estrutura lgica dos comandos pode ser quebrada utilizando-se alguns comandos especficos: exit, break e continue. O comando exit tem um argumento inteiro positivo e causa o trmino da execuo. O valor do argumento o valor de retorno do programa, que pode ser usado para verificar em que condies houve a interrupo. Em geral, valor zero indica trmino sem erros; valores diferentes de zero indicam alguma condio excepcional. A funo do break quebrar um lao de repetio. Caso executado, interrompe um for, um while ou um until, prosseguindo a execuo com o primeiro comando aps o lao. Havendo aninhamento de laos de repetio, apenas o atual interrompido. Um parmetro opcional do break um valor inteiro positivo, que indica o nmero de laos que so 27

Se o padro especificado coincidir com um dos padres (p1, p2), os comandos indicados sero executados. Caso no haja coincidncia, nada ocorre. Os smbolos especiais *, ? e [listacaracteres] podem ser usados como mscara genrica para padres. Finalmente, a execuo condicional pode aparecer na forma dos operadores && e ||, os quais so utilizados no formato abaixo.
comando1 && comando2 comando1 || comando2

26

Jander Moreira

Interpretadores de comandos: Shells


Tabela IX. Exemplos de variveis de ambiente. Varivel
$HOME $USER $PATH $SHELL $TERM $PS1 $PS2 $PWD

interrompidos. Assim, break 2 indica que dois laos de repetio aninhados so interrompidos de uma vez. O continue usado na repetio com for, causando a interrupo da repetio atual e forando que o prximo item da lista de palavras seja processado. Leitura de dados O comando read faz a leitura de uma linha e associa o valores da linha a variveis. Cada valor digitado (separados por espaos em branco) atribudo a uma varivel por vez, sendo que a ltima da lista recebe todo o restante da linha. No havendo erros, o valor de retorno zero.
$ read v1 Fulano de Tal $ echo $v1 Fulano de Tal $ read v1 v2 Fulano de Tal $ echo $v1 Fulano $ echo v2 de Tal

Significado Diretrio do usurio. Nome do usurio. Lista dos diretrios que contm arquivos executveis (separados por dois-pontos). Nome do executvel da shell. Especificao do terminal em uso. Contm os prompts que a shell apresenta. Diretrio corrente

Internamente funo, valem as mesmas variveis de acesso a parmetros que as usadas nas shells: $#, $0 a $9 etc. O valor de retorno da funo deve ser inteiro positivo e indicado com o comando return n. Aps feita a chamada, o valor de retorno pode ser verificado usando a varivel $?. 6.6 Ambiente

A varivel de ambiente $IFS (internal field separator) especifica quais so os caracteres usados como separadores na leitura, que so, normalmente, uma ou mais ocorrncias consecutivas de espao ou tabulao. Caso seja pressionado Ctrl-D, o que indica fim de dados, o valor de retorno do read no nulo, podendo ser usado para testar a interrupo da entrada de dados. Processos e scripts Cada script que executado tem uma instncia da shell fazendo sua interpretao. Em outras palavras, cada script pode ser visto, tambm, como um processo no sistema. A execuo de um processo em background feita especificando-se o operador & na linha de comando. Em scripts o mesmo vlido; quando se deseja que vrios comandos sejam executados em background, a lista deve ser colocada entre parnteses, seguindo-se do smbolo &. O comando wait tem como argumento um nmero de processo e aguarda que este processo termine para continuar a execuo. Quando se executa algo em background, a varivel $! contm o nmero do processo relativo ltima execuo. Funes A maioria das shells permite, ainda, que sejam construdas funes. O formato para a especificao da funo apresentado abaixo; a chamada da funo feita utilizando-se seu nome seguido dos argumentos, sem os parnteses.
nome() { comandos }

Cada instncia da shell mantm um ambiente, estabelecido por um conjunto de variveis, as quais podem ser verificadas para determinar o comportamento dos programas. Um exemplo a varivel $TERM, que contm o tipo de terminal e usada, por exemplo, por editores de texto para determinar a capacidade de apresentar cores, smbolos grficos, caracteres invertidos etc. A Tabela IX mostra exemplos de algumas destas variveis, as quais podem variar de sistema para sistema. Quando uma shell criada a partir de outra (o que ocorre quando se solicita a execuo de um script, por exemplo), algumas variveis so herdadas, outras no. As variveis so originalmente locais, o que significa que no podem ser utilizadas nestas subshells. Para que isso seja possvel, o comando export especifica quais as variveis que sero copiadas para uma nova shell. Note-se que o termo copiado, uma vez que cada shell tem apenas uma cpia das variveis exportadas, o que indica que no tm acesso s variveis originais, mas somente a sua prpria cpia. Assim, pode-se resumir: Variveis no exportadas no so visveis em subshells; Variveis exportadas tm seu valor copiado para uma varivel de mesmo nome na subshell; No possvel a uma subshell alterar uma varivel local de nvel superior.

Quando comandos so agrupados com o uso de parnteses, uma subshell criada para execut-los. H a possibilidade de agrupar comandos usando chaves; neste caso os comandos so executados na mesma shell. Sinais Sinais podem ser interceptados nas shells com o comando trap, que tem o formato geral abaixo.
trap lista_de_comandos sinais

Quando um dos sinais indicados em sinais (separados por espao) recebido, os comandos especificados pelo trap so executados. 29

28

Jander Moreira

Apndices

Comandos importantes

7 Concluses
Este material apresenta os fundamentos necessrios para o entendimento de programao para comunicao via rede para ambientes Unix. , evidentemente, de carter informativo e no indica como programar, fornecendo apenas subsdios para que, sob orientao, seja possvel desenvolver e entender os conceitos envolvidos neste tipo de programao. Para isso cobre revises de arquiteturas de redes e ambiente Unix. Apresenta, tambm, aspectos importantes para entender a camada de transporte (em especial para o modelo de referncia TCP/IP). Este texto complementa atravs dos apndices, e de maneira bastante geral, aspectos de programao em ambiente Unix, abrangendo duas vertentes distintas: a utilizao de programao interpretada das shells e a compilao de programas em linguagem C/C++. Os principais aspectos das shells (no caso a bash) e de sua linguagem de programao foram apresentados, bem como seus recursos. Vrios dos programas disponveis no sistema so mencionados, indicando sua utilizao bsica e mostrando sua importncia na resoluo dos problemas mais gerais. Evidentemente, outros programas tambm importantes acabaram por no ter o merecido destaque. A parte de programao compilada abordou alguns dos aspectos envolvidos na compilao (como pr-processamento, compilao em separado, uso de makefiles), alm de um conjunto de recursos do Unix, disponibilizados na forma de bibliotecas de funes e chamadas do sistema. Estes recursos exploram os principais aspectos dos sistemas de arquivos e da comunicao entre processos, bem como outros atributos relativos ao gerenciamento e acompanhamento dos processos e da troca de sinais entre eles. Este material no cobre todos os aspectos e desce em nveis diferentes de detalhes dependendo de cada tpico.

Apndice A Comandos importantes


As diversas implementaes do Unix trazem consigo mais de 250 comandos que podem ser utilizados diretamente. Em geral, sempre existe algo que auxilia a resolver um problema sem que seja necessrio escrever um novo programa. cat Copia a entrada padro para a sada padro. Caso sejam especificados nomes de arquivos, cada um deles copiado, na ordem, para a sada padro. cp Copia um arquivo para outro. Caso o destino seja um diretrio, um arquivo com o mesmo nome criado no diretrio destino; se vrios arquivos forem especificados, cada um deles copiado. cut Separa as colunas ou campos de uma sada qualquer, permitindo extrair informaes. date Apresenta a data corrente. possvel especificar o formato da apresentao. echo Copia seus argumentos para a sada padro. Utilizado, geralmente, para apresentao de mensagens. eval Tem como argumento um comando e os argumentos deste comando, executando-o. til quando algumas substituies de variveis devem ser feitas em ordem diferente a usual. grep Apresenta as linhas de uma entrada na qual uma expresso regular encontrada. ln Permite criar um novo nome de arquivo (link) para um arquivo j existente. Um hard link cria uma nova entrada de diretrio diretamente para o arquivo de dados; um simbolic link cria uma entrada de diretrio que indica outra entrada j existente. ls Apresenta os arquivos presentes nos diretrios e seus atributos. mkdir Cria um novo diretrio.

8 Bibliografia
Dougherty, D.; Robbins, A. sed and awk (Unix power tools). OReilly, 1997. Frish, A. Essential System Administration: Help for Unix System Administrators. 2nd ed., O'Reilly & Assoc., 1996. Kochan, S. G.; Wood, P. H. Unix shell programming (revised edition). Hayden Books, 1990. Nemeth, E. et al. Unix System Administrarion Handbook, 2nd ed., Prentice Hall, 1995. Stevens, W. R. Advanced programming in the Unix environment. Addison-Wesley, 1993. Stevens, W. R. Unix Network Programming: Networking APIs: Sockets and XTI. Vol. 1. 2nd ed. Prentice Hall, 1998.

31 30

Jander Moreira

Apndices

Programao e compilao C/C++

more Copia a entrada padro para a sada padro, parando a apresentao aps preencher uma tela completa e aguardando a interveno do usurio para continuar. Caso nomes de arquivos sejam especificados, cada um deles enviado para a sada padro. mv Faz a troca de entradas de diretrio para um dado arquivo. Se o nome de arquivo destino estiver no mesmo diretrio, o nome trocado; se estiver em outro diretrio, o arquivo movido. paste Une dois ou mais arquivos dispondo suas linhas em colunas. ps Lista os processos do sistema, bem como detalha informaes sobre cada processo. rm Faz a remoo de uma entrada de diretrio. Caso no haja mais nenhum hard link para os dados do arquivo, os dados tambm so removidos. rmdir Faz a remoo de um diretrio, caso esteja vazio. sort Copia a entrada padro para a sada padro, fazendo a ordenao direta ou reversa dos dados. tr Copia a entrada padro para a sada padro, fazendo a substituio de caracteres. uniq Copia a entrada padro para a sada padro eliminando linhas consecutivas que sejam repetidas. wc Conta o nmero de linhas, de palavras e de caracteres da entrada padro ou de um arquivo especificado. who Apresenta a lista dos usurios utilizando o sistema. pwd Apresenta o diretrio corrente.

Apndice B Programao e compilao C/C++


B.I Compiladores

A maioria das implementaes do Unix trazia, antigamente, um compilador para linguagem C, conhecido por cc. Recentemente, ao se adquirir um sistema Unix comercial, o compilador C (e outros compiladores) no mais est includo, mas deve ser adquirido separadamente. Por questes de custo, proliferam as verses livres do compilador, que representada especialmente pela implementao GNU. O software pode ser obtido por download e no envolve custos de licena. Esto disponveis, assim, compiladores para a linguagem C e para C++, respectivamente gcc e g++*. B.II Fundamentos de compilao Um cdigo fonte escrito em C/C++ armazenado em arquivos no formato texto. Para que se possa gerar um executvel, o programa compilado, o compilador deve gerar um cdigo objeto, que fica tambm em um arquivo. Como passo final, o cdigo objeto passa pelo processo de ligao (linking), atravs do qual o arquivo com o cdigo executvel gerado, o qual pode ser acionado pelo sistema operacional. Durante este processo, o compilador aciona outros processos intermedirios, como o pr-processador, que verifica as clusulas iniciadas com # no cdigo fonte. Para arquivos simples (um nico arquivo com o cdigo fonte), o passo de gerao do cdigo objeto em geral transparente e o executvel j produzido. Caso o cdigo esteja dividido em vrios arquivos com cdigo fonte (programa principal, rotinas de manipulao etc.), cada um compilado separadamente e depois todos os cdigos objeto gerados so ligados em um nico executvel. A Figura 11 mostra o esquema geral da compilao. A gerao do cdigo objeto feita atravs da opo c passada para o compilador, como no exemplo abaixo.
$ g++ -c meuprog.c

Atravs deste comando, um arquivo de nome meuprog.o gerado, contendo o cdigo objeto referente ao meuprog.c. A gerao do executvel feita em uma segunda etapa, executando novamente o compilador.
$ g++ meuprog.c

O exemplo anterior gera um programa denominado a.out, que o nome padro para todos os executveis gerados. A opo o permite especificar o nome do arquivo executvel a ser gerado.
$ g++ -o meuprog meuprog.o

Como h um s arquivo com cdigo fonte, a obteno do executvel pode ser direta.
$ g++ -o meuprog meuprog.c $ ls F meuprog* # -F acrescenta um * nos executveis

H, evidentemente, compiladores para outras linguagens, como Fortran, e tambm linguagens interpretadas, como Perl.

33 32

Jander Moreira
prog.C prog.o

Apndices
g++ -c prog.c

Programao e compilao C/C++

func.o: func.c
a.out mod1.C mod2.C mod1.o mod2.o

# gerao do func.o

g++ -c func.c

Ao ser executado o make, que procura suas regras em um arquivo denominado Makefile, cada regra verificada e, caso o arquivo da meta no exista ou tenha data e hora anterior s de suas dependncias, os comandos so executados para atualizar a meta.
$ make

compilao

linking

g++ -c prog.c g++ -c func.c g++ -o prog prog.o func.o $ ls l prog -rwxr-xr-x 1 fulano 300 25798 Mar 22 15:33 prog

Figura 11. Esquema do processo de gerao do programa executvel.

meuprog*

meuprog.c

Quando h vrios arquivos com cdigo fonte, cada um compilado separadamente e depois todos so ligados no executvel.
$ g++ -c principal.c $ g++ -c modulo1.c $ g++ -c modulo2.c $ g++ principal.o modulo1.o modulo2.o $ ls a.out a.out # o executvel gerado # une todos os objetos # compila separadamente

Caso alguma das dependncias seja modificada, uma nova execuo do make atualiza somente o que necessrio. B.IV Recursos de rotinas Alm das rotinas escritas pelo prprio programador, tanto o compilador quanto o sistema disponibiliza vrias outras rotinas. H, assim, uma biblioteca de funes e tambm as chamadas do sistema. IV.a Bibliotecas

B.III Makefiles A utilizao de compilao em separado, como a descrita no item anterior, interessante do ponto de vista que somente os mdulos modificados precisam ser recompilados, o que agiliza todo o processo. Por outro lado, gerenciar o que foi ou no modificado e o que precisa ser recompilado no sempre uma tarefa fcil. O comando make utiliza um conjunto de regras mantidas em um arquivo, regras estas que definem quais as dependncias que existem entre os mdulos. Contm, tambm, quais os comandos necessrios para fazer as atualizaes. Cada regra segue o formato abaixo. A meta designa o que deve ser atualizado; as dependncias indicam, em uma lista separada por espaos, os arquivos que so necessrios para gerar a meta; os comandos, especificados um por linha, representam o que deve ser feito para efetivamente gerar a meta.
meta: dependncias comandos

As bibliotecas so um grande conjunto de funes tornadas acessveis ao programador e providas juntamente com o compilador. A seo 3 do manual as descreve em detalhes, mostrando sua utilizao, restries etc. Entre estas rotinas existem, por exemplo, as funes de controle de alocao dinmica de memria, funes matemticas e funes de manipulao de cadeias de caracteres, entre outras. Esto disponveis, juntamente com as rotinas, os include files com os prottipos das funes, o que permite que sejam verificados parmetros e valor de retorno, por exemplo, durante a compilao de cada mdulo. IV.b Chamadas do sistema

Uma chamada do sistema corresponde solicitao da execuo de uma rotina presente no ncleo do sistema. As chamadas do sistema realizam operaes que so intrinsecamente dependentes do sistema operacional, como controle de processos, acesso ao sistema de arquivos, acesso aos dispositivos (como discos) e outros. A interface com o sistema feita atravs do formato de funes em C, que ajustam os parmetros e registradores do sistema e, ento, geram uma interrupo no ncleo do sistema para solicitar a execuo da rotina. A sesso 2 do manual refere-se s chamadas do sistema. B.V Rotinas

Suponha-se que um programa tenha duas partes: uma com o cdigo do programa principal, no arquivo prog.c, e outra com o cdigo de uma coleo de funes, no arquivo func.c. As regras para sua compilao poderiam ter o formato seguinte.
# executvel prog: prog.o func.o g++ -o prog prog.o func.o # mdulos prog.o: prog.c # gerao do prog.o # linking

V.a

Manipulao de processos

35 34

Jander Moreira
Tabela de arquivos
Par. de estado Pos. corrente Ptr Info v-node Par. de estado Pos. corrente Ptr Info i-node Tam. do arq.

Apndices
Tabela de v-nodes
Iniciado Posto em execuo

Programao e compilao C/C++


executando
Fim do tempo Aguardo de evento Terminado

P1

Par Ptr 0 1 2 3

novo

pronto
Evento recebido

terminado

bloqueado

Figura 13. Diagrama dos principais estados de um processo.

P2
0 1 2 3

Par Ptr

(UID, EUID, GID). No so herdados, porm, sinais que tenham sido enviados para o pai e ainda no recebidos ou travas feitas em registros. O trmino de um processo ocorre ao se terminar a funo main ou ao se executar exit ou _exit. Todas as formas so consideradas trminos normais e devem especificar um valor de retorno para ser verificado aps o encerramento do processo. O exit faz o trmino limpo, pois executa todas as rotinas de finalizao (cadastradas, por exemplo, pelo atexit); o _exit, que tambm faz o trmino normal, finaliza imediatamente o processo. Um processo pode monitorar o trmino de outro atravs de funes de aguardo, como
wait e waitpid. A chamada a wait bloqueia o processo at que um processo filho termine;

Figura 12. Esquema da utilizao de um mesmo arquivo por dois processos distintos.

As chamadas do sistema permitem a manipulao dos processos existentes no sistema, bem como a criao de novos processos. Os principais aspectos dos processos esto apresentados na seo 0. Os processos podem, segundo o ponto de vista do sistema, estar em vrios estados. Os principais estados esto representados na Figura 13, bem como as transies entre eles. Novo: processo em criao. O sistema aloca recursos para o processo (e.g., memria) e o associa a um terminal, quando interativo. Pronto: aguardando o processador. Todos os processos ficam em uma fila, aguardando que o sistema lhes fornea uma fatia do tempo da UCP. Executando: instrues sendo executadas. Em seu tempo de acesso UCP, o processo executado. Bloqueado: aguardando evento. Voluntria ou involuntariamente o processo pode ser suspenso (removido da fila da UCP); isto ocorre, por exemplo, quando uma operao de entrada ou sada executada, pois somente quando ela completada, o processo volta a competir pelo processador. Terminado: finalizao. O processo terminado e h a liberao dos recursos utilizados; o sistema deixa de manter controle sobre o processo.

ento o processo retomado. possvel, atravs do segundo parmetro da funo, verificar, atravs de macros como WIFEXITED, WIFSIGNALED ou WIFSTOPPED, as condies de trmino de outro processo, bem checar seu PID por meio do valor de retorno. O waitpid tem operao similar ao wait, mas permite especificar o PID do processo pelo qual se espera e tambm indicar se o processo ser bloqueado (suspenso) at o trmino do outro processo. Qualquer processo pode solicitar que seu cdigo executvel (seu programa) seja substitudo por outro. A criao de um processo diferente ocorre desta forma: um processo cria um filho, o qual substitui seu cdigo por outro programa. O resultado final a criao de um novo processo com cdigo diferente. Os comandos que fazem esta substituio de cdigo so os da famlia exec. H vrios formatos para os comandos exec, dependendo de como so passados os parmetros e de dependncias de ambiente: execl, execv, execle, execve, execlp ou execvp. A presena do l indica que os parmetros so no formato de lista, i.e., passados um a um como argumentos da funo; o v indica que os argumentos esto no formato de um vetor (um arranjo de cadeias de caracteres*). A p explicita que o nome do arquivo executvel utiliza o caminho de diretrios ($PATH) e o e especifica que tambm sero consideradas especificaes de ambiente adicionais. Exceto pelos parmetros e formato, todas as funes exec fazem a substituio do cdigo, causando a execuo de um novo programa, a partir de seu incio. So herdados do processo original o PID e o PPID, os identificadores de usurio (dono do processo e efetivo), identificador de sesso, terminal de controle, os diretrios corrente e raiz, a mscara de criao de arquivos, eventuais travas de registros efetuadas, a mscara de sinais e os sinais pendentes e tambm os tempos de processo. Alm das funes exec, h a funo system. Esta ltima aciona a execuo de um outro programa, automatizando e deixando transparente as chamadas a fork, exec e wait-

Chamadas para controle de processos Os processos de usurios no podem ser criados do nada. O processo para a criao de um novo processo do sistema a criao de uma cpia de um processo existente; diz-se que um processo divide-se em dois, atravs de uma operao denominada fork. A funo fork faz uma chamada de sistema que cria um novo processo exatamente igual ao atual, tanto no cdigo (programa) quanto na memria, j que uma rplica da memria do processo tambm duplicada. Os processos se distinguem entre si, como processo pai e processo filho, atravs do valor de retorno da funo fork: o valor zero para o processo filho e o PID do filho para o processo pai. Aps a diviso, cada processo continua executando do mesmo ponto. O processo filho herda do pai recursos como uma cpia da memria (variveis, pilha, heap etc.), os arquivos abertos, parmetros de ambiente (e.g., diretrio corrente) e privilgios 36

Em formato similar ao argv (char **argv). PPID o parent process ID, ou o nmero de processo do pai.

37

Jander Moreira pid. Do ponto de vista do programador, a funo executa um outro programa, criando seu

Apndices
Tabela X. Alguns dos sinais usados nos processos. Sinal
SIGABORT SIGALRM SIGCHLD SIGSTOP SIGTSTP SIGCONT SIGINT SIGKILL SIGUSR1/SIGUSR2 SIGSEGV

Programao e compilao C/C++

processo e aguarda seu trmino. A linha de comando passada como parmetro interpretada pela shell, o que permite especificar direcionamentos de entrada e sada, por exemplo. Os tempos de processo citados acima indicam o tempo consumido pelo processo, medido de trs formas: tempo do usurio, tempo do sistema e tempo real. O tempo do usurio o tempo de UCP que o processo consumiu; o tempo do sistema o tempo de UCP que o sistema gastou executando solicitaes do processo (e.g., chamadas do sistema); e o tempo real o tempo total gasto pelo processo, considerando o sistema em si e os outros usurios, desde o incio do processo at seu trmino. A chamada a times permite obter estes valores: o tempo real dado como retorno da funo; um parmetro, do tipo stuct tms, retorna os tempos de usurio e sistema, tanto para o processo quanto para seus filhos. Como os valores dos tempos so dados em tiques do relgio do sistema, uma converso necessria: dividindo-se os valores pela constante CLK_TCK para obter o valor em milsimos de segundo. Finalmente, a obteno do ID do grupo de processos ao qual o processo pertence pode ser obtido pela chamada a getpgrp. V.b Sinais

Significado Gerado pela funo abort, indicando trmino anormal. Gerado quando o temporizador expira. Enviado ao pai quando o processo filho termina ou pra. Pra o processo (suspende). Pra o processo; sinal gerado no teclado (Ctrl-Z). Continua a execuo do processo. Causa a interrupo do processo (Ctrl-C). Termina um processo imediatamente. Sinais para utilizao pelo usurio. Acesso a rea de memria fora da abrangncia do processo.

pode enviar um sinal para si, o que feito atravs do comando raise, cujo nico parmetro o sinal. Ao receber um sinal, o processo interrompido e uma ao padro para o sinal efetuada. Alguns sinais so, por padro, ignorados; a maioria, porm, tem como ao padro o trmino da execuo do processo. Um processo pode definir uma rotina para capturar um sinal, alterando o comportamento padro. Esta definio feita atravs do uso da funo signal, a qual tem dois parmetros: o sinal a ser capturado e o endereo da rotina que tratar a interrupo. O cabealho da rotina de tratamento fixo e est apresentado abaixo; o parmetro contm o nmero do sinal que gerou a interrupo. Alm da rotina que far o tratamento do sinal, podem ser especificados os valores SIG_DFL ou SIG_IGN, que indicam, respectivamente, que o tratamento ser o padro (default) ou que o sinal ser simplesmente ignorado.
void nomerotina(int sinal)

Sinais so indicadores usados pelo sistema para gerar interrupes nos processos, sendo que uma de suas principais utilizaes o gerenciamento de eventos assncronos. Um evento assncrono aquele cujo momento de ocorrncia no pode ser previsto: qual o momento de trmino de um processo filho, qual instruo estar sendo executada quando um temporizador for acionado, quando terminar uma operao de entrada ou sada etc. H vrias formas de serem gerados sinais para os processos. Grosso modo, podem ser enquadrados como: Gerados por terminal. Ocorrem quando o usurio pressiona teclas de controle, como Ctrl-C ou Ctrl-Z. Gerados por processos. Os processos podem solicitar, atravs da chamada do sistema kill a gerao de um sinal especfico. Gerado atravs da shell. possvel, atravs do programa kill*, especificar o sinal que deve ser enviado a um processo. Gerado pelo hardware ou dispositivos. O hardware gera um sinal quando, por exemplo, uma operao ilegal executada, como o caso de uma diviso por zero feita pelo processador ou o acesso a uma rea de memria qual o processo no tem acesso; dispositivos tambm geram sinais quando necessitam de ateno (e.g., placas de rede).

Bloqueio de sinais Um sinal existe no sistema desde sua gerao at sua recepo pelo processo (ou processos) ao qual destinado. Os sinais que j foram gerados mas ainda no foram entregues so chamados sinais pendentes. Caso um processo tenha vrios sinais pendentes iguais, dependendo do sistema operacional, apenas um poder ser entregue ou todos podem ser entregues. Se houver vrios sinais diferentes, a ordem de entrega pode no ser, necessariamente, a mesma ordem da gerao. Em geral, sinais ficam pendentes quando so gerados mas o processo bloqueou sua recepo. O sinal fica pendente at que haja o desbloqueio ou at que o processo ignore o sinal. Um processo pode bloquear sinais atravs de mscaras de sinais. Uma mscara de sinais definida como um conjunto de sinais, o qual uma mscara de bits que identifica a presena ou ausncia de um sinal no conjunto. As funes sigemptyset e sigfillset geram, respectivamente, um conjunto vazio ou um conjunto contendo todos os sinais. Sinais podem ser adicionados a um conjunto atravs do funo segaddset e removidos atravs da sigdelset. A verificao se um sinal pertence ou no a um dado conjunto de sinais feito pela funo sigismember. Desta forma, pode-se criar um conjunto vazio e a ele adicionar os sinais SIGINT e SIGTSTP. Ento, atravs da chamada a funo sigprocmask, bloquear os sinais indicados no conjunto. Dependendo de um parmetro que identifica o modo, o conjunto pode ser usado para indicar os sinais que sero bloqueados (SIG_BLOCK) ou que sero desbloqueados (SIG_UNBLOCK). Os demais sinais que no esto no conjunto permanecem inalterados. Uma 39

Na Tabela X esto alguns dos principais sinais utilizados, descritos por uma constante simblica, embora a definio formal que seus valores sejam numricos. O envio de um sinal por parte do processo feito atravs do comando kill, cujos parmetros indicam o PID do processo ao qual se destina o sinal e o nmero do sinal a ser enviado. Caso, no lugar o PID seja especificado o valor zero, todos os processos que pertenam ao mesmo grupo recebero o sinal; caso o valor seja negativo, os processos do grupo cujo ID seja o valor absoluto do parmetro recebero o sinal. Sendo necessrio, um processo

interessante verificar as pginas de manual para kill(1), que o comando, e para kill(2), que a chamada do sistema.

38

Jander Moreira

Apndices

Programao e compilao C/C++

terceira opo o parmetro SIG_SETMASK, que bloqueia todos os sinais pertencentes ao conjunto e desbloqueando os ausentes. V.c Comunicao interprocessos

Na seo 4.4 foram apresentados os tipos de arquivos, dentre os quais encontram-se os named pipes. Estes arquivos, quando criados e abertos por processos, invocam o sistema operacional para a criao de um pipe entre os processos. A criao de um arquivo do tipo FIFO feita pelo comando mkfifo, o qual especifica o nome do arquivo (caminho) e o modo de acesso (permisses). Uma vez criado, os processos podem abrir o arquivo para leituras e escritas, sendo o pipe entre eles criado pelo sistema. Filas de mensagens Filas de mensagens so uma forma de comunicao que, sendo mantidas pelo sistema, permitem o armazenamento temporrio de mensagens (dados) gerados por um processo e depois consumidos por outro. Ambos os processos devem utilizar as mesmas chaves para identificar a mesma fila. A fila de mensagens pode funcionar como uma fila comum (FIFO) ou como uma fila com prioridade. Todas as mensagens so inseridas no final da fila; porm, quando se vai consultar uma mensagem da fila, pode-se optar por peg-las em ordem ou por selecionar atravs de uma prioridade, que um valor numrico associado a cada mensagem. A utilizao de um ou de outra forma responsabilidade exclusiva da implementao de cada processo. Como outros recursos, o espao para as filas pr-alocado no sistema; no , portanto, dinmico. Existindo esta limitao, cada sistema impe limites para o nmero mximo de bytes por mensagem (dado pela constante MSGMAX), para o tamanho mximo total da fila em bytes (MSGMNB), nmero mximo de filas (MSGMNI) e nmero mximo de mensagens no sistema (MSGTQL). A especificao de uma fila feita pela chave passada como parmetro para a chamada msgget, juntamente com outros argumentos para ajustar o modo de acesso. Caso a fila j tenha sido criada por outro processo, ela utilizada, criando-se, ento um modo para troca de dados. O controle da fila feito pela chamada a msgctl, que utiliza o identificador da fila para especific-la. Alm do identificador, so parmetros tambm o comando a ser executado sobre a fila e um registro (do tipo struct msquid_ds), o qual utilizado para especificar valores. Os comandos podem ser IPC_STAT, que faz com que os parmetros atuais da fila sejam copiados para o registro; IPC_SET, que utiliza os valores do registro para modificar a configurao da fila; ou IPC_RMID, que remove a fila do sistema. O envio de mensagens para a fila feito pelo comando msgsnd, que especifica o identificador da fila, um buffer no qual os dados esto armazenados e o a quantidade de bytes. Um outro parmetro ainda existe, sendo utilizado para opes no envio, como por exemplo para a especificao de um envio no bloqueante. A recepo feita por msgrcv. Alm do identificador da fila e do buffer para o qual os dados da mensagem sero copiados, h tambm um parmetro tipo, o qual, caso seja igual a zero, retira a primeira mensagem da fila; caso seja positivo, pega a primeira mensagem cujo tipo coincida com o valor especificado; e se for negativo, indica a primeira mensagem cujo tipo tem o menor valor que seja menor ou igual ao especificado. Cada mensagem, ao ser enviada para a fila, deve conter um tipo (valor inteiro) e os bytes da mensagem em si.

No possvel para um processo enviar dados diretamente a outro processo, a no ser simples sinais. Para o envio de dados, o sistema prov alguns mecanismos para este intercmbio, na forma de IPC (interprocess communication). As principais formas para efetivar a troca de dados se d atravs de pipes, FIFOS, filas de mensagens e memria compartilhada. Alm destas formas, h ainda os sockets, que permitem a comunicao entre processos que no necessariamente estejam em uma mesma mquina. Paralelamente a estes mecanismos esto os semforos, os quais, embora no realizem a permuta de dados entre os processos, permitem o controle de recursos compartilhados, determinando quem tem acesso a um dado recurso e mecanismos para a criao de regies crticas. Pipes Uma forma de comunicao entre processos que possuam um ancestral comum se d atravs do uso de pipes. Um pipe opera como um arquivo, no qual so realizadas escritas e leituras de dados. Um arquivo real, entretanto, no existe; o ncleo gerencia a transferncia de dados. Como funciona como um arquivo, o pipe um dos atributos que so herdados por processos filhos. Assim, o processo pai cria um pipe e executa o fork; o processo filho herda os identificadores de arquivo do pipe criado, podendo ter acesso tanto de leitura como de escrita. Desta forma, por exemplo, o pai escreve dados no pipe e o filho os l. O pipe opera em modo half-duplex, isto , permite a transmisso de dados em ambos os sentidos, mas somente em uma direo de cada vez. O comando pipe utiliza como argumento um arranjo com duas posies inteiras; cada posio representa um descritor, sendo que a posio zero indica o descritor do pipe que foi aberto para leitura e a posio o descritor que foi aberto para escrita. Usualmente, aps um fork, um dos processos fecha o descritor de escrita enquanto o outro fecha o de leitura, criando um canal de comunicao unidirecional. Evidentemente, vrios pipes podem ser criados pelos processos ao mesmo tempo. A transmisso de dados feita atravs do prprio ncleo do sistema, que gerencia tambm a sincronia na transmisso de dados. Por exemplo, o processo que faz uma leitura do pipe fica suspenso at que haja dados para serem lidos, i.e., at que o outro processo faa uma operao de escrita. Quebras nesta conexo tambm so relatadas aos processos atravs de sinais: quando um processo produtor termina inesperadamente, o processo consumidor avisado. Caso um processo feche o pipe (fechamento atravs do descritor ou pelo trmino de sua execuo), o outro processo receber um fim de arquivo ao tentar ler informaes na prxima vez. FIFOs Uma das dificuldades no uso de pipes que sua criao deve ter sido feita por um processo ancestral, no permitindo que processos no relacionados faam uso deste recurso. FIFOs, tambm conhecidos como named pipes, so uma forma de comunicao entre processos que supera esta dificuldade, uma vez que permitem especificar um pipe atravs de um nome de arquivo.

41 40

Jander Moreira

Apndices
32 bits

Principais componentes de cabealhos IP

Semforos Semforos no so formas de troca de dados, mas sim um mecanismo para o controle de acesso a um determinado recurso. Um recurso uma rea de memria compartilhada, um dispositivo de hardware etc., ao qual s se permita acesso exclusivo ou acesso limitado (mximo de k processos simultaneamente). Semforos implementam contadores, os quais so usados para gerenciar se o recurso est ou no disponvel. Assim, um processo testa o semforo para um dado recurso; se obtiver sucesso, indica no contador este uso (diminuindo o contador de um); aps utilizar o recurso, indica sua disponibilidade para outro processo, incrementando o contador. Caso tente acesso ao recurso e no consiga, o processo fica suspenso at que o semforo permita o acesso. No Unix, um registro de IPC que gerencia uma instncia de semforo no mantm um nico contador, mas um conjunto deles (especificado no momento de sua criao). Assim, cada semforo , na realidade, um conjunto de semforos. O comando semget solicita o acesso a um semforo, especificando sua chave e retornando seu identificador. Outros parmetros so o nmero de semforos (contadores) a serem utilizados e opes, como especificao de modos de acesso. O controle de configurao feito atravs do semctl, que indica a estrutura de IPC atravs do seu identificador e qual dos contadores individuais de semforo deve ser modificado. A funo tem como parmetros, ainda, o comando (ao) que deve ser executada sobre o semforo e um argumento, no qual so especificados os valores utilizados pelo comando. Possveis comandos incluem IPC_STAT, IPC_SET e IPC_RMID, com as mesmas funes que as mencionadas para filas de mensagens, e outras como SET_VAL e GET_VAL para ajuste do valor dos semforos, GETNCNT e GETZCNT que retornam o nmero de processos que aguardo o contador ficar no-nulo e zero, respectivamente. O acesso aos semforos feito atravs de operaes especificadas pela chamada semop. Seus parmetros incluem o identificador do semforo e um arranjo contendo as operaes a serem realizadas, alm de um valor que indica o nmero de operaes contidas no arranjo. Cada uma das operaes executada seqencialmente, sendo a chamada funo atmica (i.e., com garantia de que sua atuao sobre o semforo terminar sem interrupo). possvel, assim, especificar a verificao de um semforo e a indicao do decremento do contador passando um arranjo com as duas operaes. Cada operao consiste no contador que ser considerado, a operao sobre ele (aguardo, incremento, decremento etc.) e opes (e.g., no bloqueante). Memria compartilhada Uma rea de memria gerenciada pelo prprio sistema consiste em um dos recursos compartilhados. Torna-se, assim, vivel que processos troquem informaes utilizando esta rea comum. A memria compartilhada pelo Unix utilizada nos mesmos moldes das outras formas de compartilhamento: so especificadas as chaves e obtidos os identificadores do mecanismo. A chamada que realiza esta operao chama-se shmget, a qual especifica, tambm, a quantidade de bytes que sero utilizados. Obtido o identificador do registro do sistema que gerencia a memria compartilhada, necessrio, para utiliz-la, uma adeso, o que feito atravs da chamada a shmat, a qual retorna o endereo da rea de memria comum. A partir deste momento, o uso da memria feito diretamente pelo processo, sendo que o acesso pode ser simultneo s mesmas posies por qualquer outro processo.
Verso Compr. Cabe.

Tipo de servio

Comprimento total 0 D M F F Deslocamento de fragmento 20 bytes

Identificao Tempo de vida (TTL) Protocolo

Soma de verificao

Endereo da origem Endereo do destino Opes

Dados

Figura 14. Formato do cabealho Ipv4.

Usualmente, na utilizao de uma rea, para manter a consistncia dos dados, exigese um controle para que somente um processo (ou alguns) a utilize em um dado momento, o que pode ser feito atravs de semforos. Sockets Similares aos pipes, os sockets constituem um mecanismo de troca de informaes entre processos, normalmente entre processos em execuo em mquinas distintas e interconectadas por uma rede. Tratando-se de um tpico de especial neste texto, os sockets so tratados em um tpico especfico (seo 5).

Apndice C Principais componentes de cabealhos IP


C.I IPv4 Cabealhos IPv4 (Figura 14) contm os seguintes campos: Version (4 bits). Indica a verso do IP. No caso, tem valor igual a 4. Header length (32 bits). Contm o tamanho total do cabealho. Type of service (8 bits). Os trs primeiros bits so ignorados; os prximos quatro bits indicam o servio; o ltimo bit tem sempre valor 0. Total length (16 bits). Armazena o tamanho total do pacote. Identification (16 bits). Identificador individual do pacote. Zero (1 bits). Bit sempre igual a 0. DF (1 bit). Bit que define se o pacote pode ser fragmentado ou no.

43 42

Jander Moreira
32 bits

Apndices
Incio Fechada

Diagrama transio de estados

Verso

Prioridade

Rtulo de fluxo Prximo cabealho Limite de saltos (hops)


R: SYN E: SYN, ACK

A: listen Abertura passiva

Comprimento de payload

Escutando

A: connect E: SYN

Endereo da origem

R: RST R: SYN

Abertura ativa A: close Enviado SYN R: SYN, ACK E: ACK R: FIN ou timeout

Recebido SYN

E: SYN, ACK Abertura simultnea

40 bytes

R: ACK Estabelecida A: close S: FIN R: FIN Aguarda FIN (1) E: ACK Transferncia de dados

E: ACK

Aguarda fechamento A: close E: FIN R: ACK ltimo ACK Fechamento passivo

Endereo do destino

Fechamento simultneo Fechando

R: ACK

R: FIN, ACK E: ACK R: FIN

R: ACK

Aguarda FIN (2)

E: ACK

Aguarda tempo Timeout 2MSL Transio para o cliente Transio para o servidor Transio quando a aplicao faz uma operao Transio quando um segmento recebido O que enviado para esta transio

Fechamento ativo

Figura 15. Formato do cabealho Ipv6.

A: R: E:

MF (1 bit). Bit que indica se h mais fragmentos. Fragment offset (13 bits). Indica o deslocamento dos fragmentos de pacote. Time to live (8 bits). Tempo de vida do pacote, decrementado a cada roteamento. Protocol (8 bits). Tipo de dado carregado pelo pacote (e.g., 1 se for ICMP, 2 se IGMP, 6 se TCP, 17 se UDP). Header checksum (16 bits). Cdigo de verificao do cabealho do pacote. Source IP address (32 bits). Endereo IP da origem. Destination IP address (32 bits). Endereo IP do destino. Options. Especifica opes adicionais anexadas ao pacote. Data. Contm os dados que o pacote carrega.

Figura 16. Diagrama de estados TCP.

Hop limit (8 bits). Tempo de vida do pacote, descremetado a cada roteador. Source address (128 bits). Endereo da origem. Destination address (128 bits). Endereo do destino.

Apndice D Diagrama transio de estados


O protocolo TCP, considerando o estabelecimento e o trmino de uma conexo, pode estar em um dos estados do diagrama da Figura 16. importante salientar que, inicialmente, o estado da conexo fechada; a cada evento (que pode ser uma chamada de funo da aplicao, o recebimento de um segmento TCP ou um timeout) uma transio de estado ocorre. Na figura, A indica uma ao tomada pela aplicao, R se refere ao recebimento de um segmento TCP e E o segmento TCP enviado quando ocorre uma dada transio.

C.II IPv6 Cabealhos IPv6 (Figura 15) contm os seguintes campos: 44 Verso (4 bits). Indica a verso do IP. No caso, tem valor igual a 6. Priority (4 bits). Prioridade ajustada pelo remetende. Flow label (24 bits). Valor arbitrrio que identifica um fluxo de dados em particular, que pode ser tratado diferenciadamente. Payload length (16 bits). Next header (8 bits). Identifica o protocolo.

45