Você está na página 1de 124

PROF.

SRGIO NERY SIMES

SISTEMAS OPERACIONAIS II

SERRA
2013

Governo Federal
Ministro de Educao
Aloizio Mercadante
Instituto Federal do Esprito Santo - Ifes
Reitor
Denio Rebello Arantes
Pr-Reitora de Ensino
Araceli Vernica Flores de Nardi Ribeiro
Diretor-geral do Campus Vitria
Ricardo Paiva
Diretora do Centro de Educao a Distncia - Cead
Yvina Pavan Baldo
Coordenadores da Universidade Aberta do Brasil - UAB
Marize Lyra Silva Passos
Jos Mario Costa Junior
Curso de Tecnologia em Anlise e Desenvolvimento de Sistemas
Coordenador de Curso
Jefferson Ribeiro Lima
Designer Instrucional
Geraldo Angelo Vassoler
Professor Formador/Autor
Srgio Nery Simes

Ficha Catalogrfica

DIREITOS RESERVADOS
Instituto Federal do Esprito Santo - Ifes
Av. Rio Branco, 50 Santa Lcia Vitria ES CEP 29.056-255 Telefone: (27) 3227-5564
Crditos de autoria da editorao
Capa: Juliana Cristina da Silva
Projeto grfico: Juliana Cristina da Silva e Nelson Torres
Iconografia: Nelson Torres
Editorao eletrnica: Mares Comunicao
Reviso de texto:
Esther Ortlieb Faria de Almeida
COPYRIGHT proibida a reproduo, mesmo que parcial, por qualquer meio, sem autorizao escrita dos
autores e do detentor dos direitos autorais.

Ol, Aluno(a)!
um prazer t-lo(a) conosco.
O Ifes oferece a voc, em parceria com as Prefeituras e com o Governo
Federal, o curso Tecnologia em Anlise e Desenvolvimento de Sistemas,
na modalidade a distncia. Apesar de este curso ser ofertado a distncia,
esperamos que haja proximidade entre ns, pois, hoje, graas aos recursos
da tecnologia da informao (e-mails, chat, webconferncia, etc.) podemos
manter uma comunicao efetiva.
importante que voc conhea toda a equipe envolvida neste curso:
coordenadores, professores especialistas, tutor, porque, quando precisar de
algum tipo de ajuda, saber a quem recorrer.
Na EaD Educao a Distncia, voc o grande responsvel pelo sucesso
da aprendizagem. Por isso, necessrio que se organize para os estudos
e para a realizao de todas as atividades, nos prazos estabelecidos,
conforme orientao dos professores especialistas e do tutor.
Fique atento s orientaes de estudo que se encontram no Manual do Aluno!
A EaD, pela sua caracterstica de amplitude e pelo uso de tecnologias
modernas, representa uma nova forma de aprender, respeitando, sempre,
o seu tempo.
Desejamos a voc sucesso.
Equipe do Ifes

ICONOGRAFIA
Veja, abaixo, alguns smbolos utilizados neste material para gui-lo em seus estudos.

Fala do Professor.

Conceitos importantes. Fique atento!

Atividades que devem ser elaboradas por voc,


aps a leitura dos textos.

Indicao de leituras complentares, referentes


ao contedo estudado.

Destaque de algo importante, referente ao


contedo apresentado. Ateno!

Reflexo/questionamento sobre algo importante,


referente ao contedo apresentado.

Espao reservado para as anotaes que voc


julgar necessrias.

Cap. 1 - Introduo ao GNU/Linux9


1.1 Viso Geral do GNU/Linux10
1.2 Instalao de Aplicativos no Ubuntu11
1.2.1 Central de Programas Ubuntu12
1.2.2 Gerenciador de Pacotes Synaptic13

Cap. 2 - rvore de Diretrios do GNU/Linux19


2.1 Estrutura bsica da rvore de diretrios do GNU/
Linux19
2.2 Usurios e Grupos GNU/Linux27

Cap. 3 - Comandos Bsicos do GNU/Linux31


3.1 Formato Geral dos Comandos32
3.2 Comandos de ajuda33
3.3 Comandos de Manipulao de Arquivos e
Diretrios34
3.3.1 Referenciando vrios arquivos por intermdio de
curingas43
3.4 Comandos para gerenciamento de processos47
3.4.1 Manipulando processos com teclas de atalho49
3.4.2 Enviando sinais com o comando kill50
3.5 Outros comandos53
3.6 Instalao de pacotes em modo texto em sistemas
Debian-like55
3.7 Compartilhando diretrios entre sistemas
Linux56
3.7.1 Na mquina servidora56
3.7.2 Na mquina cliente57

Cap. 4 - Configurao de interfaces de rede e


clientes DNS61
4.1 Configurao de interfaces de rede61
4.1.1 Editando o arquivo interfaces64
4.2 Configurao do cliente DNS65
4.3 Testando o host na rede66

Cap. 5 - Edio e Compilao de


Programas no GNU/Linux71
5.1. Edio de programas em editores
grficos72
5.2. Compilao e execuo de
programas75
5.2.1. Exibindo Warnings com a opo -Wall76
5.2.2. Controlando excees78
5.2.3. Programando a rotina de tratamento de
sinais81
5.3. PIPES E REDIRECIONAMENTOS 82
5.3.1. Utilizando Pipes82
5.3.2. Redirecionando a entrada de dados83
5.3.3. Redirecionando a sada de dados84

Cap. 6 - Automatizao de tarefas


administrativas87
6.1. Shell Scripts87
6.2. Agendamento de Tarefas91

Cap. 7 - Manipulao de Processos em C


no GNU/Linux95
7.1. Identificao de um processo96
7.2. Criao de processos98

Cap. 8 - Manipulao de Threads em C no


GNU/Linux105
8.1. Implementao de Threads108
8.1.1. A primitiva pthread_create()109
8.1.2. A primitiva pthread_join()109
8.1.3. Implementao de threads em C110
8.1.4. Utilizao de threads para aumentar o
desempenho114
8.1.5. O problema do compartilhamento de
recursos118

rEFERNCIAS 121
aNEXOS 123

APRESENTAO

Ol!
Meu nome Srgio Nery Simes, responsvel pela disciplina Sistemas
Operacionais II. Atuo como professor do Ifes h cinco anos e j lecionei
em outras instituies de ensino superior (UFES, FAVI e Salesiano). Sou
graduado em Engenharia de Computao (2000) e Mestre em Informtica
(2004), ambos pela UFES. Minhas reas de interesse so: Processamento de
Alto Desempenho, Arquiteturas Avanadas de Computador, Arquitetura
de Sistemas Operacionais e Sistemas Distribudos.
Com este material, voc conhecer um pouco da aplicao prtica dos
conceitos de Sistemas Operacionais. O Sistema Operacional escolhido
para isso foi o GNU/Linux, principalmente por ser compatvel com o
padro POSIX, o que possibilita aplicar os conhecimentos obtidos nesta
disciplina em vrios sistemas operacionais.
O objetivo deste material prover uma viso geral da utilizao prtica de
sistemas operacionais, comeando pela linha de comando com comandos
bsicos, passando por edio e compilao de programas e chegando
utilizao de processos e threads em C, e entender como o Sistema
Operacional realiza o escalonamento desses processos. Lembre-se, sempre,
de que tudo que aprender aqui poder ser utilizado em diversos outros
sistemas operacionais Unix-like.
Em geral, para ser bem sucedido neste curso importante que o aluno
faa os exerccios e estude regularmente, evitando-se, dessa forma, o
acmulo de contedo.
Assim, desejo a voc bastante sucesso!!!
Prof. Srgio Nery Simes

Ol!
Meu nome Celio Maioli, atuo como professor de educao superior desde
2006; no Ifes, desde 2009. Graduei-me em Engenharia de Computao em
2002 e recebi o ttulo de mestre em Automao em 2007, ambos os cursos
pela Ufes; iniciei os estudos em informtica no curso tcnico em 1990.
Colaborar para o desenvolvimento deste material, que agora voc tem em
mos, foi um grande prazer, pois sempre tive afinidade com sistemas de
cdigo aberto e softwares livres, em geral. Acredito que a possibilidade

de compreender o funcionamento de parte ou de todo o software, alm


de poder compartilh-lo, favorece o crescimento do profissional de TI e o
desenvolvimento tecnolgico do pas.
Espero que voc aproveite ao mximo.
Prof. Celio Maioli

Introduo ao GNU/Linux

Prezado(a) aluno(a),
Comearemos o primeiro captulo com alguns conceitos importantes
sobre o Sistema Operacional GNU/Linux. Em seguida, veremos duas
ferramentas para gerenciar graficamente a instalao e remoo de
aplicativos ao sistema: a primeira, mais simples e intuitiva; a segunda,
mais sofisticada e flexvel.
Bom estudo!
Segundo Tanenbaum [5], os primeiros softwares capazes de intermediar
o acesso aos recursos de hardware dos computadores surgiram entre
1955 e 1965. A inteno dos projetistas era criar sistemas que pudessem
(1) ler os programas de usurio, (2) armazen-los sequencialmente em
fitas magnticas, (3) execut-los e (4) armazenar a sada em outras fitas
para impresso. Como os equipamentos eram muito caros, estas tarefas
poderiam ser feitas em mquinas diferentes para diminuir o tempo de
ociosidade dos hardwares de ento. Estes softwares foram os primeiros
Sistemas Operacionais (SOs).
Com a evoluo do hardware dos computadores, os Sistemas
Operacionais agregaram caractersticas como a interface grfica, a
multiprogramao, o multiprocessamento, a habilidade de atribuir
permisses de acesso a mltiplos usurios e o suporte comunicao
em redes. Alm dos sistemas de uso geral, surgiram os sistemas mais
adequados a determinados domnios computacionais como os sistemas
de tempo real, sistemas multimdia e sistemas mveis.
Dentre os Sistemas Operacionais de uso geral, destacam-se o MacOs,
da Apple, o Windows, da Microsoft e o GNU/Linux. Estudaremos este
ltimo pois, alm de ser um sistema cujo uso crescente, ele ainda serve
de base para sistemas mveis, como o Android, da Google, e facilita o
aprendizado de conceitos relacionados a Sistemas Operacionais.

10

Prof. Srgio Nery Simes

1.1 Viso Geral do GNU/Linux


O GNU/Linux um Sistema Operacional de rede multiusurio e
multiprogramado, de uso geral, semelhante ao Unix, composto por um
kernel, e por outros softwares livres ou privativos.
O desenvolvimento do kernel iniciou-se em 1991, quando Linus
Torvalds escreveu um cdigo baseado em uma verso reduzida do Unix,
chamada Minix, criada por Andrew S. Tanenbaum para fins didticos.
Posteriormente, Linus enviou uma mensagem aos seus contatos de uma
rede de comunicao convidando-os a participar da implementao do
software. Quando a primeira verso ficou pronta, o kernel, batizado de
Linux, foi empacotado juntamente a outros softwares, e distribudo.
O kernel, tambm chamado de core ou ncleo, um componente
do Sistema Operacional responsvel por gerenciar os recursos do
sistema e servir de interface entre o hardware e os aplicativos.
Com tempo, o kernel amadureceu, os pesquisadores e a imprensa
especializada reconheceram vantagens tcnicas, como estabilidade e
segurana e surgiram projetos que fizeram o GNU/Linux economicamente
vivel. A partir disto, mais organizaes e grupos de usurios passaram
a empacotar conjuntos selecionados de softwares, privados ou no,
personaliz-los e distribu-los. O Sistema Operacional empacotado
chamado distribuio e dentre as mais conhecidas e utilizadas,
encontram-se: Ubuntu, Debian, Suse, Red Hat, Slackware, Mandriva,
Fedora, CentOS, Linux Mint, PCLinuxOS, Kurumin e Knoppix1.
Embora o kernel seja a parte principal, um Sistema Operacional
formado de outros componentes para desempenhar suas tarefas. Dentre
os quais podem ser citados: instaladores, particionadores, editores de
texto, leitores de mdia, debugadores de cdigo e compiladores entre
outros. Estes softwares podem ser desenvolvidos total ou parcialmente
por empresas ou grupos de usurios que podem optar por licenciar
seus cdigos e softwares para uso comum ou para uso restrito. O
licenciamento que restringe o uso do cdigo ou do software, o torna
proprietrio, ou privativo. O software, mesmo privativo, pode ser usado
em sistemas GNU/LINUX, porm so necessrios acordos de negcios
entre as partes. Como exemplos, podem ser citados plugins que
executam aplicaes em Flash, que tocam mp3 ou que exibem imagens
jpeg ou jpg, leitores pdf como o Adobe Acrobat Reader, jogos, etc.
1 http://distrowatch.com/

Sistemas Operacionais II

Muitos dos softwares que compe sistemas GNU/Linux so privativos,


mas outros foram desenvolvidos pelos membros do projeto GNU2.
O projeto GNU (GNU is not Unix) foi criado por Richard Stallman e
outros colaboradores, em 1984, com o objetivo de organizar o movimento
de Software Livre, em contraponto aos sistemas cujo modelo de negcio
baseia-se na venda de direitos de utilizao. A Free Software Foundation
(FSF) foi criada mais tarde com o objetivo de institucionalizar e
difundir as quatro liberdades defendidas por Stallman e seus milhes
de seguidores3, que caracteriza um software como sendo software livre:
a liberdade de executar o programa, para qualquer propsito
(liberdade 0);
a liberdade de estudar como o programa funciona, e adapt-lo s
suas necessidades (liberdade 1). Para tanto, acesso ao cdigo-fonte
um pr-requisito;
a liberdade de redistribuir cpias de modo que voc possa ajudar ao
prximo (liberdade 2);
a liberdade de distribuir cpias de suas verses modificadas a outros
(liberdade 3). Desta forma, voc pode dar a toda comunidade a
chance de beneficiar de suas mudanas. Para tanto, acesso ao cdigofonte um pr-requisito.
Para valorizar o trabalho destes programadores e a base terica
desenvolvida pelos criadores do projeto, o mais correto chamar o
sistema de GNU/Linux.
Para fins de exemplo este material adotar a distribuio Ubuntu
Desktop em Portugus do Brasil, desenvolvido pela empresa Canonical,
devido a sua facilidade de uso e por ser um dos sistemas GNU/Linux
mais usados no mundo. Utilizar esta distribuio em casa facilitar a
verificao dos resultados e a assimilao dos conceitos.

1.2 Instalao de Aplicativos no Ubuntu


Como na disciplina Sistemas Operacionais I voc aprendeu a instalar o
Ubuntu Desktop, pode-se assumir que seu sistema esteja pronto para o
uso, pois muitas configuraes e instalaes so feitas automaticamente,
todavia, ser um administrador de Sistemas Operacionais deve saber
como instalar e desinstalar software para manter seus sistema mais
adequado as demandas.
2 http://www.gnu.org/
3 http://www.gnu.org/philosophy/free-sw.html

11

12

Prof. Srgio Nery Simes

Em sistemas GNU/Linux podem ser instalados softwares, bibliotecas,


cabealhos de funes e documentao e para referir-se genericamente
a estas categorias, usa-se o termo pacote.
H diversas maneiras de instalar ou remover pacotes no Ubuntu, porm
trataremos de apenas duas delas. Uma mais simples, atravs da ferramenta
Central de Programas Ubuntu; e outra, atravs de uma ferramenta um
pouco mais sofisticada, o Gerenciador de pacotes Synaptic.
1.2.1 Central de Programas Ubuntu
Desenvolvido pela prpria Canonical, a Central de Programas Ubuntu
faz parte da verso 10.04 desta distribuio e visa facilitar a instalao
e a remoo de pacotes por usurios no-tcnicos. O aplicativo pode
ser encontrado no menu Aplicativos Central de Programas Ubuntu.
Na lateral esquerda da janela principal, exibida na Figura 1, podem ser
vistas as opes Obter Programa e Programas Instalados. Na opo
Obter Programa, pode-se encontrar uma relao de pacotes separados
por categoria, produzidos pela prpria Canonical ou por parceiros, de
distribuio livre ou privativa. A lista de pacotes exibida nesta opo
foi baixada a partir de sites remotos ou do CD/DVD que voc utilizou
na instalao do sistema. Na opo Programas Instalados, podemse remover os pacotes instalados em sua mquina ou obter mais
informaes sobre eles.
No menu superior, a opo mais importante Editar Canais de
Software, pois atravs dela podem-se informar os repositrios da onde
o Ubuntu baixar os pacotes e as atualizaes de sistema.
Figura 1 Utilitrio para adicionar ou remover programas Ubuntu

Fonte:

Sistemas Operacionais II

A ferramenta tambm possui um mecanismo de busca no canto superior


direito que permite ao usurio verificar se algum programa especfico
encontra-se no repositrio e se est instalado ou no.
Um repositrio um diretrio de programas disponvel na internet,
atravs dos protocolos HTTP ou FTP, onde encontram-se verses
estveis e atualizadas dos pacotes das distribuies GNU/Linux,
inclusive do prprio kernel. comum cada distribuio possuir
seu prprio repositrio, mas desenvolvedores independentes
tambm podem possu-los, caso queiram tornar acessveis seus
prprios programas, como por exemplo, a Google que mantm
em seu repositrio o Chrome, o Google Earth, SketchUp, etc ou a
Comunidade Libre Office que mantm em seu repositrio a sute
de escritrio do mesmo nome.
Verificar se Gerenciador de Pacotes Synaptic est instalado. Se
estiver, passe prxima seo. Para instal-lo, clique na caixa ao lado
de Busca da Central de Programas e digite Synaptic. Aps localizlo, clique no boto Instalar. O programa solicita sua senha, inicia
o download e a instalao do aplicativo. Observe que a instalao
ou remoo de um software s feita pelo usurio administrador,
porm nas distribuies GNU/Linux derivadas do Debian um dos
usurios, geralmente o primeiro cadastrado, possui prerrogativas
de administrao, por isso sua senha poder validar o processo.

1.2.2 Gerenciador de Pacotes Synaptic


Usurios com um pouco mais de conhecimento em GNU/Linux
preferem a ferramenta Gerenciador de Pacotes Synaptic, pois ela
permite algumas configuraes adicionais, alm de poder ser encontrada
em outras distribuies Debian-like.
Os desenvolvedores empacotam os softwares que desejam distribuir
para facilitar instalaes e remoes atravs de aplicativos como
o Synaptic. Cada pacote pode possuir os binrios executveis,
bibliotecas, scripts, texto plano ou formatado ou cdigos-fonte e
este contedo ser decidido pela organizao ou pela comunidade
de usurios que disponibiliza o pacote.
Por outro lado, um determinado software pode precisar de outros
arquivos no empacotados para o seu pleno funcionamento, e
quando isso ocorre se diz que este software possui dependncias.

13

14

Prof. Srgio Nery Simes

Softwares como o Synaptic resolvem (buscam) as dependncias,


desde que elas se encontrem nos repositrios.
Mas por que os softwares no veem empacotados com todas as
dependncias? Para evitar que o pacote fique muito grande e que
sejam feitas instalaes duplicadas ou mesmo desatualizadas,
uma vez que se supes que as dependncias j estejam instaladas
no sistema do usurio final.
Nas distribuies Debian e suas derivadas, chamadas Debian-like,
como o Ubuntu, estes pacotes so identificados pela extenso .deb.
Nas distribuies Red-Hat e suas derivadas, chamadas de RedHat-like,
como o Fedora, estes pacotes so identificados pela extenso .rpm.
Para ver a interface principal, exibida na Figura 2, acione o menu Sistema
Administrao Gerenciador de Pacotes Synaptic e digite a senha de
administrador, que ser pedida logo no acionamento do aplicativo. A
janela principal exibe, alm do menu superior, botes com as operaes
mais frequentes, que so discutidos a seguir:
Figura 2 Gerenciador de Pacotes Synaptic

Fonte:

I. o boto Recarregar atualiza a lista de pacotes disponveis para saber


se h novas verses. Isso ocorre porque os pacotes esto em constante
alteraes, devido a melhorias implementadas pelos desenvolvedores e
a correes de bugs ou falhas de segurana. Aps clicar em Recarregar,
o sistema baixar a lista de pacotes disponveis para instalao no
confunda isso com baixar os pacotes. recomendvel que voc pressione
esse boto antes de atualizar seu sistema ou instalar algum pacote;

Sistemas Operacionais II

II. aps recarregar a nova lista, o sistema poder informar, dentre os


pacotes instalados, quais podem ser atualizados. Com isso, voc pode
atualizar seu sistema atravs do boto Marcar todas as atualizaes. Manter
o sistema sempre atualizado aumenta a segurana e evita instabilidades;
III. o boto Aplicar serve para efetuar as alteraes instalao, remoo
ou atualizao de pacotes. Por exemplo: aps pressionar o boto Marcar
todas as atualizaes, o boto Aplicar deve ser pressionado para que os
pacotes sejam atualizados;
IV. caso voc queira saber mais informaes sobre um pacote individualmente, selecione-o e clique no boto Propriedades;
V. por ltimo, o boto Procurar localiza pacotes para voc, desde que se
digite o nome ou parte dele, ou simplesmente algum termo relacionado.
Como atividade prtica, ser instalado o compilador gcc (GNU C
Compiler) e alguns manuais de ajuda do sistema. Para isso, digite gcc,
pressione o boto Procurar ou pressione <enter>. Voc obter um
resultado semelhante ao da Figura 3. Todos os pacotes relacionados ao
termo gcc so listados. Clique com o boto direito sobre os pacotes
gcc (compilador) e gcc-doc (documentao do gcc) e os Marque
para Instalao. Note que, para cada pacote marcado para instalao,
podero ser sugeridos outros, os quais so as dependncias e devem
ser marcados tambm. Aps selecionar todos os pacotes sugeridos,
clique no boto Aplicar. O programa avisa que ser necessrio fazer o
download, ento confirme e aguarde a instalao.
Com estas operaes simples, voc ter o compilador gcc instalado e
funcionado, mas pode estar se perguntando: como saber quais so os
pacotes que devem ser selecionados para instalao? Parece complexo
primeira vista, porm todas essas informaes podem ser encontradas
facilmente na Internet e em livros especficos de programao. Ou,
simplesmente, com a prtica do diaadia. O que voc fez, na verdade,
foi simples: em vez de instalar apenas o compilador gcc, voc instalou
tambm as bibliotecas necessrias para compilao, bem como os
manuais de documentao para consultas futuras. Figura 3: Janela de
instalao do Synaptic com o compilador gcc marcado.

15

16

Prof. Srgio Nery Simes


Figura 3 - Janela de instalao do Synaptic com o compilador gcc marcado.

Fonte:

Atividades
1. Como podem ser classificados os Sistemas Operacionais?
2. O que so distribuies GNU/Linux?
3. O que kernel?
4. O que um software privativo?
5. Quais so as quatro liberdades do software defendidas pela FSF?
6. O que so repositrios?
7. O que so pacotes?
8. Qual o tipo de pacote associado a distribuies Debian-like?
9. Qual o tipo de pacote associado a distribuies RedHat-like?
10. Utilizando o gerenciador de pacotes Synaptic, instale os
aplicativos/utilitrios abaixo:
a. glibc-doc documentao para a biblioteca de desenvolvimento
b. manpages (manual pages) documentao dos sistemas GNU/
Linux
c. manpages-dev documentao para desenvolvimento nos
sistemas GNU/Linux
d. manpages-posix documentao do padro POSIX
e. manpages-posix-dev documentao para desenvolvimento
no padro POSIX

Sistemas Operacionais II

f. manpages-pt documentao do padro POSIX em portugus


g. manpages-pt documentao para desenvolvimento no
padro POSIX em portugus
11. Utilizando a Central de Programas Ubuntu, instale os
aplicativos/utilitrios abaixo. Lembre-se de que voc pode
selecionar diversos aplicativos antes de clicar em aplicar.
a. Ubuntu restricted extras aplicaes com restrio de
copyright (mp3, avi, mpeg, TrueType, Java, Flash)
b. 7Zip ferramenta de compactao/descompactao
c. GIMP Editor de Imagens
d. Inkscape Editor de Imagens vetorias
e. Gstreamer Plugins Plugins de vdeo (instale todos)
f. K3b Programa para Gravao de CDs/DVDs
g. Macromedia Flash Plugin plugin para navegadores web
h. Mplayer Movie Player Reprodutor Multimdia
i. LibreOffice Sute completa de produtividade LibreOffice.
j. SAMBA Integrao em rede com mquinas Windows (instale
apenas se estiver conectado em rede)
k. Sun Java 6.0 Plugin Plugin Java para navegadores web
l. Sun Java 6 Runtime plataforma padro para o ambiente Java
(JRE)
m. Suporte a idiomas configurar suporte a idiomas em seu
sistema
n. Wine Windows Emulator Camada para rodar aplicaes
Windows no Linux
Aps a instalao desses aplicativos, voc poder ouvir msicas em
diversos formatos, assistir a vdeos em formatos proprietrios, navegar
na Web visualizando melhor as pginas que necessitem da instalao
de plugins e fontes especiais, gravar CDs/DVDs, etc. Se quiser, instale
outras aplicaes e tambm alguns jogos, pois o sistema possui uma
variedade deles mas no gaste seu tempo todo jogando, afinal, voc
precisa estudar SO2!
H vrios sites na internet com informaes teis sobre sistemas GNU/
Linux. Seguem abaixo alguns:

17

18

Prof. Srgio Nery Simes

Mazioli, Gleydson. Guia Foca Linux. (www.guiafoca.org). 2007.


Site da distribuio Ubuntu no Brasil (http://www.ubuntu-br.org/)
Documentao do Ubuntu no Brasil (http://wiki.ubuntu-br.org/
Documentacao)
Suporte do Ubuntu no Brasil (http://www.ubuntu-br.org/suporte)
Site do projeto GNU (http://www.gnu.org/)
Informaes sobre sistemas Linux (http://pt.wikipedia.org/wiki/
Linux)
Dicas, notcias e tutoriais sobre Linux (http://br-linux.org/)
Comunidade Linux no Brasil (http://www.vivaolinux.com.br/)
Apostilas gratuitas e documentao sobre o Linux (http://www.
dicas-l.com.br/)

Prezado(a) aluno(a),
Terminamos o primeiro captulo. Nossa jornada est apenas
comeando, mas agora voc j sabe como instalar programas e
pacotes no GNU/Linux de duas formas distintas.
A seguir, estudaremos a rvore de diretrios do GNU/Linux e sua
organizao.
Bom estudo!

___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________

rvore de Diretrios do
GNU/Linux

Prezado(a) aluno(a),
Agora que voc j sabe como instalar aplicativos em seu sistema
utilizando a interface grfica, vamos verificar como funciona a
estrutura de diretrio, ou seja, onde cada componente dos pacotes
pode ser instalado e onde encontram-se elementos fundamentais
para o funcionamento do sistema.
Bom estudo!

2.1 Estrutura bsica da rvore de


diretrios do GNU/Linux
Em sistemas GNU/Linux, os diretrios esto organizados segundo
uma hierarquia denominada Filesystem Hierarchy Standard (FHS).
Apesar de na traduo literal indicar um sistema de arquivos, trata-se
de uma rvore de diretrios padro que deve ser seguida para manter a
compatibilidade entre distribuies e a padronizao na documentao
do SO e dos aplicativos. Note que a FHS uma recomendao e caber
a todos os usurios e desenvolvedores os esforos necessrios para
cumpri-la, no entanto, como software livre que , pode haver uma ou
outra distribuio GNU/Linux que desrespeita o padro. Nesta seo,
a funo dos principais diretrios ser discutida, porm fortemente
recomendvel que o estudante acompanhe o que for dito aqui em seu
prprio sistema.
O FHS possui um diretrio principal, a partir do qual possvel acessar
todos os demais, chamado diretrio raiz (ou root directory, em ingls)
que representado por uma / (barra).
O termo root surgir nesta disciplina associado a outros conceitos,
portanto, no confunda o diretrio raiz (root) com o login root, ou
com o diretrio chamado root! Apesar do nome, so coisas diferentes:
o primeiro a raiz do FHS e representado pela /; o segundo o
login do usurio administrador do sistema; o ltimo o diretrio /
root, onde o usurio administrador armazena seus arquivos.

20

Prof. Srgio Nery Simes

O diretrio /bin existe para armazenar os comandos ou links


simblicos para comandos que todo usurio pode executar, pois este
diretrio encontra-se no caminho principal (PATH) do sistema. O
nome bin tem origem em binary files, ou seja, os arquivos no texto
plano que podem ser executados diretamente pelo SO. Comandos
binrios que no so muito essenciais podem ser armazenados no
diretrio /usr/bin. O diretrio /sbin armazena os comandos ou
links para comandos utilizados apenas pelo usurio administrador.
Para se ver o contedo deste diretrio, abra o terminal em Aplicativos
Acessrios Terminal (Aplicativos Acessrios Consola em
algumas tradues), digite ls /bin e voc obter uma sada semelhante
da Figura 4.
Os links simblicos so atalhos que podem ser criados a partir de
comandos de texto e so usados para acessar determinado arquivo
a partir de um caminho no padro, sem que seja necessrio
duplic-lo ou mov-lo.
Figura 4 - Contedo do diretrio /bin

Fonte:

O processo de inicializao de um computador pode ser dividido em


duas fases: hardware e Sistema Operacional. Assim que a fase hardware
finaliza, os arquivos localizados do diretrio /boot sero lidos para
que a imagem do kernel possa ser carregada na memria.
O diretrio /dev armazena arquivos especiais (de caracter ou de bloco)
que so referncias aos dispositivos fsicos da mquina. Por exemplo:
possvel encontrar o arquivo /dev/dsp, que se relaciona sada de udio;
e o arquivo /dev/mouse, que recebe a entrada do dispositivo apontador.
Tambm h arquivos relacionados aos dispositivos de armazenamento,
como discos rgidos e leitores pticos, e aos terminais do sistema.

Sistemas Operacionais II

Os dispositivos IDE (Integrated Drive Electronics) relacionam-se aos


arquivos /dev/hdX (onde X pode ser a, b, c, d, etc). Se seu computador
tiver um disco IDE com duas parties e um leitor IDE de DVD, os
arquivos relacionados sero /dev/hda1, para a primeira partio, /
dev/hda2, para a segunda partio e /dev/hdd para o leitor ptico. Em
geral, os arquivos /dev/hdb e /dev/hdc ficam reservados a outros discos
rgidos de acordo com a ordem de ligao dos cabos na placa. O mesmo
raciocnio vale para as unidades seriais SCSI, SATA, SATAII, etc, porm
o arquivo ser o /dev/sda, /dev/sdb, /dev/sdc e assim sucessivamente.
Os sistemas GNU/Linux permitem que se conecte a eles por meio de
terminais. Cada terminal pode executar diferentes instncias do mesmo
aplicativo e isso permite que se use o sistema com mais flexibilidade. A
maioria dos sistemas inicializado com 8 terminais, sendo que um deles
inicia o servidor grfico responsvel pela interface grfica e os demais
podem ser acessados pela combinao de teclas CTRL+ALT+FX, onde
FX o conjunto de teclas de funo F1, F2, F3, etc. Se voc digitar
CTRL+ALT+F1, uma janela semelhante ao Quadro 1 ser exibida,
aguardando que voc faa login. Nele pode-se ver o nome e a verso do
sistema, o nome da mquina e o arquivo de terminal responsvel, no
exemplo tty1. Note que haver um arquivo /dev/tty1, /dev/tty2/, dev/
tty3/, e assim sucessivamente.
Quadro 1: Tela de apresentao de um dos terminais Ubuntu
Ubuntu 10.04.4 LTS casa tty1
casa login:
Fonte:

O diretrio /etc armazena os arquivos que controlam as operaes


locais dos aplicativos. Como estes arquivos de configurao esto ligados
s aplicaes, eles permanecero na mquina enquanto a aplicao
permanecer. Caso seja necessrio armazenar algum arquivo binrio, um
diretrio abaixo do /etc dever ser criado pela aplicao, no momento da
instalao. Um exemplo de arquivo que pode ser encontrado neste diretrio
o /etc/services que associa servios de rede s portas TCP/UDP.
Conforme o prprio nome sugere, o diretrio /home a casa do usurio
comum no sistema GNU/Linux. neste local em que sero criados
subdiretrios onde os arquivos, preferncias e configuraes especficas
da conta do usurio sero armazenados. Se o objetivo do sistema for
simplesmente abrigar um servidor de rede, pode ser desnecessrio um
diretrio /home, por isso ele opcional. Administradores de rede
mais experientes podem armazenar o contedo deste diretrio em uma
partio diferente da partio principal ou mesmo em outro sistema
acessvel remotamente.

21

22

Prof. Srgio Nery Simes

No diretrio /lib podem ser encontradas as bibliotecas (libraries)


necessrias utilizao dos comandos armazenados nos diretrios /
bin e /sbin.
No GNU/Linux, todos os dispositivos, como drives de disquete,
unidades pticas, pendrives e discos remotos so mapeados em
diretrios chamados de pontos de montagens, abaixo do diretrio
raiz /. Por exemplo: no Ubuntu, o ponto de montagem do disquete
normalmente o diretrio /media/floppy; o do CD/DVD /media/
cdrom. Ou seja, para acessar os arquivos e diretrios de um CD voc
deve entrar no diretrio /media/cdrom. Assim, no GNU/Linux, todos
os dispositivos podem ser acessados a partir do diretrio raiz /como se
fosse uma nica e grande rvore hierrquica.
O conceito de montagem est relacionado transitoriedade de
sistemas de arquivos externos conectados ao sistema principal.
Na prtica, isso significa que mdias removveis, como unidades
USB, ou sistemas temporrios, como compartilhamentos de rede,
podem fazer parte do sistema por um certo tempo, por isso devem
ser montados, ou seja, associados ao sistema principal para que
operaes de leitura e escrita sejam transparentes ao usurio.
O diretrio /mnt tambm usado como ponto de montagem em
sistemas GU/Linux, porm o padro que apenas sistemas de arquivo
temporrios sejam associados a este diretrio. Podem-se citar, como
exemplo, os diretrios compartilhados em uma rede ou outras parties
no mesmo disco.
Em sistemas MS-Windows, cada dispositivo, ou partio,
representado por uma letra. Por exemplo: se seu computador
possui um drive de disquete, uma unidade de CD\DVD e uma
partio no disco rgido, as letras associadas provavelmente sero:
A:\ para o drive de disquete, C:\ para o disco rgido e D:\
para o drive de CD/DVD. Caso algum dispositivo seja plugado
na porta USB, a letra E:\ pode ser associada. como se cada
dispositivo tivesse seu prprio diretrio raiz. Assim, como
herana do MS-DOS, no MS-Windows no h uma raiz nica,
a partir da qual possvel acessar qualquer diretrio no sistema.
Apesar do exposto acima, sistemas MS-Windows tambm usam o
conceito de montagem de sistemas de arquivos quando o usurio
deseja acessar um diretrio compartilhado em rede. A pasta
de rede pode ser montada quando o usurio deseja acess-la e
desmontada em seguida.

Sistemas Operacionais II

Conforme j pode ser visto, h conceitos em sistemas GNU/Linux que


so diferentes em outros sistemas privativos. Isso se deve a vrios fatores,
porm importante conhecer a estrutura de diretrios para facilitar a
utilizao plena do GNU/Linux.
Outro diretrio interessante o /proc, que, na verdade, um pseudodiretrio, pois seu contedo no est fisicamente no disco-rgido e sim
na memria, e nele que so armazenadas as informaes sobre os
processos e tambm sobre o kernel. Alm disso, neste diretrio tambm
se encontram informaes sobre o hardware de seu computador. Por
exemplo: para saber informaes a respeito de seu processador, como
sua configurao, voc pode consultar o contedo do pseudo-arquivo
cpuinfo dentro do diretrio /proc. Para exibir na tela o contedo deste
arquivo, digite cat /proc/cpuinfo. E o resultado ser algo semelhante
Figura 5. Note que se voc tiver rodando GNU/Linux a partir de uma
mquina virtual, o resultado exibido no ser o seu processador real e
sim o processador virtual da mquina virtual.
Figura 5: Exibindo informaes sobre o seu processador

Fonte:

Outro pseudo-arquivo que pode ser til na verificao do hardware de


seu computador o meminfo, que tambm se encontra no diretrio
/proc. Para exibir seu contedo na tela basta digitar cat /proc/
meminfo, e voc obter um resultado semelhante ao da Figura 6. Com
esse comando, possvel verificar a quantidade real de memria de seu
computador, alm de uma srie de outras, como memrias utilizadas por
buffers, por swap, etc. Lembre-se novamente de que, caso esteja rodando

23

24

Prof. Srgio Nery Simes

em uma mquina virtual, o resultado ser da memria reservada para a


mquina virtual e no da memria real.
Figura 6: Exibindo informaes sobre a memria de seu computador

Fonte:

O diretrio /root existe, a parte, em sistemas GNU/Linux para armazenar


os arquivos do usurio administrador, porm pode-se usar outro local.
O diretrio /sbin armazena binrios executveis para administrao
do sistema, como, por exemplo, comandos de reboot, checagem de
sistemas de arquivos, manipulao de tabela de parties, etc. Devido
ao dano que estes comandos podem causar se mal utilizados, apenas o
superusurio pode execut-los.
Sempre que algum arquivo ou diretrio precisar ser criado ou salvo
temporariamente e alguma descompactao precisar ser feita, estas
operaes sero feitas no diretrio /tmp. Recomenda-se deletar o
contedo deste diretrio a cada vez que a mquina for desligada.
Normalmente, os sistemas so configurados para que um usurio
tenha acesso apenas ao seu prprio diretrio /home, no tendo
acesso ao diretrio de outro por questes de segurana. H tambm
o diretrio de uso temporrio /tmp, ao qual todos os usurios
possuem acesso. Mas, em geral, os usurios esto confinados apenas
a esses dois diretrios, ficando os diretrios de sistema sem permisso

25

Sistemas Operacionais II

de acesso ou com permisso de uso restrito (somente leitura). No


estou considerando aqui, como diretrios de sistema, os diretrios
de montagem de dispositivos como disquete, CD/DVD ou pendrive
aos quais, obviamente, o usurio que os montou possuir acesso.
O diretrio /usr armazena arquivos que sero usados pelas aplicaes
e pelas bibliotecas, portanto complexo e, geralmente, bastante
hierarquizado. Nele h um grupo padro de subdiretrios com funes
especificadas no Quadro 2.
Quadro 2: Subdiviso do diretrio /usr

Diretrio

Descrio

bin

Comandos de usurio. Semelhante ao


/bin.

include

Cabealhos de bibliotecas usadas na


compilao de cdigos.

lib

Bibliotecas. Semelhante do /lib.

local

Arquivos de uso local.

sbin

Comandos no essenciais ao sistema.

share

Arquivos independentes de
arquitetura como imagens, udios, etc.

Fonte:

Como j foi comentado, sistemas GNU/Linux derivam ser sistemas


Unix, que por sua vez existem desde os anos 1970. No incio da
existncia dos sistemas Unix, os diretrios /bin e /usr/bin, /lib e /
usr/lib e /sbin e /usr/sbin residiam fisicamente em discos separados.
A estratgia era manter em /bin, /lib e /sbin, no disco principal e
mais rpido, os comandos mnimos para o funcionamento e a
restaurao do sistema e nos diretrios /usr/bin, /usr/lib e /usr/sbin
os demais comandos. A estrutura atual herdou esta caracterstica,
pois pode-se desejar separar os contedos dos diretrios e seus
respectivos pares em parties diferentes.
Por definio, diretrio /var armazena dados variveis, porm isso fica
mais concreto quando verificamos arquivos e diretrios administrativos
como os registros de eventos (logs) que ficam neste local.
O Quadro 3 mostra um sumrio com os principais diretrios e suas
respectivas funes, mas recomendvel que, ao ler esta parte, voc
verifique em seu prprio sistema e faa o comparativo.

26

Prof. Srgio Nery Simes


Quadro 3: Relao dos diretrios mais importantes do FHS

Diretrio

Descrio resumida

/bin

Contm arquivos de programas que so


usados por todos os usurios.

/boot

Contm arquivos estticos necessrios


inicializao do sistema.

/dev

Contm arquivos usados para acessar


dispositivos (perifricos) existentes no
computador.

/etc

Contm arquivos de configurao de seu


computador local.

/home

Contm diretrios padro (homes) dos


usurios. opcional.

/lib

Contm bibliotecas compartilhadas pelos


programas do sistema e mdulos do
kernel.

/media

o ponto de montagem de mdias


removveis (unidades USB, CD-ROM).

/mnt

o ponto de montagem para sistemas de


arquivos temporrios (diretrios remotos,
outras parties de um mesmo disco).

/opt

reservado instalao de plugins.

/proc

o sistema de pseudo-arquivos do kernel.


Este diretrio no existe fisicamente
no disco rgido, ele colocado neste
diretrio pelo kernel e usado por diversos
programas que fazem sua leitura, que
verificam configuraes do sistema
ou que modificam o funcionamento
de dispositivos do sistema atravs da
alterao em seus arquivos.

/root

Contm arquivos do usurio root


(superusurio).

/sbin

o diretrio de programas usados pelo


superusurio (root) para administrao e
controle do funcionamento do sistema.

/tmp

o diretrio para armazenamento


de arquivos temporrios criados por
programas.

/usr

Contm maior parte de seus programas.


Normalmente acessvel somente como
leitura.

/var

Contm a maior parte dos arquivos que


so gravados com frequncia pelos
programas do sistema, e-mails, spool de
impressora, cache, etc.

Fonte:

Sistemas Operacionais II

2.2 Usurios e Grupos GNU/Linux


Existem trs tipos de usurios em sistemas GNU/Linux: os usurios
comuns, o superusurio e os usurios de sistema, a saber:
os usurios comuns so as pessoas com login e senha cadastrados
para usarem o sistema. Por padro, este usurio s pode executar
os programas que no alteram o estado do sistema de forma
comprometedora, embora seja possvel dar permisses para executar
outros programas. As contas dos usurios, ou seja, seus arquivos e
subdiretrios so localizadas sob o diretrio /home.
o superusurio ou usurio root o administrador do sistema.
os usurios de sistema no so pessoas com login e senha, mas
usurios cadastrados pelo prprio sistema para permitir a execuo
de alguns servios, como servidor de pginas web e de impresso,
entre outros. Os usurios de sistema por que os aplicativos necessitam
de permisses de leitura, escrita e execuo em arquivos e diretrios
e tais permisses s podem ser atribudas a usurios. Uma possvel
soluo seria dar ao usurio que executa a aplicao as permisses
necessrias, porm isso seria uma falha de segurana.
Pode-se administrar usurios e grupos em Ubuntu com o aplicativo usersadmin, cuja janela principal exibida na Figura 7. Pode-se ver a relao
de usurios comuns, e as opes de configurao. possvel alterar o
nome do usurio, o tipo de conta (o Ubuntu disponibiliza trs tipos de
conta para usurios comuns: Personalizado, em que sero definidas as
operaes que o usurio pode realizar; Administrador, que pode realizar
todas as tarefas de superusurio; e Usurio de rea de trabalho, que seria
o equivalente conta de Convidado em alguns sistemas).
Nas opes avanadas, cuja janela apresentada na Figura 8, possvel
editar informaes de contato, privilgios do usurio no sistema,
caminho do diretrio pessoal, grupo do qual ele far parte, e identificador
numrico do usurio.

27

28

Prof. Srgio Nery Simes


Figura 7: Aplicativo grfico para a administrao usurios e grupos no Ubuntu

Fonte:
Figura 8: Configuraes avanadas do usurio - aba Avanado.

Fonte:

Para a criao de usurios e grupos em modo texto, podem ser usados os


comandos useradd e groupadd ou adduser e addgroup, respectivamente.
O comando adduser pode variar de distribuio para distribuio,
conforme a explicao a seguir. Em alguns sistemas (Fedora e RedHat,
por exemplo), o comando adduser um link simblico para o comando

Sistemas Operacionais II

useradd. Em outros, o comando adduser um script escrito em Perl que


usa o comando useradd (Debian e Ubuntu, por exemplo). As mesmas
observaes tambm valem para o comando addgroup.
Atividades
1. Digite os comandos abaixo e informe o resultado.
a. ls /boot
b. ls /dev
c. ls /etc
d. ls /home
e. ls /media
f. ls /proc
g. ls /root
h. ls /tmp
i. ls /usr
j. ls /var
k. Houve algum diretrio cujo contedo no foi exibido? Se
sim, o que voc acha que foi a causa?
2. Qual o diretrio, em sistemas Windows, de funes similares
ao /usr?
3. Qual o diretrio, em sistemas Windows, de funes similares
ao /home?
Para obter mais informaes, consulte:
Mazioli, Gleydson. Guia Foca Linux. (www.guiafoca.org). 2007.
Neves, Julio Cezar. Programao Shell Linux. 6.ed. Brasport,
2006.
GNU Bash Reference Manual (http://www.network-theory.co.uk/
docs/bashref/)
Dicas, notcias e tutoriais sobre Linux (http://br-linux.org/)
Comunidade Linux no Brasil (http://www.vivaolinux.com.br/)
Apostilas gratuitas e documentao sobre o Linux (http://www.
dicas-l.com.br/)

29

30

Prof. Srgio Nery Simes

Prezado(a) aluno(a),
Chegamos ao final do segundo captulo. Nele foi possvel conhecer os
diretrios do GNU/Linux e suas funes. Espero que esteja gostando!
No prximo captulo, veremos alguns comandos bsicos para
manipulao de arquivos e diretrios.
Bom estudo!

___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________

Comandos Bsicos do GNU/


Linux

Prezado(a) aluno(a),
Aps aprender um pouco sobre a estrutura bsica de diretrios no
GNU/Linux e descobrir que o diretrio pessoal do usurio comum
(onde os arquivos so armazenados) fica em /home/<usuario>,
aprenderemos alguns comandos de modo texto que tornaro a
experincia com o GNU/Linux mais tranquila.
Bom estudo!
O uso adequado de comandos de modo texto importante em qualquer
Sistema Operacional, pois, mesmo aqueles que apostaram fortemente
na interface grfica, mantiveram o terminal para a emisso de comandos
locais ou remotos. Isso ocorre, pois os comandos textuais do mais
flexibilidade e so mais poderosos que a interface grfica e, algumas
vezes, podem ser executados mais rapidamente, pois no exigem
processamento grfico nem memria para armazenar e exibir janelas.
Em sistemas GNU/Linux, o conhecimento dos principais comandos
garante que o usurio poder executar tarefas administrativas em qualquer
distribuio, desde que tenha prerrogativas para isso. bom lembrar que
as aplicaes grficas so, na verdade, interfaces para a edio de arquivos
de configurao e execuo de alguns comandos textuais.
Para usar a linha de comando, basta abrir um terminal, que um sinal de
prontido (prompt) ser exibido, conforme indicado abaixo:
aluno@casa:~$_
O sinal de prontido do Bash possui informaes teis de localizao
para o usurio graas ao seu formato estendido. O exemplo acima indica
que o login do usurio aluno e que ele emite comandos no terminal
da mquina casa, mas o formato geral prompt exibido abaixo:
login do usurio@nome da mquina:diretrio corrente$
ou
login do usurio@nome da mquina:diretrio corrente#

32

Prof. Srgio Nery Simes

Comparando o exemplo do prompt e o formato, no lugar de diretrio


corrente, l-se o caracter ~. Isso ocorre, pois h vrios caracteres
especiais com significado em sistemas GNU/Linux e alguns podem ser
vistos no Quadro 4.
Quadro 4: Interpretao dos caracteres especiais em sistemas GNU/Linux.

Smbolo

Significado

Diretrio home do usurio.

No prompt, indica usurio comum.

No prompt, indica usurio


administrador.

Fonte:

Ao digitar o comando e pressionar <enter>, o Shell, executar o que foi


digitado. O Shell um interpretador de comandos, ou seja, um programa
especial que analisa se o comando e os parmetros foram inseridos
corretamente e o executa atravs de chamadas de sistema. Dentre os
vrios tipos de shells, o Bash (Bourne-Again Shell) bastante utilizado em
ambientes GNU/Linux, mas o usurio pode configurar ou instalar qualquer
outro de acordo com sua preferncia, como por exemplo: Bourne Shell (sh),
Korn Shell (ksh) e o C Shell (csh). Sistemas MS-Windows tambm possuem
o seu prprio shell: so eles o cmd e o power shell.
Apesar do formato do prompt do bash ser bastante detalhado, a partir
de agora, em nossos exemplos, usaremos apenas o formato simplificado
com o smbolo $, que no dever ser digitado.

3.1 Formato Geral dos Comandos


Na interface textual, os comandos so uma forma de dar ordens ao
kernel para que ele execute alguma ao e, geralmente, apresentam-se
sob o seguinte formato:
comando [opes] <parametro1> <parametro2> ...

Os colchetes ([ e ]) representam que as opes podem estar presentes


ou no na digitao de um comando e os sinais de menor e maior (<
e >) indicam que os parmetros devem ser digitados na linha de
comando, e normalmente so obrigatrios.
Existem dois tipos de comandos: os internos e os externos. Os
comandos internos so aqueles que se localizam dentro do
interpretador de comandos. Eles so carregados na memria

Sistemas Operacionais II

RAM junto com o Shell e no criam novo processo quando so


executados.
J os comandos externos so aqueles que se localizam no disco
e sero executados a partir de qualquer diretrio, desde que sua
localizao esteja definida pela varivel de ambiente PATH.
Esta separao ocorre por questes de desempenho e por que
alguns comandos precisam de acesso direto ao Kernel.
Quando voc executa um comando, o interpretador verifica
primeiro se ele um comando interno e, caso no seja, verifica
nos caminhos descritos na varivel PATH. Exemplos de comandos
internos so: cd, pwd, exit, echo, bg, fg, source, help.
Para saber se determinado comando interno ou externo, use o
comando type <comando>, por exemplo, type echo ou type ls.
O primeiro exibir uma mensagem do tipo echo um comando
interno e o segundo exibir uma mensagem do tipo ls: /bin/bash.

O GNU/Linux case sensitive, ou seja, faz distino entre maisculas e minsculas, por isso tenha ateno ao digitar os comandos
no terminal, pois, via de regra, so escritos com letras minsculas.
H uma grande quantidade de comandos GNU/Linux que so
instalados por padro, porm, vamos tratar dos mais importantes para
a administrao bsica do sistema. Para maiores informaes, a internet
uma boa fonte de pesquisas.

3.2 Comandos de ajuda


A diversidade de comandos e parmetros em sistemas GNU/Linux
enorme, e dificilmente um usurio, mesmo experiente, conhece todos.
Para resolver este problema, os desenvolvedores criaram sistemas de
ajuda bastante eficientes que podem ser acessados pelos comandos que
sero listados nesta seo.
Comando help
Se o usurio precisar de ajuda, basta digitar help. Este sistema de ajuda
resume as informaes sobre o comando e seus principais parmetros,
porm no est disponvel para todos os comandos.
Sintaxe

help comando

Exemplo

$help echo

33

34

Prof. Srgio Nery Simes

Comando man (manual)


uma interface para o manual de referncia dos comandos. Alguns destes
manuais fazem parte da instalao padro do sistema, porm h outros
que podem ser baixados dos repositrios. Os manuais possuem algumas
sees como NOME, SINOPSE, CONFIGURAO, DESCRIO,
OPES, VALOR DE RETORNO, CDIGOS DE ERRO, AMBIENTE,
ARQUIVOS, VERSO, EXEMPLO, AUTOR, entre outras,
Sintaxe

man pgina

Exemplo

$ man ls

Comando info
O comando info semelhante ao man, porm traz informaes mais
detalhadas sobre cada comando.
Sintaxe

info pgina

Exemplo

$info ls

3.3 Comandos de Manipulao de


Arquivos e Diretrios
Nesta seo, veremos alguns comandos de manipulao de arquivos e
diretrios com alguns parmetros bsicos:
Comando ls (list)
O comando ls lista os arquivos e diretrios do caminho atual do usurio.
Sintaxe
Exemplo

ls [opes] [arquivo]
$ls -la

A opo [arquivo], quando digitada, retorna o nome do arquivo, caso ele


exista, ou uma mensagem de erro, caso contrrio. As demais opes so:
Opo

Descrio

-l

Lista os arquivos e diretrios no formato longo, exibindo


suas permisses, o dono e o grupo do arquivo/diretrio, seu
tamanho, data de alterao, etc.

-h

Combinada com a opo l, lista os tamanhos dos arquivos em


KBytes, Mbytes ou GBytes.

-a

Exibe todos os arquivos, inclusive os ocultos. Obs: No GNU/


Linux os arquivos ocultos comeam com . (ponto) e no so
listados, a menos que esta opo seja utilizada.

-d

Lista os nomes dos diretrios, em vez de seu contedo.

35

Sistemas Operacionais II

Ao exibir a lista longa de arquivos e diretrios com comando ls -l em seu


diretrio/home, o usurio aluno verificou a sada, conforme o Quadro 5.
Quadro 5: Exemplo de sada do comando ls -l.

0
1
2

-rw-r--r--

aluno grpaluno

532

2012-03-02
10:57

livros.txt

drw-r--r--

jose

4096

2010-01-02
23:26

apostilas

-rwxr--r--

aluno grpestudante 506

2012-03-02
10:57

script1

grpaluno

Fonte:

Para fins didticos, as linhas e colunas da sada foram e a anlise ser


iniciada da direita para a esquerda.
A coluna 6 a mais direta de todas pois exibe o nome do arquivo. A
coluna 5 exibe data e a hora da ltima modificao. A coluna 4 exibe o
tamanho do arquivo em bytes. Note que apostilas um diretrio, mas
seu apontamento do sistema de arquivos custar 4 kbytes.
Um arquivo ou diretrio pertence a um usurio e a um grupo de usurios.
Por padro, quando o arquivo criado, ele pertencer ao usurio que o criou
e ao grupo ao qual ele pertence, porm a personalidade que pode alterar
permisses apenas o usurio proprietrio. A coluna 2 exibe o proprietrio
e a coluna 3, o grupo. Se o objeto que estiver sendo exibido pelo comando ls
-l for um diretrio, a coluna 1 exibe a quantidade de subdiretrios e arquivos
existentes no diretrio, mas se for um arquivo, ser sempre exibido 1.
A coluna 0 representa as permisses dos arquivos, na qual r a
permisso de leitura (read); w, a permisso de escrita (write); e x, a
permisso de execuo (execute). Cada grupo de trs permisses
aplicado, respectivamente, ao proprietrio do arquivo (user), ao grupo
ao qual o arquivo pertence (group) e aos demais usurios (other).
Como exemplo, o arquivo da linha 0, o arquivo livros.txt pode ser
lido e escrito pelo usurio aluno e apenas lido pelos usurios do grupo
grpalunos e pelos demais usurios do sistema. Na linha 2, o arquivo
script1 pode ser lido, escrito e executado pelo usurio aluno, porm
apenas lido pelos demais usurios.
Se em todas as linhas o primeiro caracter da permisso um -, na
linha 1, ele identifica o tipo de arquivo de acordo com o Quadro 6.

36

Prof. Srgio Nery Simes


Quadro 6: Caracteres indicativos de tipo de arquivo

Caracter

Significado

Arquivo regular

Diretrio

Link

Dispositivo de bloco

Dispositivo orientado a caracter

Canal, pipe

Socket

Fonte:

Comando chmod (change mode)


Altera as permisses de uso de um arquivo ou diretrio.
Sintaxe
Exemplo1
Exemplo2

chmod [opes] <modo> <arquivo>


$chmod u-x script1
$chmod 722 script1

Como j foi estudado, arquivos e diretrios GNU/Linux possuem


permisses de acesso que determinam quem pode l-los, escrev-los ou
execut-los, porm no estudamos como alterar estas permisses.
Cada arquivo ou diretrio, quando criado, possui permisses padro
definidas pelo comando umask, porm, pode ser necessrio alterar as
permisses por questes de segurana. H, pelo menos, duas formas de
expressar o modo, conforme os exemplos acima.
Primeira forma: cada modo (leitura, escrita e execuo) representado
por um bit. Por exemplo: se o arquivo pode ser executado, o bit 1; se
no puder, 0. Dessa forma, podem-se representar os trs conjuntos
como um nmero binrio. Voltemos ao Quadro 5; as permisses do
arquivo da linha 0, no sistema binrio, sero expressas como 110 100
100, e no sistema decimal, podem ser expressas como 622. Caso fosse
necessrio alterar as permisses de um arquivo chamado prova1 para
que fiquem idnticas quelas do arquivo livros.txt, o comando seria:
chmod 622 prova1

Segunda forma: sabemos que h permisses para usurios, grupos e


demais e cada um destes possui um caracter correspondente (u-usurios,
g-grupos, o-outros, a-demais). Suponha que se quer alterar a permisso
do arquivo prova1 para que todos os usurios do grupo possam escrever
nele. O comando seria:
chmod g+w prova1

Sistemas Operacionais II

Por outro lado, suponha que no se deseja mais que o arquivo script1
possa ser executado pelo usurio. O comando seria:
chmod u-x script1

E todas as demais combinaes possveis entre os grupos de permisses


e as permisses propriamente ditas.
Comando mkdir (make directory)
O comando mkdir cria um novo diretrio. Sua sintaxe, listada abaixo,
permite que se crie um diretrio, ou vrios ao mesmo tempo, como
mostrado nos exemplos 1 e 3, respectivamente.
Sintaxe
Exemplo
1

Exemplo
2

$mkdir <dir1> [<dir2> <dir3> ...]


$ mkdir so2
$ ls -l
total 0
drwxr-xr-x 2 aluno grpaluno 48 2009-03-05
00:30 so2
$ mkdir so2 lp ed
$ ls -l
total 0
drwxr-xr-x 2 aluno grpaluno 48 2009-03-05
00:30 so2
drwxr-xr-x 2 aluno grpaluno 48 2009-03-05
00:30 lp
drwxr-xr-x 2 aluno grpaluno 48 2009-03-05
00:30 ed

Comando pwd (print work directory)


O comando pwd exibe o diretrio corrente de trabalho. Observe o
exemplo abaixo:
Sintaxe

pwd [opes]

Exemplo

$pwd

A opo -L a padro e exibe o caminho lgico, ou seja, o nome


completo do diretrio corrente, mesmo que ele seja apenas um atalho
para um outro local.
A opo -P exibe o caminho fsico, ou seja, o nome completo da
localizao fsica do diretrio corrente, mesmo que ele seja um atalho.
Por exemplo: suponha que estamos no diretrio /home/aluno/docs, mas,
na verdade, este um atalho para o diretrio /home/aluno/Documentos.

37

38

Prof. Srgio Nery Simes

Os comandos pwd ou pwd -L retornaro /home/aluno/docs, enquanto o


comando pwd -P retornar /home/alunos/Documentos.
Comando cd (change directory)
O comando cd serve para mudar de diretrio. Para utiliz-lo,
simplesmente digite cd seguido do diretrio que voc deseja, conforme
a sintaxe abaixo:
Sintaxe

cd [dir]

Exemplo

$cd /home/aluno/Download

Observe a sequncia de comandos abaixo e acompanhe a mudana de


diretrios:
aluno@ifes:~/teste$ pwd
/home/aluno/teste
aluno@ifes:~/teste$ cd /tmp
aluno@ifes:/tmp$ pwd
/tmp
aluno@ifes:/tmp$

O comando pwd da primeira linha exibe a localizao atual do usurio


e o comando cd /tmp muda esta localizao. Agora suponha que se
deseja voltar ao diretrio /home/aluno/teste. Para isso, basta digitar
cd /home/aluno/teste, porm h uma forma mais simples de faz-lo.
Observe:
aluno@ifes:/tmp$ cd ~/teste/
aluno@ifes:~/teste$ pwd
/home/aluno/teste

Note que, no lugar de digitar o caminho completo do diretrio home


(/home/aluno), foi digitado apenas ~ (til), com o mesmo efeito. Se o
desejo for retornar ao diretrio imediatamente anterior, tambm h um
atalho.
aluno@ifes:/tmp$ cd /home/aluno/teste
aluno@ifes:~/teste$ pwd
/home/aluno/teste

Ao digitar cd -, ou simplesmente cd, retorna-se ao diretrio anterior


de forma bastante rpida. Outro diretrio interessante representado
por .. (tambm chamado de upper directory ou diretrio pai do
diretrio corrente) por meio do qual voc sobe um nvel na rvore de
diretrios, independente de onde esteja. Em outras palavras, se voc
digitar, por exemplo, cd .. ir para o diretrio pai do diretrio atual.

Sistemas Operacionais II

aluno@ifes:~/teste$ pwd
/home/aluno/teste
aluno@ifes:~/teste$ cd ..
aluno@ifes:~$ pwd
/home/aluno

Tambm possvel usar formas combinadas, por exemplo cd ../..,


para subir mais de um nvel na rvore de diretrios com apenas um
comando. Alm destes, existe o diretrio . (ponto), que representa o
diretrio corrente, e que bastante utilizado para simplificar a digitao
em comandos de cpia ou execuo de programas. O Quadro 7 resume
os diretrios especiais.
Quadro 7 - Diretrios especiais

Diretrio

Descrio

Representa o diretrio home do usurio

Representa o diretrio corrente (atual).

..

Representa o diretrio pai do corrente (upper directory).

Representa o diretrio anterior.

Fonte:

Comando rmdir (remove directory)


O comando rmdir serve para remover um diretrio. Para que este seja
removido, necessrio que esteja vazio e que voc possua permisso de
gravao. A sintaxe desse comando :
Sintaxe

Exemplo

rmdir dir1 [dir2 dir3 dir4 ...]


aluno@ifes:~/aula_so2$ ls -l
total 0
drwxr-xr-x 2 aluno aluno 48 2009-03-05
00:30 trab1
drwxr-xr-x 2 aluno aluno 48 2009-03-05
00:30 trab2
drwxr-xr-x 2 aluno aluno 48 2009-03-05
02:20 trab3
aluno@ifes:~/aula_so2$ rmdir trab1
aluno@ifes:~/aula_so2$ ls -l
total 0
drwxr-xr-x 2 aluno aluno 48 2009-03-05
00:30 trab2
drwxr-xr-x 2 aluno aluno 48 2009-03-05
02:20 trab3
aluno@ifes:~/aula_so2$ rmdir trab2 trab3
aluno@ifes:~/aula_so2$ ls -l
total 0

39

40

Prof. Srgio Nery Simes

em que dir representa o nome do diretrio a ser removido. Voc pode


remover um ou vrios diretrios em um nico comando.
Nesse exemplo, o primeiro rmdir remove um nico diretrio vazio
(trab1) e o segundo remove dois ao mesmo tempo (trab2 e trab3).
Comando cat (concatenate)
O comando cat utilizado para exibir o contedo de um arquivo texto
ou binrio. A sintaxe desse comando :
Sintaxe

Exemplo

cat [opes] [arquivo1]...


$ cat livro1.txt
Ttulo: Arquitetura de Sistemas
Operacionais
Autor: Francis Berenger Machado & Luiz
Paulo Maia
Edio: 4
- Ano Publicao: 2007
- Editora: LTC

O contedo do arquivo apresentado na tela por meio do comando


cat. Voc pode exibir o contedo de vrios arquivos sequencialmente
por meio de um nico comando cat. Por exemplo: o comando abaixo:
aluno@ifes:~/teste$ cat livro2.txt livro3.txt
Ttulo: Fundamentos de Sistemas Operacionais
Autor: Abraham Silberschatz & Peter Baer Galvin &
Greg Gagne
Edio: 6
- Ano Publicao: 2004
- Editora: LTC
Ttulo: Sistemas Operacionais Modernos
Autor: Andrew S. Tanenbaum
Edio: 2
- Ano Publicao: 2007
- Editora: Pearson Brasil

exibe o contedo do arquivo livro2.txt seguido do contedo do


arquivo livro3.txt.
Um dado curioso deste comando que, se voc quiser exibir o contedo
de um determinado arquivo de trs para frente, ou seja, do fim para o
comeo, ao invs de cat voc usaria tac.

Sistemas Operacionais II

Comando cp (copy)
O comando cp serve para copiar arquivos e/ou diretrios. Sua sintaxe :
Sintaxe
Exemplo

cp [opes] origem destino


$cp so1/trabalho.c so2

em que origem deve ser substitudo pelo nome do arquivo de origem a


ser copiado, e destino, pelo nome do arquivo de destino. Se for utilizada
a opo -R, possvel copiar diretrios recursivamente. A opo -a
copia o contedo completo de um diretrio para o outro, incluindo os
arquivos ocultos. Alm disso, possvel utilizar caracteres curinga para
especificar vrios arquivos de origem a serem copiados.
No exemplo dado, o arquivo trabalho.c, dentro do diretrio so1
copiado para o diretrio so2.
Comando mv (move)
O comando mv serve para mover diretrios ou arquivos de um diretrio
de origem a um diretrio de destino. Tambm serve para renomear
arquivos/diretrios, caso os diretrios de origem e destino sejam os
mesmos. Sua sintaxe semelhante do comando cp:
Sintaxe
Exemplo 1
Exemplo 2

mv [opes] origem destino


$mv arq.txt arq1.txt
$mv /tmp/abc.txt ~/

Nesse caso, o arquivo com o nome origem deixa de se chamar assim


e passa a se chamar destino. Em outras palavras, o arquivo de origem
deixa de existir aps a execuo do comando mv. Outra observao
importante que, para mover diretrios, no necessria a opo -R
, voc tambm pode utilizar curingas para mover vrios arquivos ao
mesmo tempo.
O exemplo 1 muda o nome do arquivo arq.txt para arq1.txt. J o
exemplo 2, move o arquivo abc.doc do diretrio /tmp para o seu
diretrio home.
Como vimos, o comando mv serve para mover ou renomear arquivos ou
diretrios. Agora, vejamos um comando para apagar arquivos ou diretrios.
Comando rm (remove)
Este comando serve para apagar arquivos; mas, se for usado com a opo
-r, tambm pode apagar diretrios e subdiretrios. Sua sintaxe :
Sintaxe

rm [opes] arq1...

41

42

Prof. Srgio Nery Simes

em que arq1 o nome do arquivo a ser apagado. Se quiser apagar mais de


um arquivo ao mesmo tempo, basta ir digitando sequencialmente os nomes
dos demais arquivos a serem apagados. Alm disso, tambm possvel
utilizar curingas para referenciar vrios arquivos ao mesmo tempo.
As opes mais comuns para o comando rm so:
Opo
-i
-r
-f

Descrio
Solicita confirmao antes de remover o arquivo.
Remove diretrios e seus contedos recursivamente.
Ignora arquivos no existentes e nunca pede confirmao

Tome muito cuidado antes de apagar um arquivo para evitar apaglo acidentalmente, pois este comando no envia o arquivo para uma
lixeira, em vez disso ele simplesmente o apaga.
Como vimos anteriormente, a opo -r serve para apagar diretrios, e
ela os apaga mesmo que esses no estejam vazios. Lembre-se de que o
comando rmdir, visto anteriormente, apagava apenas diretrios vazios.
Assim, uma forma de apagar um diretrio (vazio ou no) chamado dir1
seria:
rm -r dir1

No entanto, em alguns sistemas a opo de confirmao -i habilitada


por padro sem necessidade de voc digit-la. Caso tenha certeza de
que est apagando o diretrio correto, voc pode utilizar o seguinte
comando para apagar um diretrio sem pedido de confirmao:
rm -rf dir1
E esse comando apagar o diretrio dir1 e todos os subdiretrios e
arquivos dentro dele.
Assim, tome muito cuidado com esse comando e s o execute
caso tenha certeza de que o diretrio que est apagando o
diretrio correto.
Comando touch
Este comando usado para criar rapidamente arquivos vazios ou
para alterar a data/hora de modificao de arquivos pr-existentes.
Sua sintaxe :
Sinxate
Exemplo

touch arq1 [arq2 arq3 arqn]


$touch abc def 123

Sistemas Operacionais II

Em que arq1 o nome do arquivo vazio a ser criado. Voc pode criar
vrios arquivos ao mesmo tempo. Para isso, basta digitar seus nomes em
sequncia.
O comando do exemplo 1 poder criar os arquivos, desde que eles no
existam, ou atualizar suas datas de modificao, mantendo inalterados
os contedos originais. Este comando mais utilizado na criao de
Shell Scripts.
Observao importante: em sistemas GNU/Linux possvel ter arquivos
cujo nome comea por nmero, desde a sua criao.
Voc pode utilizar esse comando para criar vrios arquivos vazios e
testar os comandos de manipulao de arquivos neles. Experimente
criar um diretrio e popul-lo com o comando touch para, em seguida,
utilizar os comandos de copiar, mover e remover arquivos e diretrios.
Outra observao importante: em ambientes UNIX, para um
arquivo ser oculto deve comear com . (ponto). Experimente
criar alguns arquivos ocultos (por exemplo: .abc, .arq1 e .oculto)
e tente list-los com o comando ls l e com o comando ls la.
Observe a diferena.

3.3.1 Referenciando vrios arquivos por intermdio de


curingas
Os curingas (tambm chamados de referncia global) servem para
especificar um ou mais arquivos ou diretrios do sistema de uma s vez.
Esse um recurso que permite a filtragem do que ser listado, copiado,
apagado, etc. Existem quatro tipos de curingas no GNU/Linux, mas a
tabela abaixo apresenta apenas os dois utilizados mais frequentemente:
Curinga

Descrio

Representa qualquer caracter em qualquer quantidade de vezes


(zero ou mais vezes).

Representa qualquer caracter exatamente uma nica vez.

Vejamos alguns exemplos:


Comando

Descrio

cp teste1/* teste2/

Copia todos os arquivos do diretrio teste1


para o diretrio teste2

cp /tmp/so*.txt .

Copia os arquivos que comeam com as


letras so e terminam com .txt do diretrio
/tmp para o diretrio corrente (.):

43

44

Prof. Srgio Nery Simes

Comando

Descrio

cp /dir2/???? ../

Copia os arquivos cujo nome tenha 4


caracteres quaisquer do diretrio dir2 para
o pai do diretrio corrente

cp A??? ~/

Copia os arquivos cujo nome tenha 4


caracteres e comece com A do diretrio
corrente para o diretrio home. Neste caso,
usamos apenas trs interrogaes, pois o A
j conta como um caracter.

cp ../a??*z

Copia, do diretrio pai do diretrio corrente


para o diretrio corrente, os arquivos que
comecem com a letra a, terminem com
z e tenham dois ou mais caracteres entre
elas. No exemplo, a expresso ?? pode ser
substituda por, no mnimo, dois caracteres
e o * pode ser substitudo por nenhum
caracter ou por mais caracteres.

Comando grep (Get Regular Expression)


O comando grep pode ser usado para buscar uma sequncia de caracteres
dentro de um arquivo ou da entrada padro. Sua sintaxe :
grep expressao arquivo [opcoes]

em que expressao a sequncia de caracteres ou a expresso regular


procurada; arquivo o arquivo ou o conjunto de arquivos definidos
por curingas em que a expresso ser procurada.
Por exemplo: suponha que voc tenha dez arquivos-texto dentro de um
diretrio e que gostaria de saber em quais deles aparece a palavra IFES.
Com o comando grep, voc pode descobrir em quais arquivos esto essa
palavra e, de quebra, em qual ou quais linhas dos arquivos encontrados
ela aparece. Por exemplo:
grep IFES *.txt

Esse comando realiza uma busca pela palavra IFES em todos os arquivos
txt do diretrio corrente. Caso queira que o comando informe
tambm em que linha est a ocorrncia, digite a opo -n ao final da
linha. Se a expresso possui vrias palavras com espao entre elas, voc
dever digitar a expresso inteira entre aspas, para evitar que somente
a primeira palavra seja entendida como expresso e as demais como
nomes de arquivos.
grep Instituto Federal do Esprito Santo *.txt -n

Sistemas Operacionais II

Outro exemplo: suponha que voc queira saber quais as linhas de um


conjunto de programas em C que possuem a palavra scanf , e deseja,
tambm, que seja exibido o nmero das linhas e que a palavra procurada
aparea em cores:
grep scanf *.c -n --color

O grep tambm aceita expresses regulares, que permitem referenciar


textos de formas mais sofisticadas. No entanto, ensinar expresses
regulares foge do escopo deste material.
Comando sort
Outro comando interessante o comando sort, que permite ordenar
as linhas de um determinado arquivo texto ou da entrada padro. Sua
sintaxe :
sort [opcoes] [arquivo]

em que opcoes so as opes de ordenao e arquivo o arquivo a


ser ordenado. As opes mais comuns so:
Opo
-r

Descrio
Inverte o resultado da ordenao (decrescente).

-n

Ordena os nmeros de forma numrica e no alfabtica


que o padro.

-c

Verifica se o arquivo est ordenado.

Comando head
O comando head exibe o incio as primeiras linhas de um arquivo
ou da entrada padro. Tambm possvel especificar qual a quantidade
de linhas a ser exibida.
Sintaxe
Exemplo

head [opcoes] [arquivo]


$head -n 20 abc

Geralmente, a opo utilizada a -n, a qual indica quantas linhas do


arquivo devero ser exibidas.
No exemplo, sero exibidas apenas as 20 primeiras linhas do arquivo
abc. Caso a opo -n no seja especificada, sero exibidas 10 linhas,
que o nmero padro.
Comando tail
O comando tail anlogo ao comando head, porm exibe o final
as ltimas linhas de um arquivo ou da entrada padro. possvel
especificar qual a quantidade de linhas a ser exibida.

45

46

Prof. Srgio Nery Simes


Sintaxe
Exemplo 1
Exemplo 2

tail [opcoes] [arquivo]


$tail -n 30 logs.txt
$tail -n +20 arq.txt

Geralmente, a opo utilizada a -n, que indica quantas linhas do


final do arquivo devero ser exibidas, conforme pode ser visto nos dois
exemplos. Caso a opo -n no seja especificada, sero exibidas 10
linhas, que o nmero padro.
No exemplo 1, sero exibidas apenas as 30 ltimas linhas do arquivo
logs.txt. possvel tambm usar o comando tail para saltar (no exibir)
as n-1 primeiras linhas, basta preceder o nmero com um sinal de +
(mais), conforme o exemplo 2 que informa ao comando para exibir o
arquivo a partir da linha 20, saltando as 19 primeiras.
Comandos more e less
Algumas vezes, a sada de um comando ou programa muito longa
e rpida, e s possvel l-la se conseguirmos fazer pausas na sada
exibindo uma pgina por vez. Isso chamado de paginao. Os
comandos utilizados para fazerem paginao so os comandos more
e less. Por exemplo: suponha que voc quisesse ver o contedo do
comando a seguir:
ls -l /etc

Provavelmente, voc no conseguiria ler devido ao grande volume de


informaes exibido na tela a uma velocidade bastante alta. Para paginar
a sada do comando anterior, voc deve redirecion-la para a entrada do
comando more, da seguinte forma:
ls -l /etc | more

Digite os dois e compare os resultados. Neste ltimo comando, a |


(barra vertical) serve para fazer um pipes entre programas, ou seja,
redirecionar a sada de um programa para a entrada de outro. Esse
programa pausa a sada do ls at que voc pressione a barra de espao
(que salta uma pgina) ou enter (que salta uma linha). O nico limitador
desse comando que ele no permite voltar a tela. Mas, para isso, existe
um outro comando: less. O less anlogo ao more, s que, alm de exibir
de forma paginada, permite tambm voltar as pginas por meio da tecla
<page-up>. Experimente digitar:
ls -l /etc | less

E compare a diferena ao avanar e retroceder nas pginas. Para sair a


qualquer momento do comando less, digite q.

Sistemas Operacionais II

3.4 Comandos para gerenciamento de


processos
Dentre as atividades rotineiras de um administrador de sistema GNU/
Linux est o controle e o gerenciamento de processos, por isso o sistema
dispe de comandos de terminal que permitem, dentre outras coisas:
verificar os processos ativos;
descobrir informaes como PID, utilizao do processador, memria,
arquivos utilizados, usurio que executa o processo, swap, etc;
enviar sinais aos processos a fim de interromp-los ou at mesmo
abortar sua execuo caso tenha permisso pra isso.
As prximas sees tratam dos comandos mais usados para estas tarefas.
Comando ps
O comando ps exibe informaes sobre o estado corrente dos processos.
Ele pode ser utilizado para descobrir o nmero de identidade de um
processo (PID - Process IDentity), a taxa de utilizao da CPU naquele
instante pelo processo, a quantidade de memria utilizada, qual usurio
executa o processo, a hora em que o processo foi iniciado e vrias outras
informaes.
Sintaxe
Exemplo

ps [opcoes]
$ ps x

O comando ps exibe informaes sobre o estado dos processos no


momento em que executado. Em outras palavras, trata-se de uma
informao instantnea, como se fosse uma foto do estado dos
processos em um momento especfico, inclusive do prprio processo
ps. Aps a listagem, o estado dos processos continuar mudando. As
opes mais comuns do comando ps so:
Opo
a
x

Descrio
Exibe os processos criados por usurios do sistema.
Mostra processos que no so controlados pelo terminal.

Exibe o nome de usurio que iniciou o processo e hora em


que o processo foi iniciado.

Mostra a memria ocupada por cada processo em


execuo.

Para obter mais informaes sobre o comando ps, digite man ps.

47

48

Prof. Srgio Nery Simes

Comando top
Este comando mostra os processos ativos ou parados, taxa de utilizao
da CPU, quantidade de memria, tempo de CPU, e detalhes sobre o uso
da memria RAM, swap, disponibilidade para execuo de programas
no sistema, etc.
Os processos so ordenados pelo comando top dos mais pesados
para os mais leves, ou seja, quanto maior a utilizao de CPU
e de memria, maior a chance do processo ser exibido entre os
primeiros. Para execut-lo, basta digitar top.
Ao contrrio do ps que mostra apenas um retrato dos processos em
execuo, o programa top fica continuamente em execuo, exibindo os
processos que esto sendo executados em seu computador e os recursos
utilizados por eles. Se quiser atualizar imediatamente a tela, pressione
a barra de espao. Para obter ajuda, pressione h. Para sair do top,
pressione a tecla q.
Como se pode observar na Figura 9, h um total de 116 processos (tasks)
no sistema, e desses, 2 esto em execuo (running), 114 dormindo
(sleeping), nenhum parado e nenhum processo no estado zumbi.
Observa-se tambm que 46,2% da CPU est ocupado por processos de
usurio (us user) e 8,6% ocupada pelo sistema (sy system). O top
tambm apresenta a quantidade de memria total (514332KB), usada
(468296KB) e livre (46036KB), bem como a quantidade de memria
utilizada para buffers e swap. Neste exemplo, o processo com maior
ocupao o firefox, com 29.3% de utilizao da CPU e 21.3% de
ocupao da memria, seu PID 6315, sua prioridade 20 e o login do
usurio dono do processo sergio. Existem outras informaes que
no destaquei aqui, mas as mais importantes so essas.

Sistemas Operacionais II
Figura 9: Utilizando o comando top para visualizar os processos.

Fonte:

3.4.1 Manipulando processos com teclas de atalho


Em seu computador h vrios processos sendo executados, alguns deles
so visveis ao usurio como a interface grfica e os gerenciadores de
login, outros so criados pelo usurio como os editores de texto e os
navegadores, e ainda h aqueles que so executados pelo sistema como
os servios do SO. O terminal tambm um processo, porm, conforme
j dissemos, especial porque, atravs dele, pode-se administrar outros
processos. Vamos a um exemplo prtico:
1. abra o terminal, digite gedit e tecle <enter> no prompt de comando.
Possivelmente voc ver o editor de textos que usamos para editar
nossos programas em primeiro plano;
2. volte ao terminal e veja que o prompt do terminal no est mais
disponvel para a execuo de comandos. Isso ocorre por que o
terminal monotarefa, ou seja, executa uma tarefa por vez;
3. voc pode querer (1) escrever alguma coisa imediatamente no editor
(2) finalizar o gedit ou (3) emitir algum comando no terminal, porm
no se pode fazer a tarefa (3) pois o terminal est travado. Para isso
o GNU/Linux fornece algumas teclas de atalho para tornar o seu
terminal multi-tarefa e so elas:
<CTRL>+<c>: finaliza a tarefa.

49

50

Prof. Srgio Nery Simes

<CTRL>+<z>: interrompe momentaneamente a execuo. Ao


digitar esta combinao de teclas. o sistema escreve a mensagem
Parado no terminal. Se voc tentar escrever o gedit, ver
que ele quem agora est travado. Para destrav-lo digite o
comando bg. Caso queira travar novamente o gedit, digite fg.

Note que as teclas de atalho devem ser emitidas com o foco de execuo
no terminal, ou seja, o terminal deve estar completamente visvel para
voc. claro que as instrues dadas aqui servem para qualquer processo
e o editor grfico foi utilizado apenas para fins didticos.
Observe que o processo permanece na memria no ponto em que
parou quando foi interrompido. Voc pode usar outros comandos
ou rodar outros programas enquanto o programa atual est
interrompido.
3.4.2 Enviando sinais com o comando kill
O comando kill, apesar do nome, serve para enviar sinais para
processos. E, dentre esses sinais, existem alguns para finalizar a execuo
de processos.
Sintaxe
Exemplo

kill [opes] [sinal] [pid]


$kill -9 2345

em que pid o nmero de identificao do processo obtido a partir


dos comandos ps ou top, sinal o sinal a ser enviado ao processo e
opes so as opes desejadas. No exemplo, o comando kill envia um
sinal -9 para o processo 2345.
Para saber os sinais podem ser enviados a um processo, digite o comando
kill seguido da opo -l e ser exibida uma relao conforme o Quadro 8.
Quadro 8: Relao de sinais que podem ser enviados com comando kill. (Parte 1)

$ kill -l
1)SIGHUP
5)SIGTRAP
9)SIGKILL
13)SIGPIPE
17)SIGCHLD

2)SIGINT
6)SIGABRT
10)SIGUSR1
14)SIGALRM
18)SIGCONT

3)SIGQUIT
7)SIGBUS
11)SIGSEGV
15)SIGTERM
19)SIGSTOP

4)SIGILL
8)SIGFPE
12)SIGUSR2
16)SIGSTKFLT
20)SIGTSTP

25)SIGXFSZ
29)SIGIO
35)SIGRTMIN+1
39)SIGRTMIN+5

26)SIGVTALRM
30)SIGPWR
36)SIGRTMIN+2
40)SIGRTMIN+6

27)SIGPROF
31)SIGSYS
37)SIGRTMIN+3
41)SIGRTMIN+7

28)SIGWINCH
34)SIGRTMIN
38)SIGRTMIN+4
42)SIGRTMIN+8

21)SIGTTIN

43)SIGRTMIN+9

22)SIGTTOU

44)SIGRTMIN+10

23)SIGURG

45)SIGRTMIN+11

24)SIGXCPU

46)SIGRTMIN+12

51

Sistemas Operacionais II
Quadro 8: Relao de sinais que podem ser enviados com comando kill. (Parte 2)
47)SIGRTMIN+13
51)SIGRTMAX-13
55)SIGRTMAX-9

48)SIGRTMIN+14
52)SIGRTMAX-12
56)SIGRTMAX-8

63)SIGRTMAX-1

64)SIGRTMAX

59)SIGRTMAX-5

60)SIGRTMAX-4

49)SIGRTMIN+15
53)SIGRTMAX-11
57)SIGRTMAX-7
61)SIGRTMAX-3

50)SIGRTMAX-14
54)SIGRTMAX-10
58)SIGRTMAX-6
62)SIGRTMAX-2

Fonte:

O sinal 2 (SIGINT), por exemplo, o sinal enviado pelo Sistema


Operacional aps voc pressionar <CTRL>+<c> para abortar o processo,
lembra?! J o sinal 11 (SIGSEGV) enviado pelo Sistema Operacional
quando ocorre uma falha de segmentao. Outro exemplo de envio de
sinal ocorre aps pressionar <CTRL>+<z>, pois o sistema enviar o sinal
19 (SIGSTOP) ao processo, que far com que ele pare momentaneamente,
podendo voltar execuo por meio dos comandos fg ou bg.
Mas voc tambm pode enviar um sinal manualmente, para isso deve
colocar um - (trao) antes do nmero do sinal (exemplo -9, -15, etc). Na
maioria das vezes, voc necessitar utilizar sinais para finalizar um processo,
mas pode enviar qualquer um exibido pelo comando kill -l.
Os sinais mais comuns que podem ser enviados a um processo
para finaliz-lo so os sinais -15 (SIGTERM) e o -9 (SIGKILL).
O primeiro (sinal -15 ou SIGTERM), permite que o processo
encerre seus arquivos antes de ser finalizado. Seria uma forma
educada de encerrar (ou matar) um processo. O outro sinal (-9
ou SIGKILL) j no to educado assim, pois ele finaliza um
processo imediatamente, sem dar-lhes chances de salvar seus dados.
Normalmente, este sinal usado apenas para matar processos que
esto travados, o que no ir comprometer nenhum dado.
Na prtica, voc pode programar a rotina de tratamento de todos os
sinais, exceto o sinal -9 ou SIGKILL, que fora o encerramento do
processo. Procure tomar cuidado antes de finalizar processos para evitar
finalizar algum especial e perder dados importantes. Caso isto acontea,
talvez seja necessrio reiniciar a mquina.
Agora, vamos fazer alguns testes com o comando kill para matar processos.
Para fazer este teste, vamos abrir dois terminais. Aps abrir um terminal
normalmente, abra outro pressionando <CTRL>+<SHIFT>+<n> ou de
outra forma que preferir. Agora que voc tem dois terminais abertos, v
ao primeiro terminal e digite o comando:
$ cat

52

Prof. Srgio Nery Simes

Digite somente isso, e o comando ficar aguardando a entrada de dados


do teclado. Agora, v ao segundo terminal e digite apenas o comando
ps u que est em negrito e voc ter uma sada semelhante que segue:
$ ps u
USER

PID

%CPU %MEM

VSZ

RSS

TTY

STAT

START

TIME

COMMAND

aluno

16785

0.0

4704

1980

pts/1

Ss

23:21

0:00

bash

0.3

aluno

16808

0.0

0.3

4716

1996

pts/0

Ss

23:22

0:00

bash

aluno

16899

0.0

0.1

300

596

pts/1

S+

23:29

0:00

cat

aluno

16903

0.0

0.1

2744

1008

pts/0

R+

23:29

0:00

ps u

Este comando informa que tenho dois terminais bash abertos (em
pts/0 e pts/1, que so cdigos que identificam a que terminal o processo
pertence) e um processo cat cujo PID de 16899, no meu caso,
mas que, em seu computador, provavelmente ter cdigos diferentes.
Vamos matar este processo com o cdigo -15 ou SIGTERM. Ainda
no segundo terminal, digite o comando a seguir e observe (obviamente,
troque o PID 16899 pelo PID do processo cat apresentado em seu
computador):
$ kill -15

16899

Nada parece acontecer, pois no segundo terminal no aparece nenhuma


mensagem. No entanto, observe agora o que aconteceu com o primeiro
terminal e ver algo parecido com o que segue:
$ cat
Finalizado

O processo originado pelo comando cat no primeiro terminal foi


finalizado a partir do segundo por meio do envio de um sinal (-15
ou SIGTERM) pelo kill. Experimente agora finalizar um dos programas
bash algum terminal aberto de seu computador. Qual a linha de
comando que voc digitou?
Curiosidade: alm do comando kill, h um outro comando chamado
killall, que serve para finalizar processos pelo nome em vez de usar
o PID.
Assim, se voc tiver vrios processos que foram iniciados pelo comando
programa1, por exemplo, bastaria digitar o comando
killall programa1

para matar todos os processos com o nome programa1.

Sistemas Operacionais II

Comandos nice e renice


Os comandos nice e renice so usados para criar processos com uma
determinada prioridade e para alterar a prioridade de execuo de
algum processo, respectivamente. Inicialmente, importante esclarecer
que cada processo criado automaticamente com uma prioridade para
sua alocao em memria e CPU e o padro 0, em uma escala que vai
de -20 (mais prioritrio) a 20 (menos prioritrio). Para ver a prioridade
dos processos atualmente em execuo no seu computador, abra o
terminal e digite:
$ top

Verifique a coluna NI e saia do contexto do comando, digitando a tecla


q. Com o comando:
$ nice -<n> <comando>

cria o processo descrito pelo <comando> com a prioridade <n> e o


comando
$ renice -n <numero> <pid>

altera a prioridade de execuo do processo indicado em <pid>.

3.5 Outros comandos


Comando echo
Este comando exibe (ecoa) uma linha de texto na sada padro.
Sada padro o dispositivo para o qual sero encaminhados os
resultados de todos os comandos de modo texto e, geralmente, o
monitor de vdeo. referenciada pelo descritor de arquivos stdout.

Sintaxe

echo string

Exemplo

echo meu primeiro teste

Comando printenv
Este comando imprime o valor das variveis de ambiente do sistema.
Variveis de ambiente definem uma srie de parmetros necessrios
ao bom funcionamento de um Sistema Operacional. Por exemplo,
podemos citar as variveis:
1. SHELL que define o nome do software interpretador de comandos
padro para o usurio.

53

54

Prof. Srgio Nery Simes

2. USERNAME que define o login do usurio atualmente logado no


sistema.
3. PWD que define o caminho do diretrio home do usurio atual.
4. PATH que define o caminho de pesquisa para binrios executveis.
Para listar todas as variveis e seus respectivos contedos em seu prprio
sistema, digite no terminal
Sintaxe

printenv

Comando expr
Avalia expresses aritmticas.
Sintaxe

expr expresso

Exemplo

expr 1 + 2

O exemplo acima retorna a soma de dois nmeros.


As expresses aritmticas podem ser:
Arg1 + arg2

Retorna a soma dos dois argumentos.

Arg1 - arg2

Retorna a subtrao entre os dois argumentos.

Arg1 \* arg2

Retorna a multiplicao dos dois argumentos. O operador \*


necessrio pois o * um coringa.

Arg1 / arg2

Retorna a diviso entre os dois argumentos

Arg1 % arg2

Retorna o resto da diviso inteira entre os dois argumentos.

Comando time
Executa comandos e resume o uso de recursos do sistema. Muito usado
para medir o tempo de execuo de um programa.
Sintaxe

time [comando]

Exemplo

time ls

A sada simples deste comando apresenta-se conforme abaixo:


real 0m0.004s
user 0m0.000s
sys 0m0.004s
Onde: real o tempo entre a emisso do comando no terminal e a
finalizao da execuo; user o tempo que a CPU usa para processar
a execuo. No exemplo acima, este tempo to pequeno que foi listado
como 0; sys o tempo usado pelo kernel para carregar os comandos,
ler os operadores, execut-los e gerar a sada.

Sistemas Operacionais II

3.6 Instalao de pacotes em modo


texto em sistemas Debian-like
No primeiro captulo, tratamos da instalao de pacotes em modo
grfico, mas agora que conhecemos um pouco mais sobre o terminal,
veremos que tambm possvel fazer instalaes em modo texto. Esta
seo traz um exemplo de download da chave pblica de autenticao,
edio da lista de repositrios e instalao usando o aplicativo apt-get.
Abra o terminal e digite:
$wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub |
sudo apt-key add Este comando far o download da chave pblica para autenticao no
repositrio.
Abra o arquivo /etc/apt/sources.list, insira as seguintes linhas ao final do
arquivo e salve. Para abrir o arquivo em questo voc pode usar qualquer
editor de texto do seu sistema, por exemplo gedit, nano ou vi. Lembre-se
que para editar este arquivo ser necessrio possuir a senha de superusurio
#repositrio google
deb http://dl.google.com/linux/deb/ stable main
Volte ao terminal e digite:
$sudo apt-get update
$sudo apt-get install google-chrome-stable
Com estes procedimentos seu sistema, ligado internet, autentica-se
no repositrio da Google chamado dl.google.com, acessa os diretrios
/linux/deb/main/stable/ e faz o download e a instalao do programa
desejado. Ao pressionar <enter> em ambos os casos, ser exigida sua
senha de superusurio. Note que, ao digit-la, no haver eco na tela, ou
seja, voc no ver caracteres sendo mostrados, mas no se preocupe e
digite a senha da mesma forma.
Algumas vezes pode ser importante descobrir a qual pacote pertence
determinado arquivo, especialmente quando se est tentando resolver
alguma dependncia. Para isso existe o comando apt-file. Como este
comando no nativo, instale-o com a seguinte linha:
$ apt-get install apt-file

55

56

Prof. Srgio Nery Simes

Antes de us-lo pela primeira vez ser preciso criar uma base de dados
com o comando
$ apt-file update
Ento, pode-se pesquisar em qual pacote determinado arquivo est
inserido com o comando
$ apt-file search <arquivo>
Mesmo que este comando retorne mais de um pacote, a lista j ajuda
bastante na instalao das dependncias.

3.7 Compartilhando diretrios entre


sistemas Linux
Nesta seo, trataremos do compartilhamento de diretrios entre
sistemas GNU/Linux. Para isso importante saber que ambas as
mquinas envolvidas usaro um sistema de arquivo especial chamado
NFS (Network File System). Em outras palavras, compartilharemos
arquivos apenas entre mquinas GNU/Linux, j que o compartilhamento
entre sistemas mistos mais complexo e depende de conhecimentos que
fogem ao escopo deste material. Para isso ser necessrio recordar que
o compartilhamento de arquivos , tipicamente, um servio de rede
baseado na arquitetura cliente-servidor, ou seja, preciso configurar um
servidor NFS e um cliente NFS. A instalao dos respectivos daemons
ser feita usando o comando de modo texto apt-get e deve ser feita com
credenciais de administrador.
3.7.1 Na mquina servidora
O primeiro passo instalar o servidor nfs e para isso digite o comando:
#sudo apt-get install nfs-kernel-server
depois, edite o arquivo de configurao /etc/exports com o editor de sua
preferncia e inclua as linhas
/home/aluno/Publico 192.168.10.10(rw)
/home/aluno/Documentos meu_note(ro)
/home/aluno/Vdeos 192.168.10.0/255.255.255.0(ro)

Sistemas Operacionais II

A primeira linha significa que o diretrio /home/aluno/Publico ser


compartilhado apenas com a mquina cujo IPv4 192.168.10.10 com
prerrogativas de leitura(r) e escrita(w).
A segunda linha significa que o diretrio /home/aluno/Documentos
ser compartilhado apenas com a mquina cujo nome meu_note, porm
para isso preciso um servio DNS em sua rede, com prerrogativas de
somente leitura (ro).
A terceira linha significa que o diretrio /home/aluno/Vdeos ser
compartilhado para todas as mquinas da rede caracterizada pelo
conjunto IP/mscara 192.168.10.0/255.255.255.0, com prerrogativas de
somente leitura(ro).
As linhas acima so exemplos e devero ser alteradas para a adequao
sua realidade.
Para verificar os diretrios compartilhados na sua mquina, digite o
comando:
#sudo exportfs
Caso nenhum diretrio compartilhado seja exibido reinicie o servio
com o comando
#sudo /etc/init.d/nfs-kernel-server restart
3.7.2 Na mquina cliente
Instale o daemon cliente nfs com o comando:
$ sudo apt-get install nfs-common
Acesse o diretrio /mnt e crie o subdiretrio que ser a raiz do
compartilhamento (isso dever ser feito apenas uma vez)
$ mkdir publico
Assim, o caminho completo do diretrio pblico seria /mnt/publico.
Agora, supondo que o IPv4 do servidor seja 192.168.10.1, monte o
compartilhamento com o comando
$ mount -t nfs 192.168.10.1:/home/aluno/Publico /mnt/publico
Acesse o diretrio /mnt/publico que os arquivos e diretrios

57

58

Prof. Srgio Nery Simes

compartilhados estaro l. Caso voc tenha alguma dificuldade de


acesso, verifique se as permisses para o diretrio da mquina servidora
esto feitos corretamente.
Se voc estiver compartilhando uma pasta entre uma mquina real e
uma mquina virtual, instalada no Oracle VirtualBox, o comando de
montagem ser:
$ mount -t vboxsf dir1 /dir2
Onde dir1 o nome dado ao diretrio nas preferncias do Vbox e dir2
o nome do diretrio criado no sistema GNU/Linux.
Atividades
1. Compare a sada da execuo de dois comandos: ls -l /bin/cp
e ls -lh /bin/cp e informe qual a diferena observada por voc.
2. Abra um terminal e, com ele recm-carregado, execute os
comandos para os itens abaixo:
a . descubra o diretrio atual;
b . crie um diretrio chamado aula3;
c . entre neste diretrio recm-criado;
d . confirme que est nesse diretrio, usando o comando que
descobre o diretrio atual para cada nome/sobrenomes seu, e
crie um diretrio diferente com um nico comando. No meu
caso, meu nome Srgio Nery Simes e criarei trs diretrios:
sergio, nery e simoes, tudo minsculo e sem acentos; faa o
mesmo com o seu nome;
e . apague os diretrios equivalentes ao seu nome do meio para que
fiquem apenas dois diretrios; em meu caso, apagarei o diretrio
nery;
f . agora, entre no diretrio correspondente ao seu primeiro nome;
g . confirme se est no diretrio esperado;
h . dentro desse diretrio, crie onze arquivos: a, b, c, ab, ac, bc,
abc, acb, bac, cab, abcd;
i . com os arquivos criados, liste apenas os arquivos com um nico
caracter no nome;
j . liste somente os arquivos cujos nomes possui 3 caracteres;
k . liste apenas os arquivos cujos nomes comeam com a;
l . liste somente os arquivos cujos nomes comeam com a e
terminam com c;

Sistemas Operacionais II

m . usando o item anterior, liste apenas os arquivos cujo nome


possui 3 ou mais caracteres e que comecem com a;
n . agora, copie todos os arquivos para o diretrio equivalente ao
seu sobrenome;
o . sem sair do diretrio atual, liste o diretrio equivalente ao seu
sobrenome e confirme que os arquivos esto l;
p . agora, crie dois arquivos ocultos: .oculto1 e .arq2
q . liste o contedo do diretrio normalmente e veja se os arquivos
apareceram ou no;
r . descubra qual a opo necessria para listar arquivos ocultos e
liste novamente o diretrio;
s . agora, suba um nvel na rvore de diretrios;
t . exiba o diretrio atual;
u . remova o diretrio equivalente ao seu sobrenome;
v . liste o diretrio atual.
2. Digite o comando ps em suas formas variadas conforme os
exemplos a seguir e compare as sadas apresentadas (Lembrese de que para sair do comando less basta digitar q. No ltimo
exemplo, no esquea de trocar o nome aluno pelo seu login.)
Exemplos:
a . ps
b . ps a
c . ps x | less
d . ps ax | less
e . ps aux | less
f . ps aux | grep aluno
Por ltimo, voc pode tambm visualizar a rvore de processos e
suas interdependncias por meio do comando pstree. Execute
esse comando e comente sua sada (para mais informaes sobre
esse comando, digite man pstree).
3. Fornea as informaes sobre os processos Xorg e gnomepanel apresentados na Figura 9.
4. Execute o comando top em sua mquina e d informaes
sobre o processo mais pesado de seu sistema.
5. Com o comando top em execuo, pressione a tecla h (help) e
descubra qual tecla apertar para:

59

60

Prof. Srgio Nery Simes

a . alterar o intervalo de atualizao;


b . matar um processo (kill);
c . exibir apenas processos de um usurio especfico.
Para obter mais informaes, consulte:
Mazioli, Gleydson. Guia Foca Linux. (www.guiafoca.org). 2007.
Neves, Julio Cezar. Programao Shell Linux. 6.ed. Brasport,
2006.
GNU Bash Reference Manual (http://www.network-theory.co.uk/
docs/bashref/)
Dicas, notcias e tutoriais sobre Linux (http://br-linux.org/)
Comunidade Linux no Brasil (http://www.vivaolinux.com.br/)
Apostilas gratuitas e documentao sobre o Linux (http://www.
dicas-l.com.br/)
Prezado(a) aluno(a),
Ao fim deste captulo, tenho certeza de que voc j estar se sentindo
mais vontade no GNU/Linux, agora que j viu vrios comandos
teis para tratar arquivos e diretrios. Faa as atividades finais
com bastante ateno e procure sempre consultar as referncias
indicadas.
No prximo captulo, veremos sobre edio e compilao de
programas com o GNU/Linux e a linguagem C.
Bom estudo!

___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________

Configurao de
interfaces de rede e
clientes DNS
Prezado(a) aluno(a),
As operaes realizadas at agora foram, predominantemente, locais,
ou seja, fora de uma rede de dados, mas a maioria das atividades
que so feitas com computadores necessitam do compartilhamento
de informaes. Agora que conhecemos a estrutura padro de
diretrios e alguns comandos importantes, precisamos estudar como
se configuram as principais funes de uma rede. Para isso, usaremos
o contedo acumulado e, certamente, o GNU/Linux ser menos
misterioso para voc daqui para frente.
Bom estudo!
As distribuies GNU/Linux costumam ser instaladas j com o acesso
completo rede, porm, quando surge algum problema de conexo,
fundamental saber quais so os principais arquivos que devem ser
checados, quais so as principais configuraes e como testar se as
alteraes surtiram efeito.
Para isso, discutiremos ao longo do captulo alguns conceitos sobre
redes de computadores pertinentes a sistemas GNU/Linux, porm no
objetivo defini-los detalhadamente.
Como as configuraes de rede podem alterar o comportamento do
computador, necessrio possuir credenciais de administrador para
editar a maioria dos arquivos e emitir a maioria dos comandos.

4.1 Configurao de interfaces de rede


As interfaces de rede em sistemas GNU/Linux so criadas por aplicativos
ou pelo kernel durante o processo de boot com base nos dispositivos
fsicos. Seus nomes seguem um padro, herdado dos protocolos que as
definem, acrescidos de um ordinal, sendo a ltima exceo a interface
de loopback local, tambm conhecida como interface de auto retorno,
como pode-se ver nos exemplos do Quadro 9.

62

Prof. Srgio Nery Simes


Quadro 9 - Interfaces de rede GNU/Linux

Interface

Nome

Auto retorno

lo

Ethernet

eth0, eth1, eth2...

Wi-fi

wlan0, wlan1, wlan2..,

Token ring

tr0, tr1, tr2...

ppp

ppp0, ppp1, ppp2...

Fonte:

Interface de rede um elemento fsico ou lgico que permite que


computadores troquem dados entre si. Interfaces fsicas tambm so
conhecidas como placas de rede ou NICs (network interface cards).
Como a interface de autorretorno, cujo endereo IPv4 mais comum
127.0.0.1, usada para testes de configurao e de softwares de rede, no
se recomenda alterar suas configuraes.
Se sua mquina possuir uma placa de rede cabeada, ela ir chamar-se
eth0; caso tenha duas, elas iro chamar-se eth0 e eth1. Se sua mquina
possuir uma interface de rede sem fio, ela ir chamar-se wlan0; caso
tenha duas, elas iro chamar-se wlan0 e wlan1 e assim sucessivamente,
sendo que esta regra vale para todas as demais interfaces.
No arquivo /etc/udev/rules.d/XYZ-persistent-net.rules, onde XYZ um
nmero, possvel encontrar e editar a associao do nome com o MAC
das placas ethX. Neste arquivo, ser possvel ler alguma coisa como:
SUBSYSTEM==net, ACTION==add, DRIVERS==?*, ATTR{add
ress}==00:e0:91:46:fd:3c, ATTR{dev_id}==0x0, ATTR{type}==1,
KERNEL==eth*, NAME=eth0
Onde ATTR{address} o endereo MAC e NAME o nome associado.
As configuraes atuais da sua rede podem ser verificadas com o
comando ifconfig.
Sintaxe

ifconfig [interface]
ifconfig interface [opes | endereos]

Digitando apenas ifconfig no terminal, possvel ver quais interfaces a


mquina possui e quais as configuraes de endereo MAC da interface
(Endereo de HW), endereo IPv4 (inet end.), endereo de broadcast da
rede (Bcast), mscara da rede (Masc.) e de tamanho mximo do quadro
que pode ser transmitido, em bytes(MTU), entre outras informaes
estatsticas, conforme o exemplo do Quadro 10.

63

Sistemas Operacionais II
Quadro 10 - Exemplo de retorno do comando ifconfig.

eth0

Link encap:Ethernet Endereo de HW 00:e0:91:46:fd:3c


UP BROADCAST MULTICAST MTU:1500 Mtrica:1
pacotes RX:0 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:0 erros:0 descartados:0 excesso:0 portadora:0
colises:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
IRQ:27 Endereo de E/S:0x4000

lo

Link encap:Loopback Local


inet end.: 127.0.0.1 Masc:255.0.0.0
endereo inet6: ::1/128 Escopo:Mquina
UP LOOPBACK RUNNING MTU:16436 Mtrica:1
pacotes RX:855 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:855 erros:0 descartados:0 excesso:0 portadora:0
colises:0 txqueuelen:0
RX bytes:67145 (67.1 KB) TX bytes:67145 (67.1 KB)

wlan0

Link encap:Ethernet Endereo de HW 00:17:c4:da:96:18


inet end.: 10.0.0.101 Bcast:10.0.0.255 Masc:255.255.255.0
endereo inet6: fe80::217:c4ff:feda:9618/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Mtrica:1
pacotes RX:1825219 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:828029 erros:0 descartados:0 excesso:0 portadora:0
colises:0 txqueuelen:1000
RX bytes:1505999454 (1.5 GB) TX bytes:186218091 (186.2 MB)
IRQ:16

Fonte:

Ainda no exemplo do Quadro 10, nota-se que a mquina possui trs


interfaces: eth0, lo e wlan0, sendo que a interface eth0 no possui
endereo IPv4, portanto no est configurada para acessar a rede; e a
interface wlan0 possui o endereo IPv4 10.0.0.101, portanto conclui-se
que esta mquina est acessando a rede pela interface wi-fi.
Tambm se pode ativar ou desativar uma interface usando tambm o
comando ifconfig, conforme os exemplos:
Quadro 11 - Exemplos de utilizao do comando ifconfig

Comando

Ao

ifconfig eth0 192.168.10.10


netmask 255.255.255.0 up

Carrega os drivers e configura a interface


eth0 com os parmetros fornecidos.

ifconfig wlan0 down

Derruba a interface, fazendo com que


ela deixe de aparecer na lista.

ifup <interface>

Sobe a interface com as configuraes


feita em um arquivo texto.

ifdown <interface>

Atalho para ifconfig <interface> down

Fonte:

64

Prof. Srgio Nery Simes

Os comandos mostrados no Quadro 11 so apenas exemplos, portanto


devero ser alterados de acordo com a necessidade do usurio. Note
que, para alterar os parmetros da interface, preciso ser superusurio.
4.1.1 Editando o arquivo interfaces
Pode-se configurar as interfaces de rede de uma forma mais perene
editando o arquivo /etc/network/interfaces. Para listar o contedo
atual do arquivo, use o comando:
cat /etc/network/interfaces
Como todo arquivo de configurao GNU/Linux, preciso respeitar
alguns formatos e palavras chave especficas antes de edit-lo, portanto
fique atento para no editar erradamente este arquivo e prejudicar seu
acesso internet.

O caracter # indica comentrio de uma linha.

A expresso auto <interface> significa que os drivers da interface


sero carregados durante a inicializao do sistema.

A expresso allow-hotplug <interface> significa que os drivers da


interface sero carregados quando o cabo for conectado ou quando
o sistema detectar sinal wi-fi.

A expresso iface <interface> inet [loopback| static| dhcp] define se


a interface <interface> de autorretorno, de configurao esttica
ou se recebe configuraes IP atravs de um servidor DHCP. Esta
uma das expresses mais importantes deste arquivo.

Caso a interface seja configurada estaticamente (iface <interface> inet


static), deve-se informar o endereo, e a mscara, conforme o exemplo
abaixo:
Quadro 12 - Exemplo do arquivo de configurao esttica das interfaces de rede.
# Este um exemplo do arquivo /etc/network/interfaces
# que foi escrito exclusivamente para a disciplina de SORII
auto lo
iface lo inet loopback
#As configuraes de network, broadcast e mscara so opcionais.
auto eth0
iface eth0 inet static

address 192.168.0.102

network 192.168.0.0

netmask 255.255.255.0

broadcast 192.168.0.255
Fonte:

Sistemas Operacionais II

Para que as novas configuraes tenham efeito, deve-se executar o script


networking para reiniciar as interfaces ou os comandos ifdown e ifup.
/etc/init.d/networking restart

4.2 Configurao do cliente DNS


Alm de configurar as interfaces de rede do seu sistema, o servio
DNS tambm importante para que voc no precise decorar os IPs
dos servios que voc deseja acessar. Para esclarecer, podem ser citados
os servios www, ftp, ssh, mail e servios de compartilhamento de
diretrios da rede local.
DNS Domain Name System o servio de rede que traduz
nomes alfanumricos, por exemplo, www.ifes.edu.br, em
endereos IP e vice-versa. Alm da traduo, este servio tambm
permite que vrios servidores possam responder a, pelo menos,
servio www ou ftp, por exemplo.
Embora a soluo DNS pressuponha cliente e servidor, trataremos
apenas do cliente, considerando que o administrador de rede cuidar
do servidor.
O cliente DNS em sistemas GNU/Linux configurado com a edio do
arquivo /etc/resolv.conf que possui os elementos abaixo:
domain: domnio DNS ao qual faz parte aquele host.
search: domnios DNS no quais sero pesquisados os hosts.
nameserver: endereos IP dos servidores DNS
Para ficar mais claro, vamos imaginar que o cliente DNS de uma
determinada mquina esteja configurado conforme o Quadro 13.
Suponha, ainda, dois casos de estudo: (1) o usurio deseja acessar o site
cead.ifes.edu.br e (2) o usurio deseja acessar a pasta compartilhada
no servidor de arquivos local fileServer.
Quadro 13 - Exemplo de configuraes do arquivo /etc/resolv.conf
domain ifes.edu.br
search lab.ifes.edu.br
nameserver 172.16.96.21
nameserver 172.16.96.35
Fonte:

65

66

Prof. Srgio Nery Simes

Soluo do caso 1: ao tentar acessar o site cead.ifes.edu.br, o navegador


acionar o cliente DNS, que dever consultar algum servidor DNS para
descobrir qual o IP deste site. O servidor consultado ser aquele cujo
IP 172.16.96.21, primeiro, na ordem de precedncia (ser chamado
de preferencial), que dever retornar o IP de cead.ifes.edu.br. Caso o
servidor 172.16.96.21, por qualquer motivo, no responder aps um
determinado tempo, o servidor 172.16.96.35 ser consultado.
Soluo do caso 2: ao tentar acessar o servidor de arquivos local, o SO
acionar o cliente DNS, que dever consultar algum servidor DNS para
descobrir qual o IP desde servidor, porm para isso ele precisa de um
sobrenome, ou seja, de um domnio. Em outras palavras, o cliente
DNS ir anexar ao nome do servidor de arquivos o domnio (clusula
domain) e ir procurar por fileServer.ifes.edu.br. Caso fileServer no
seja encontrado no domnio DNS ifes.edu.br, ele ser procurado com
o nome fileServer.lab.ifes.edu.br. A partir da a soluo idntica a
soluo do caso 1.
As palavras-chave domain e search so mutuamente exclusivas; portanto,
se mais de uma instncia de uma dessas palavras-chave estiver presente,
vale somente a ltima, porm search aceita mais de um domnio, desde
que separado por espaos ou tabulaes.

4.3 Testando o host na rede


Para testar as configuraes de rede do seu host, sugerimos que voc
crie duas mquinas virtuais capazes de comunicar-se entre si. Na Figura
10 h duas mquinas chamadas host1 e host2. Host1 possui duas
interfaces de rede: uma, configurada para receber endereos IP de um
servidor DHCP e a outra, configurada estaticamente com o endereo
192.168.10.1 e mscara 255.255.255.0. Host2 possui apenas uma interface
de rede configurada com o IP 192.168.10.2 e mscara 255.255.255.0.
Figura 10 - Configurao dos hosts para teste de configuraes de rede

Fonte:

Sistemas Operacionais II

Caso voc esteja usando o Oracle Virtual Box como gerenciador


de mquina virtual, configure a interface DHCP do Host1 em
modo NAT e as interfaces estticas dos Hosts1 e 2 em modo
rede interna.
No Sistema Operacional do host1, identifique o nome da interface que
recebeu IP via DHCP (para fins de exemplo, suponha que seja a eth0)
e o nome da interface que no possui nenhum endereo IP (para fins
de exemplo, suponha que seja a eth1) e edite os arquivos conforme o
Quadro 14.
Quadro 14 - Exemplo de arquivo de configurao de interfaces para o host1
#Em sua mquina poder ser necessrio trocar os nomes das interfaces
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet static
address 192.168.10.1
netmask 255.255.255.0
gateway 192.168.10.1
Fonte:

Para o host2, o arquivo fica desta forma.


Quadro 15 - Exemplo de arquivo de configurao de interfaces para o host2
#Em sua mquina poder ser necessrio trocar os nomes das interfaces
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet static
address 192.168.10.2

netmask 255.255.255.0

gateway 192.168.10.1
Fonte:

Reinicie a rede com o comando:


/etc/init.d/networking restart
Use o comando ifconfig para verificar se as configuraes foram
aplicadas a sua rede. No host1 e no Host2, digite:
ifconfig
A sada esperada ser semelhante do Quadro 10, porm com os
endereos IP que voc configurou.

67

68

Prof. Srgio Nery Simes

Comando ping
Use o comando ping para verificar se Host1 e Host2 esto se comunicando
adequadamente, mas lembre-se de que Host2 pode ser uma mquina da
sua rede local, uma mquina localizada na internet ou uma mquina
que tenha apenas o IP conhecido. Nestas trs situaes, pode-se usar
a sintaxe do comando com <nome do host>, <fully qualified domain
name fqdn> ou <IP>, respectivamente. A partir do Host1, digite:
Sintaxe

ping [IP | fqdn | nome de host]

Exemplo 1

$ping 192.168.10.2

Exemplo 2

$ping www.ifes.edu.br

Exemplo 3

$ping laptop_casa

No exemplo 1, o usurio digitou no prompt o comando seguido do IP;


no exemplo 2, o comando seguido do nome da mquina que est na
internet; e no exemplo 3, o comando seguido do nome da mquina na
rede local.
No Host1, a mensagem de sada exibida no Quadro 16 mostra que 64
bytes foram recebidos de 192.168.10.2, porm h os campos icmp_
seq, que representa a ordem na qual o icmp foi enviado; o ttl (time to
live), que representa o nmero mximo de roteadores pelo qual esta
mensagem pode passar antes de ser consumida; e time que o perodo
de tempo entre o envio e a recepo da resposta.
Quadro 16 - Retorno esperado para o comando ping emitido a partir do Host1
aluno@casa:~$ ping 192.168.10.2
PING 10.0.0.1 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=12.5 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=7.58 ms
64 bytes from 192.168.10.2: icmp_seq=3 ttl=64 time=5.89 ms
64 bytes from 192.168.10.2: icmp_seq=4 ttl=64 time=5.32 ms
Fonte:

Tanto o comando ping quanto o comando tracepath usam o protocolo


ICMP da camada de rede. No precisa de credenciais de superusurio
para ser executado.
Comando tracepath
Retorna o caminho percorrido pelos datagramas desde a origem at o
destino, listando nomes ou os IPs dos roteadores intermedirios. No
precisa de credenciais de superusurio para ser executado.
Sintaxe

tracepath <destino>

Exemplo

$tracepath www.ifes.edu.br

69

Sistemas Operacionais II

A sada do comando ser algo semelhante ao apresentado no Quadro 17.


Quadro 17 - Sada padro para o comando tracepath
1: aluno.local (10.0.0.101)

0.141ms pmtu 1500

1: 192.168.1.1 (192.168.1.1)

12.282ms pmtu 1492

1: no reply
2: 192.168.1.1 (192.168.1.1)

17.170ms

3: 200.217.72.64 (200.217.72.64)

50.764ms

4: 200.199.62.53 (200.199.62.53)

46.166ms asymm 5

5: 200.223.50.13 (200.223.50.13)

88.254ms asymm 6

6: 200223045169.host.telemar.net.br (200.223.45.169) 69.051ms asymm 8


7: gigabitethernet8-0-0-arc-rj-rotb-03.telemar.net.br
(200.223.45.78)

70.439ms

8: as1916.rj.ptt.br (200.219.138.101)

63.177ms asymm 9

9: rj-es-10g-oi.bkb.rnp.br (200.143.252.86)

78.219ms

10: lanes-mxes-10g-int.bkb.rnp.br (200.143.255.178)

6.929ms asymm 11

11: 200.137.64.3 (200.137.64.3)

83.634ms asymm 12

Fonte:

Comando dhclient
Permite que a mquina cliente pea ao servidor DHCP uma concesso
IP. A concesso IP um conjunto de atributos que sero oferecidos pelo
servidor que incluem IP e mscara de rede, endereos de servidores
DNS, gateway padro, entre outros.
Esta concesso permanecer com o cliente por um intervalo de tempo prdeterminado no servidor, chamado perodo de concesso. Este aplicativo
possui um arquivo de configurao em /etc/dhcp3/dhclient.conf.
Atividades
1. Quais so os tipos de interface que voc possui em sua mquina?
2. Descubra o(s) servidores DNS configurados no Host1 (dica:
liste o contedo do arquivo /etc/resolv.conf)
3. Altere o IP de Host2 para 172.16.96.2 e teste a conectividade
entre eles usando o comando ping. O que ocorre? Por qu?
4. Altere a configurao da interface esttica para que ela receba o
IP a partir de um DHCP. O que ocorre? Por qu?
5. O que ocorre se o servidor DNS preferencial responder
negativamente a uma consulta?
6. O que ocorre se o servidor DNS no responder a uma consulta?
7. Envie 10 mensagens ICMP atravs do comando ping a um site
qualquer e calcule o tempo mdio entre envio e recepo do

70

Prof. Srgio Nery Simes

pacote. Dica: o campo time dar a informao do intervalo de


tempo de cada mensagem.
8. Qual a diferena entre as clusulas domain e search no arquivo
de configurao do cliente DNS?
9. Trace a rota entre o seu host e o site do ifes com o comando
tracepath.
10. Qual a finalidade do comando dhclient?

___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________

Edio e Compilao de
Programas no GNU/Linux
Prezado(a) aluno(a),
Neste captulo voc aprender a editar e compilar programas em C,
que manipulem processos e threads a criar programas para configurar
rotinas de tratamento de sinais na linguagem C e a manipular
entradas e sadas de dados atravs de redirecionadores e pipes.
importante destacar que este captulo no ensina programao
bsica ou lgica de programao, e sim como utilizar as ferramentas
fornecidas pelo Sistema Operacional para editar e compilar seus
programas em C.
Assumo que voc j possui os conhecimentos necessrios de
programao da linguagem C como suas estruturas bsicas e
comandos obtidos nas disciplinas anteriores de programao.
Bom estudo!
A programao considerada por muitos mais uma arte que uma
cincia, pois exige dedicao e talento para que bons algoritmos
surjam e tornem-se programas eficientes e eficazes. Ao longo dos anos,
vrias tcnicas de programao foram desenvolvidas para aproximar
o desenvolvimento de software de uma cincia aplicvel, tambm, ao
mundo corporativo, e uma das tcnicas foi a programao distribuda.
Este captulo trata de fundamentos do tratamento de processos e threads
em C e mostra como processos podem comunicar-se por meio de pipes,
redirecionamentos e sinais. Nestes aspectos os sistemas GNU/Linux
oferecem ao programador uma vasta gama de ferramentas de edio,
compilao e debugao (ferramenta para a depurao de erros).
Antes de comearmos os trabalhos, verifique se o seu sistema possui
os pacotes gcc, libc e gedit instalados com o Gerenciador de
Pacotes Synaptic. O primeiro um compilador C bastante usado
profissionalmente e muito eficiente. O segundo a biblioteca de funes
que sero utilizadas pelos nossos programas e o terceiro o editor onde
o cdigo ser escrito.
Programadores mais experientes preferem editores em modo texto como
o vi ou emacs, e programas que automatizam a compilao como
o make, porm como este material abrange sistemas GNU/Linux no
nvel bsico, ser usado o editor gedit, por ser de utilizao mais simples.

72

Prof. Srgio Nery Simes

5.1. Edio de programas em editores


grficos
O gedit (Gnome Editor) um editor de textos em modo grfico
que usa bibliotecas da interface Gnome e, alm disso, possui recursos
interessantes como o modo de destaque (visualizao dos comandos
em cores), o espaamento automtico e a verificao de erros. Para saber
quais so as linguagens que o editor reconhece e destaca graficamente
com cores, v ao menu Ver Modo de Destaque.
Para abrir o gedit, clique em Aplicativos Acessrios Editor de
Textos gedit. Uma janela semelhante Figura 11 ser aberta.
Figura 11 - Tela inicial do Gedit

Fonte:

Para tornar a programao mais confortvel, podem-se exibir os


nmeros das linhas, destacar a linha atualmente em edio e destacar
os parnteses correspondentes clicando em Editar Preferncias. Uma
janela semelhante a Figura 12 aparecer.

Sistemas Operacionais II
Figura 12 -Configurando as preferncias do gedit - aba viso

Fonte:

Para configurar as indentaes do programa clique na aba Editor,


configure a largura das tabulaes para 4 e marque a caixa habilitar recuo
automtico. Basicamente, a indentao consiste na adio de tabulaes
(tecla <tab> do teclado) no incio de cada linha, na quantidade equivalente
ao nmero de blocos em que cada linha est contida. A insero de espaos
no recomendada, pois caso se abra o cdigo em outro editor, a largura
dos espaos pode ser influenciada pela tipografia das letras.
Indentao (ou identao ou endentao) um termo aplicado ao
cdigo fonte de um programa para indicar que os elementos que esto
hierarquicamente dispostos iniciam-se na mesma coluna de texto.
Esta formatao, atualmente, possui o papel de organizar o cdigo,
facilitando o processo de correo de erros e futuras manutenes.
Se quiser tornar a configurao do gedit ainda mais confortvel, pode
aumentar o tamanho da fonte para 12 ou 14, por exemplo, de acordo
com sua preferncia.

73

74

Prof. Srgio Nery Simes


Figura 13 - Configurando as preferncias do Gedit - indentao

Fonte:

Como voc j sabe programar em C, trataremos apenas dos aspectos


relacionados a criao de cdigo em sistemas GNU/Linux, por isso
comeamos do trivial Ol Mundo.
Abra o editor de texto gedit, digite o cdigo que aparece na Figura 14 e
salve com o nome prog1.c. Lembre-se das indentaes.
Figura 14 - Cdigo que imprime um Ol Mundo na sada padro

Fonte:

Sistemas Operacionais II

5.2. Compilao e execuo de


programas
Aps terminar a edio, abra o terminal, encaminhe-se ao diretrio onde
prog1.c est salvo e compile o programa com o seguinte comando:
$ gcc prog1.c -o prog1

Se no foi exibida nenhuma mensagem de erro, seu programa foi


compilado com sucesso e foi gerado um arquivo binrio executvel
chamado prog1. Caso tenha sido exibida alguma mensagem de erro,
faa as conferncias usuais em cdigos que apresentam erros de sintaxe
e verifique se voc possui a biblioteca libc instalada.
Para executar o programa, digite no terminal o comando:
$ ./prog1
Ol Mundo!

Se a mensagem foi exibida na tela, o programa funcionou!


O binrio executvel um arquivo no texto plano que pode
ser executado diretamente pelo Shell. Em sistemas GNU/Linux os
executveis no precisam ter extenses (.exe, .com, etc.), pois eles so
reconhecidos como executveis devido a permisso de execuo.
Note que, a menos que o programa esteja em um diretrio registrado na
varivel de ambiente PATH, ser necessrio digitar o caminho completo
do programa para que ele possa ser executado devido a questes de
segurana. A linha de execuo poderia ser /home/aluno/so2/prog1
para execut-lo, mas, como j vimos, o . (ponto) representa o diretrio
corrente economizando a digitao.
Conforme mencionado anteriormente, o compilador que utilizaremos
neste material ser o GCC (GNU C Compiler). A partir de um ou mais
cdigos fonte de entrada, o GCC pode criar um arquivo executvel, um
arquivo objeto, um arquivo de montagem ou um cdigo C pr-processado.
Para gerar um arquivo executvel necessrio que, alm da
compilao (traduo do arquivo fonte em mdulo-objeto), o GCC
realize as ligaes entre os mdulos-objeto e as bibliotecas. Em outras
palavras, o GCC pode realizar a compilao e a ligao, sendo que
esta ltima uma etapa necessria para se ter um arquivo executvel.

75

76

Prof. Srgio Nery Simes

O compilador GCC pode ser invocado a partir do comando gcc. Sua


sintaxe simplificada :
gcc [opes] fonte.c -o saida

em que fonte.c um programa escrito em C e saida o programa


executvel. Se o programador no define a sada, o executvel ser
gerado com o nome padro a.out. Alm disso, o GCC tambm possui
diversas opes, possibilitando uma variedade de formas de compilaes
diferentes. Dentre as opes mais comuns, esto:
Opo

Descrio

-o file

Coloca a sada no arquivo file. Aplica-se independentemente do


tipo de sada que est sendo produzida, que pode ser um arquivo
executvel, um arquivo objeto, um arquivo de montagem ou um
cdigo C pr-processado.

-c

Compila ou monta os arquivos fontes, mas no realiza a sua


ligao. A sada na forma de um arquivo objeto para cada arquivo
fonte. Por padro, o nome do arquivo objeto gerado o nome da
fonte, substituindo sua extenso .c, .i, .s por .o.

-Wall

Habilita todas as Warnings (avisos) sobre construes consideradas


questionveis, e que so fceis de prevenir.

Alm dessas opes, h inmeras outras, algumas de otimizao, outras


referentes compilao para outras arquiteturas, etc. Recomendo
fortemente que sempre utilize a opo -Wall.
Figura 15 - Exemplo de utilizao da diretiva Wall

Fonte:

5.2.1. Exibindo Warnings com a opo -Wall


Conforme visto anteriormente, a opo -Wall permite a visualizao
dos alertas que o compilador capaz de identificar. Para entendermos
melhor, vejamos um exemplo de programa com um erro de lgica muito

Sistemas Operacionais II

tpico de programadores C iniciantes e a importncia desta opo. Digite


o programa da Figura 15 e salve-o com o nome prog2_if.c.
Compile e execute-o. Se voc digitou tudo corretamente, o gcc dever
gerar o binrio executvel prog2_if, o que significa que no h erro
de sintaxe, porm se as mensagens exibidas forem semelhantes as
apresentadas abaixo, h um erro de lgica.
$ ./prog2_if
valor das variaveis antes do if: a=4
b=7
as variveis so iguais:
a=7
b=7

Pela lgica, o programa deveria imprimir as variveis so diferentes:


a=4 b=7, no entanto, isso no ocorre. Por qu? Pois na linha 9, o
programador provavelmente achou que estava comparando as variveis
a e b quando, na verdade, estava atribuindo o contedo de b para
a e, em seguida, testando (o operador de atribuio ==). Como o
resultado da atribuio sempre verdadeiro a instruo da linha 10
sempre executada, independentemente dos valores de a e b.
Note que no h um erro sinttico, pois a linguagem C permite essa
construo, ou seja, atribuir um valor e, em seguida, test-lo.
Agora, imagine esse tipo de erro provavelmente de digitao em um
programa com centenas de linhas de cdigo! Seria difcil de encontrar,
no mesmo?! Felizmente o GCC possui uma forma de avisar possveis
erros como esse por meio da utilizao da opo -Wall.
Vamos recompilar o programa com a opo -Wall e observar o que
acontece:
$ gcc prog2_if.c -o prog2_if -Wall
prog_if.c: In function main:
prog_if.c:9: warning: suggest parentheses around
assignment used as truth value

Com esta opo, o programa emite um aviso referente construo da


linha 9 if (a = b). Repare que mesmo assim o programa ser compilado
at o final, pois no h erro sinttico. como se o compilador lhe
dissesse: aquela construo est meio estranha, tem certeza de que
aquilo mesmo?. E, em grande maioria das vezes, tais avisos so erros.

77

78

Prof. Srgio Nery Simes

Assim, devido a este e outros equvocos que podem ocorrer


enquanto se escrevem cdigos, recomendo fortemente que se
utilize a opo -Wall ao compilar programas utilizando o gcc.

1. Como exerccio, conserte o programa reescrevendo a linha 9


com dois sinais de igual (a == b), execute-o novamente com a
opo -Wall e verifique se exibido mais algum aviso.
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
____________________________________________________

5.2.2. Controlando excees


Quando se programa, h erros de sintaxe, que so aqueles relacionados
a forma das instrues; h erros de lgica, relacionados ao algoritmo
que se deseja executar; e h erros de execuo, tambm chamados
excees. Excees so erros que ocorrem durante a execuo de
alguma instruo do programa e, quando ocorrem, devem ser tratados
pelo Sistema Operacional. Se a exceo afetar a segurana do sistema, a
execuo ser abortada, por isso so denominadas excees fatais.

Sistemas Operacionais II

Os tipos mais comuns de excees de segurana so: (i) tentativa de


acesso ilegal memria e (ii) tentativa de execuo de uma instruo
privilegiada no modo usurio. No entanto, existem excees como
falta de pgina (page fault), que no impedem o fluxo normal de
execuo do programa. Tambm existem as excees aritmticas
(diviso por zero, overflow, underflow, etc), cujo tratamento pode ser
configurado para abortar ou no o programa.
Veremos, agora, um exemplo de exceo fatal: a tentativa de
acesso ilegal memria. Digite o programa a seguir e salve-o com
o nome prog3_acessoilegal.c.

Ser possvel identificar o erro de lgica que ir gerar a exceo?


O programa declara um vetor de 10 posies e tenta acessar 1000
posies. Compile o programa com a opo -Wall e execute-o,
observando se a sada semelhante quela apresentada no Quadro 18.
Quadro 18 - Sada do programa que gera exceo fatal

$ ./prog3_acessoilegal
vetor[0] = 0
vetor[1] = 1
vetor[2] = 2
vetor[3] = 3
vetor[4] = 4
vetor[5] = 5
vetor[6] = 6
vetor[7] = 7
vetor[8] = 8
vetor[9] = 9
Falha de segmentao
Fonte: Falta fonte do Quadro 18.

Esse erro chamado de falha de segmentao (segmentation fault), pois


o processo est tentando acessar uma posio da memria fora de seu
segmento. Como a varivel vetor foi declarada com 10 posies (de 0 a
9), ao se tentar acessar a dcima primeira posio (posio 10, pois o

79

80

Prof. Srgio Nery Simes

vetor comea do zero) esse acesso estar fora do seu segmento, por isso
ser gerada a exceo.
Lembre-se de que o sistema verifica apenas se voc no est tentando
acessar uma rea de memria fora de seu segmento. Dentro de seus
segmentos, no realizada nenhuma verificao.
Em outras palavras, se voc tivesse outras variveis declaradas aps
esta, provvel que o programa sobrescrevesse essas variveis antes
de ser gerada uma exceo. Ou seja, voc responsvel por acessar
as variveis dentro de seu prprio segmento e, se estiver cometendo
erros durante o acesso, o sistema no ir inform-lo.
Agora, vejamos um outro exemplo de exceo. Digite o programa abaixo
e salve-o com o nome prog4_estouropilha.c.

Em seguida, compile e execute o programa conforme os comandos


abaixo em negrito e observe o que acontece:
$ gcc prog4_estouro.c -o prog4_estouro -Wall
$ ./prog4_estouro
Falha de segmentao

Esse programa chama a funo recursiva f() que no possui base da


recurso, ou seja, sem um critrio de parada definido. Isso faz com que a
funo seja chamada inmeras vezes at que ocorra um estouro de pilha
a pilha no tem mais espao para armazenar os endereos de retorno.
Lembre-se de que, a cada vez que uma funo chamada, os
endereos de retorno so salvos na pilha.

Assim, o programa tentar salvar os endereos fora do segmento de


pilha que pertence a ele, gerando uma falha de segmentao.

Sistemas Operacionais II

5.2.3. Programando a rotina de tratamento de sinais


Agora, vamos ver um exemplo de como capturar os sinais para trat-los.
Digite o programa abaixo e salve-o com o nome prog5_tratasinais.c.

No se esquea dos includes das bibliotecas <signal.h> e <unistd.h>


(linhas 3 e 4). A funo signal (linhas 13 a 27) recebe como primeiro
argumento o nmero do sinal a ser configurado e, como segundo, o nome
da rotina de tratamento do respectivo sinal. Dessa forma, o programa
configura o recebimento de todos os sinais de 1 a 15 para serem tratados
pelo procedimento tratasinal (que ser a nossa rotina de tratamento
e, neste exemplo, far apenas uma impresso na tela). Mas cada sinal
poderia ser configurado para ser tratado por uma rotina diferente. Neste
exemplo, a rotina de tratamento apenas imprime na tela o nmero do
sinal recebido. Aps digitado e salvo, compile-o com o comando:
$ gcc prog5_tratasinais.c -o prog5_tratasinais
-Wall

Para test-lo, execute o programa com o comando abaixo:


$ ./prog5_tratasinais

E observe que o programa no ser mais encerrado quando voc pressionar


<CTRL>+<c>. Em vez disso, o programa exibir que recebeu o sinal 2.
Agora, vamos enviar sinais para esse programa por meio do comando kill.

81

82

Prof. Srgio Nery Simes

5.3. Pipes e Redirecionamentos


Nesta seo, veremos como encaminhar a sada de um programa para
a entrada de outro usando pipes, como redirecionar um arquivo para
a entrada padro e sada padro para um arquivo usando caracteres
especiais. Tanto pipes como redirecionamentos ajudam o administrador
do sistema em suas tarefas.
5.3.1. Utilizando Pipes
Conforme visto na disciplina de Sistemas Operacionais I, pipes (canos, em
ingls) so redirecionamentos no qual a sada de um programa entendida
como a entrada para outro. No GNU/Linux, os pipes so representados por
uma | (barra vertical). Por exemplo, a linha de comando:
./prog1 | ./prog2 | ./prog3 | ... | ./progN

representa que a sada do programa prog1 est redirecionada como


entrada ao programa prog2. Este ltimo, por sua vez, tem sua sada
redirecionada ao programa prog3 e assim sucessivamente at chegar ao
programa progN. Isso indica que possvel realizar vrios pipes em uma
nica linha de comando.
Alm dos programas, os pipes tambm podem ser utilizados entre
comandos (afinal, os comandos tambm so programas, certo?!). A
partir de agora, usaremos os conceitos programas e comandos como
sinnimos. Lembra-se dos comandos more e less? Ambos podem
ser usados, assim como vrios outros, para receber contedo por
meio de um pipe.
Para exemplificar, execute a linha de comando abaixo:
ls /etc/ | grep conf | more

Nesse exemplo, utilizei 3 comandos: ls, grep e more. O primeiro lista o


contedo do diretrio /etc. Esta sada repassada ao segundo comando,
que filtra apenas as linhas que possurem o termo conf . A sada desse
segundo comando repassada ao terceiro comando, que exibe seu
contedo de forma paginada. Tudo isto possvel atravs de pipes.

Sistemas Operacionais II

5.3.2. Redirecionando a entrada de dados


O pipe permite que um comando processe a sada de outro comando;
mas, e se o que se deseja processar estiver armazenado em um arquivo?
Nesse caso, o pipe no resolve e os redirecionamentos de entrada ou
sada deveriam ser usados.
Redirecionar a entrada padro significa que, em vez de digitar as
informaes a partir do teclado, voc far o programa l-las a partir
de um arquivo.
Suponha que se est desenvolvendo um trabalho de programao,
e toda vez que vai test-lo o programa pergunta informaes sobre
nome, telefone, endereo e necessrio fornec-las manualmente?
Se voc j fez algum tipo de trabalho parecido, sabe como chato
ficar digitando informaes para teste.
Assim, voc pode deixar essas informaes salvas num arquivo e,
quando for executar o programa, basta redirecionar a entrada padro
a partir desse arquivo. O programa, em vez de esperar voc digitar as
informaes a partir do teclado, ir l-las a partir do arquivo.
No GNU/Linux, para redirecionar a entrada padro de um programa
para ser lida a partir de um arquivo basta digitar de forma semelhante
ao comando abaixo:
./programa < arquivo_entrada

em que programa o binrio executvel cuja entrada ser redirecionada,


e arquivo_entrada o nome do arquivo que fornecer as informaes
ao programa. O sinal de < (menor) faz com que o arquivo seja
redirecionado como entrada padro ao programa. Dessa forma, voc
pode realizar dezenas de testes em seus programas sem a necessidade de
ficar digitando as informaes manualmente.
Entrada padro o principal dispositivo de entrada de dados do
sistema computacional. referenciada pelo descritor de arquivos
stdin. Geralmente o teclado.
Sada de erro padro a sada na qual sero escritos os erros
provocados pelos aplicativos. referenciada pelo descritor de
arquivos stderr. Geralmente o monitor.

83

84

Prof. Srgio Nery Simes

5.3.3. Redirecionando a sada de dados


Analogamente ao redirecionamento de entrada, o redirecionamento de
sada padro serve para capturar o que seria impresso na tela e escrever
em um arquivo. Para realizar este direcionamento, basta digitar de
forma semelhante ao comando abaixo:
./programa > arquivo_saida

em que programa o binrio executvel cuja sada ser redirecionada


e arquivo_sada o nome do arquivo para o qual as informaes sero
direcionadas. O sinal de > (maior) faz com que a sada padro do
programa seja redirecionada para o arquivo. Com a sintaxe acima, o
arquivo_sada sempre ser criado e, caso j exista um arquivo com
este nome do diretrio corrente, seu contedo ser perdido, porm se
o objetivo for escrever um arquivo formado pelos valores de retorno de
vrios comandos, usa-se o smbolo >>, conforme o exemplo abaixo.
./programa >> arquivo_saida2

Se arquivo_saida2 no existir, ser criado, mas se j existir os valores


de sada do programa sero inseridos ao final.
Por fim, possvel combinar os redirecionamentos de entrada, sada e
pipes. Observe os prximos exemplos:
./programa < arquivo_entrada > arquivo_saida

Nesse caso, a entrada do programa proveniente do arquivo arquivo_


entrada e sua sada salva no arquivo arquivo_saida.
Como ltimo exemplo, vamos usar tudo ao mesmo tempo: redirecionamento
de entrada e sada e pipes. Observe a construo a seguir:
./prog1 < entrada | prog2 | prog3 > saida

Nesse exemplo, o programa prog1 tem sua entrada redirecionada a


partir do arquivo entrada e sua sada redirecionada a outro programa
(prog2) por meio de um pipe. Aps isso, o programa prog2 tem sua sada
redirecionada ao programa prog3. Este ltimo, por sua vez, redireciona
sua sada para o arquivo sada.

Sistemas Operacionais II

1. Abra um terminal e execute o programa prog5_tratasinais,


visto anteriormente. Com esse programa funcionando, abra um
novo terminal e:
descubra o PID do programa prog5_tratasinais;
em seguida, envie sinais de 1 a 15 para esse programa e observe a
sada;
descubra: houve algum sinal que no foi capturado pelo
programa??? Se sim, qual e por qu?
Altere esse programa para que ele exiba tambm o nome de
cada sinal recebido. Por exemplo: caso receba o sinal 2, dever
imprimir: Sinal recebido: 2 (SIGINT). Dica: para facilitar, utilize
a construo switch da linguagem C.
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
____________________________________________________

85

86

Prof. Srgio Nery Simes

Para obter mais informaes, consulte:


Mazioli, Gleydson. Guia Foca Linux. (www.guiafoca.org). 2007.
Neves, Julio Cezar. Programao Shell Linux. 6.ed. Brasport, 2006.
The CTDP Linux Programmers (http://www.comptechdoc.org/
os/linux/programming/)
Goldt, Sven. The Linux Programmers Guide. Version 0.4, 1995
Captulo 6 - Automatizao de tarefas administrativas

Prezado(a) aluno(a),
Chegamos ao fim do quinto captulo. Nele foi visto o processo de
construo (edio e compilao) de programas em C no GNU/
Linux. Para um bom aproveitamento, talvez tenha sido necessrio
revisar seus conhecimentos em programao, o que vai solidificar
ainda mais seu aprendizado.
No prximo captulo, estudaremos como manipular processos em
um ambiente GNU/Linux.
Bom estudo!

___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________

Automatizao de tarefas
administrativas

Sistemas GNU/Linux permitem que tarefas complexas sejam realizadas


com facilidade via terminal, por meio de dois recursos muito comuns para
administradores. So eles os scripts de Shell e o agendamento de tarefas.

6.1. Shell Scripts


Um script um cdigo, escrito em uma linguagem interpretvel pelo
Sistema Operacional, capaz de realizar tarefas que um comando sozinho
no poderia. Em sistemas GNU/Linux, esta linguagem composta pelos
comandos do Shell, por isso estes cdigos chamam-se genericamente de
Shell Scripts.
Shell Scripts podem ser usados para as mais variadas tarefas, e dentre as
mais comuns podem-se citar:
backup ou restaurao de um determinado arquivo ou diretrio;
limpeza peridica de diretrios;
formatao de algum texto para uso especfico;
tratamento da sada de algum comando.
Apesar de ser possvel escrever cdigos bastante sofisticados usando
apenas os comandos do Shell, iniciaremos com alguns exemplos simples
para o leitor ir se acostumando com os conceitos.
Abra um editor de texto de sua preferncia, digite o contedo do Quadro
19 e salve-o com o nome primeiro.bash.
Quadro 19 - Exemplo1 - script que limpa a tela e escreve uma mensagem na sada padro

1.
2.
3.
4.

#!/bin/bash
#meu primeiro shell script
clear
echo Ol mundo

Fonte: Falta fonte do Quadro 19.

Na linha 1, a expresso #!/bin/bash a assinatura que indica ao


Sistema Operacional que o arquivo um Bourne-Again Shell Script.

88

Prof. Srgio Nery Simes

Nas demais linhas, o caracter # indica o incio do comentrio que sero


ignorados pelo interpretador de comandos, conforme se pode ler na linha 2.
A linha 3 limpa a tela e a linha 4 imprime a mensagem na sada padro.
Para executar o script, escreva a linha abaixo no terminal.
./primeiro.bash

Qual foi o resultado? Provavelmente alguma mensagem de erro. Por


qu? Por que para um binrio executvel ou um script produzirem
efeito em sistemas GNU/Linux, eles devem ter permisso de execuo.
Como fazer com que o script tenha permisso de execuo? Alterando
as permisses originais com o comando chmod (CHange MODe). Sem
maiores explicaes sobre ele, digite o comando:
chmod u+x primeiro.bash

Agora tente executar novamente seu primeiro Shell Script. Conforme dito
acima, o esperado que a tela seja apagada e a mensagem seja escrita.
O script do Quadro 20 entra no diretrio /tmp (cd /tmp), procura
(find) pelos arquivos comuns (parmetro -type f) do diretrio corrente
(parmetro .), cuja ltima modificao tenha sido feita h mais de 30 dias
(parmetro -mtime +30) e os deleta (parmetro -delete). Como a deleo
irreversvel, preste ateno para no apagar contedo til do seu disco.
Quadro 20 - Exemplo 2 - Script que procura arquivos cuja ltima modificao tenha
sido a mais de 30 dias

1.
2.
3.
4.

#!/bin/bash
#segundo script
cd /tmp
find . -type f -mtime +30 -delete

Fonte: Falta fonte do Quadro 19.

Execute o script acima conforme foi feito para o Exemplo 1.


O Quadro 21 exibe um script semelhante ao do Quadro 19, porm
foi criada a varivel mensagem, com um contedo string, utilizada
posteriormente com o acrscimo do smbolo $. Note que no necessrio
definir o tipo de varivel, pois ela assumir o tipo do contedo.

Sistemas Operacionais II
Quadro 21 - Exemplo 3 - uso de variveis em Shell Scripts

#!/bin/bash
# terceiro script: Agora com o uso de variveis
mensagem=Ol Mundo!
clear
echo $mensagem
Fonte: Falta fonte do Quadro 21.

No Quadro 22, aparecem as variveis especiais $1 e $2. Estas variveis


armazenam a linha de execuo do script.
Quadro 22 - Exemplo 4 - uso de variveis especiais em Shell Script

#!/bin/bash
#quarto script: aceitando variveis como entrada
do usurio
echo Eu, $1, estudo no $2.
Fonte: Falta fonte do Quadro 22.

Ao salvar o script como quarto.bash e execut-lo, a linha de comando


dever ser:
./quarto.bash aluno cead
e o resultado ser:
Eu, aluno, estudo no cead.

A varivel $1 recebe o valor aluno e a varivel $2 recebe o valor cead,


formando a frase. Isso ocorre por que a varivel $0 recebe o nome
do script, a varivel $1, recebe o primeiro parmetro, a varivel $2,
recebe o segundo parmetro e assim sucessivamente, caso haja outros
parmetros. O Quadro 23 mostra uma lista com outras variveis especiais.
Quadro 23 - Variveis especiais
Varivel

Significado

S#

Nmero total de argumentos da linha de comando.

$*

Todos os argumentos em uma nica string.

$@

Todos os argumentos como vrias strings protegidas.

Fonte:

O Quadro 24 mostra um script que usa um operador especial e um


condicional para testar se determinado arquivo existe ou no. Se o
arquivo foi criado com sucesso ser exibida a mensagem: O arquivo
foi criado com sucesso, caso contrrio, ser exibida a mensagem: O
arquivo no foi criado.

89

90

Prof. Srgio Nery Simes

Quadro 24 - Exemplo 5 - uso do condicional IF e o de operadores especiais


1.
2.
3.
4.
5.
6.
7.
8.

#!/bin/bash
touch teste1.teste
if [ -e teste1.teste ]
then
echo O arquivo foi criado com sucesso
else
echo O arquivo no foi criado
fi

Fonte: Falta fonte do Quadro 24.

Note que a estrutura condicional (if-then-else) bastante semelhante


ao que j foi estudado em outras linguagens de programao, exceto
pelo terminador (fi), porm sua forma completa :
if <expresso lgica>
then
<bloco de comandos>
elif <expresso lgica>
then
<bloco de comandos>
else
<bloco de comandos>
fi

O Quadro 25 mostra um outro exemplo do uso do condicional if:


Quadro 25 - Exemplo 6 - uso do condicional IF e do comando expr

#!/bin/bash
# Testa o nmero de parmetros digitados pelo
usurio e efetua a soma
if [ $# -ne 2 ]
then
echo Nmero invlido de parmetros
else
echo Os parmetros digitados foram $1 e $2
echo A soma de $1 e $2 igual a`expr $1 + $2`
fi
Fonte:

Lembrando que expresso lgica a expresso que ser testada e bloco


de comandos o conjunto de instrues que sero executados de acordo
com o resultado dos testes.

Sistemas Operacionais II

Alm do operador -e, existem outros que podem ser importantes


quando se escreve um script. Vejamos a lista completa no Quadro 26.
Quadro 26 - Lista dos operadores utilizados em Shell Scripts

Operador
-eq
-ne
-gt
-lt
-o
-a
!
-d
-e
-z
-f
-r
-w
-x

Significado

Exemplo de utilizao

igual

n1 -eq n2

diferente

n1 -ne n2

maior

n1 -gt n2

menor

n1 -lt n2

ou

N1 -o n2

and

N1 -a n2

not

! n1

Se o arquivo for um diretrio

-d arquivo

Se o arquivo existir

-e arquivo

Se estiver vazio

-z arquivo

Se o arquivo comum

-f arquivo

Se o arquivo pode ser lido

-r arquivo

Se o arquivo pode ser escrito

-w arquivo

Se o arquivo pode ser


executado

-x arquivo

Fonte:

6.2. Agendamento de Tarefas


Os scripts so ferramentas que ajudam a desempenhar tarefas
importantes no dia a dia do ambiente operacional, mas, muitas
vezes, torna-se necessrio executar tarefas automaticamente com
base em alguma periodicidade. Para isso, usam-se as ferramentas de
agendamento de tarefas. Outros sistemas tambm permitem agendar
tarefas, portanto esta no uma caracterstica exclusiva do GNU/Linux,
porm h conceitos importantes que devem ser aprendidos e reforados.
O servio responsvel pelo agendamento chama-se cron e o arquivo
de configurao chama-se crontab. O cron realiza leituras peridicas
do crontab e executa as tarefas agendadas por meio de uma sintaxe
bastante simples.
H dois tipos de arquivos crontab, um para usurios comuns e outro
para usurios administradores. O primeiro localiza-se em /etc/crontab
e o segundo em /var/spool/cron/crontabs. Isso significa que tanto
administradores quanto usurios comuns podem agendar tarefas, desde
que os comandos ou scripts agendados pelo usurio comum no executem
nenhuma operao que dependa de permisses de acesso especiais.

91

92

Prof. Srgio Nery Simes

A sintaxe dos arquivos crontab a seguinte:


mm HH DD MM SS U script
interpretados segundo o Quadro 27.
Quadro 27: Sintaxe do arquivo crontab.

Letras

Definio

mm
HH
DD
MM

Minutos

Faixa de
valores
(0 a 59)

Hora

(0 a 23)

Dia do ms

(1 a 31)

Ms

(1 a 12)

SS

Dia da semana

(0 a 6, sendo 0
domingo)

Usurio que executar o comando.


Parmetro opcional.

script

Script ou comando que ser executado.

Fonte:

O Quadro mostra as tarefas script1, script2 e script3 sendo agendadas


para execuo em diferentes momentos.
Linha no crontab

Quando o script ser executado?

30 21 31 7 2
script1

no dia 31/07, tera-feira, as 21:30. Note que o script


ser executado todas as vezes que o evento 31/07,
tera-feira, 21:30 ocorrer, independentemente do
ano.

00 3,4,5 * * *
script2

as 3:00, as 4:00 e as 5:00 todos os dias da semana,


todos os meses, independentemente de qual seja o
dia do ms.

00 23 1-15 * *
script3

as 23:00 do dia 1 ao dia 15 de todos os meses,


independentemente de qual dia da semana seja.

O crontab tambm um binrio executvel que facilita a edio do


arquivo crontab e para isso as opes mais usadas so:
Opo

Funo

-e

Abre o arquivo crontab para edio. A vantagem de usar esta


opo que o arquivo crontab correto ser usado, ou seja, se voc
usar o crontab -e como superusurio o arquivo de agendamento
de todo o sistema ser aberto.

-l

Lista o contedo do arquivo de agendamentos.

-r

Remove os agendamentos.

-i

Apaga o arquivo de agendamento, mas pergunta se o usurio tem


certeza.

Sistemas Operacionais II

Observe que, ao usar o comando crontab -e pela primeira vez, serlhe- perguntado qual editor voc prefere. Preste bem ateno e escolha
apenas aquele que voc conhece.
Aps agendar a tarefa, reinicie o servio com um dos comandos abaixo;
/etc/init.d/cron restart

ou
service cron restart

Lembrando que, para estas tarefas, voc deve ser superusurio.

1. Escreva um script que realize as quatro operaes bsicas.


2. Escreva um script que imprima na sada padro data e hora
corrente, nome do usurio e diretrio atual.
3. Escreva um script que escreva as N ltimas linhas de um arquivo
de entrada em um arquivo de sada, sendo que N, arquivo de
entrada e arquivo de sada so parmetros passados para o script.
4. Faa um script que liste apenas os processos de um determinado
usurio sendo que o nome deste usurio um parmetro. Use o
comando grep.
5. Descreva a funo do cron no sistema de agendamento de
tarefas GNU/Linux.
6. Escreva a(s) linha(s) do arquivo crontab que agende a execuo
do script1 para o dia 21/01 as 13:00
7. Escreva a(s) linha(s) do arquivo crontab que agende a execuo
do script1 para o ltimo dia de cada ms.
8. Faa o agendamento do script do Quadro 20 para o prximo
fim de semana.

93

94

Prof. Srgio Nery Simes

Para obter mais informaes, consulte


Mazioli, Gleydson. Guia Foca Linux. (www.guiafoca.org). 2007.
Neves, Julio Cezar. Programao Shell Linux. 6.ed. Brasport, 2006.
The CTDP Linux Programmers (http://www.comptechdoc.org/
os/linux/programming/)
Goldt, Sven. The Linux Programmers Guide. Version 0.4, 1995

Prezado(a) aluno(a),
Chegamos ao fim do quarto captulo. Nele foi visto o processo de
construo (edio e compilao) de programas em C no GNU/
Linux. Para um bom aproveitamento, talvez tenha sido necessrio
revisar seus conhecimentos em programao, o que vai solidificar
ainda mais seu aprendizado.
No prximo captulo, estudaremos como manipular processos em
um ambiente GNU/Linux.
Bom estudo!

___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________

Manipulao de Processos
em C no GNU/Linux
Prezado(a) aluno(a),
neste captulo voc aprender como fazer programas que manipulam
processos no GNU/Linux. Comearemos por algumas revises
sobre o conceito de processos, veremos como um processo pode
descobrir seus prprios PID e GID, aprenderemos como criar um
novo processo utilizando a primitiva fork e, finalmente, teceremos
algumas consideraes relacionadas a esses conceitos. Procure fazer
todos os programas e test-los mais de uma vez e, se possvel, fazer
algumas alteraes e ver como eles se comportam.
Bom estudo!
A grande vantagem dos sistemas multiprogramveis que neles os
processos so executados concorrentemente, compartilhando, entre
outros recursos, a utilizao do processador, da memria principal
e dos dispositivos de E/S. Alm disso, em sistemas com mltiplos
processadores no s existe a concorrncia de processos pelo uso do
processador, como tambm a execuo simultnea de processos nos
diferentes processadores.
Recorde que processo um programa em execuo juntamente com
seu contexto e suas reas de dados, cdigo e pilha.

O contexto de um processo pode ser dividido em duas partes: o contexto


de hardware e o contexto de software. O contexto de hardware armazena
o contedo de todos os registradores, j o de software armazena
informaes sobre a identificao, as quotas e os privilgios do processo.
Dentre as informaes de identificao do processo, destacam-se: PID,
nome do processo, nome do usurio, grupo do processo. Conforme
vimos no captulo anterior, no GNU/Linux tais informaes podem ser
obtidas por meio dos comandos top e ps.

96

Prof. Srgio Nery Simes

Geralmente, cada processo possui suas prprias reas de dados, cdigo


e pilha, que so armazenadas em segmentos de memria. Dessa
forma, normalmente teremos os segmentos de dados, cdigo e pilha.
Como j vimos, se um processo tentar acessar uma posio de
memria fora de seus segmentos, ser gerada uma exceo de
segurana, o Sistema Operacional ser chamado e enviar um sinal
ao processo para que este seja finalizado.

Aps o carregamento do kernel para a memria, o primeiro processo


ativado em sistemas GNU/Linux chama-se init, sendo que ele possui
PID igual a 1 e finaliza as tarefas finais do boot. Com exceo deste
processo, todos os demais devem estar associados a um processo pai.
Caso o processo pai termine antes do processo filho, o filho terminar
ou poder tornar-se filho do processo init e continuar executando
depende da configurao do sistema.

7.1. Identificao de um processo


Como visto, todo processo recebe, do Sistema Operacional, um
identificador exclusivo chamado PID. Este identificador nico em
cada instante de tempo, portanto no se podem encontrar dois processos
com o mesmo PID. Alm disso, cada processo possui se pai e pertence
a um grupo de processos. Estas informaes podem ser importantes ao
administrador e ao desenvolvedor.
Alm dos comandos GNU/Linux que manipulam processos, as
linguagens de programao tambm o fazem e, em especial, a linguagem
C, possui ferramentas muito poderosas para isso.
Vejamos algumas primitivas na linguagem C que permitem descobrir o
PID do processo, o PID do pai de um processo (PPID) e o nmero que
identifica o grupo do processo (GID). As primitivas que possuem essa
informao encontram-se na biblioteca <unistd.h> e esto descritas a
seguir. Veja que o tipo de retorno das funes o tipo pid_t.
pid_t getpid()

Retorna o nmero PID do processo em execuo.

Sistemas Operacionais II

pid_t getppid()

Retorna o nmero PID do processo pai (parent pid), ou seja, do processo


que criou o processo em execuo por intermdio de outras primitivas,
como, por exemplo, fork(), system() ou exec().
pid_t getpgrp()

Retorna o ID do grupo do processo. Os grupos de processos so usados


para distribuio de sinais entre os processos relacionados. Observe
agora um programa exemplo com essas primitivas. Digite o programa a
seguir e salve-o com o nome identificacao.c.
Agora, compile o programa com o comando:
$ gcc identificacao.c -o identificacao -Wall

Em seguida, execute-o com o comando:


$ ./identificacao
Eu sou o processo de PID 20259
Meu pai tem PID 19907
Perteno ao grupo de ID 20259
Quadro 28: Programa que exibe os identificadores do processo em execuo, do
pai e do grupo.

Fonte:

O processo exibiu seu prprio PID, o PID do seu processo pai e o ID de


seu grupo. Agora, execute novamente o programa e observe o resultado:
$ ./identificacao
Eu sou o processo de PID 20304
Meu pai tem PID 19907
Perteno ao grupo de ID 20304

97

98

Prof. Srgio Nery Simes

Note que dessa vez o PID e o GID foram diferentes e, provavelmente,


sero diferentes mais uma vez se o programa for executado novamente,
isso porque o Sistema Operacional fornece um nmero de identificao
a cada execuo e no possvel prever qual o nmero PID que o
processo receber a cada execuo. No entanto, o PID do pai do
processo foi o mesmo porque, neste caso, o pai do processo principal o
terminal (bash) e, como o programa foi executado duas vezes no mesmo
terminal, cada execuo ficou associada ao mesmo processo pai (neste
caso, o bash com PID 19907, mas no seu computador provavelmente
ter outro PID). Para se certificar disso, basta digitar um ps e observar o
nmero PID do terminal (bash).
$ ps
PID TTY
19907 pts/0
20347 pts/0

TIME CMD
00:00:00 bash
00:00:00 ps

7.2. Criao de processos


Para criar processos em GNU/Linux usando a linguagem C, necessrio
utilizar a primitiva fork() que, juntamente com primitiva wait(),
foi a primeira notao de linguagem para especificar concorrncia.
Grosseiramente falando, a primitiva fork() cria um novo processo, ao
passo que a wait() aguarda a finalizao do processo criado para desalocar
seus recursos. Em geral, para cada fork no programa necessrio um wait.
Essa primitiva pertence biblioteca <unistd.h>, mas necessrio incluir
tambm a biblioteca <sys/types.h> cuja sinopse apresentada abaixo.
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

Sistemas Operacionais II

Quadro 29: Exemplo do uso do fork e dos comandos wait e sleep.

Fonte:

O processo criado (filho) uma cpia exata do processo pai, excetuandose informaes de identificao como PID e PPID (parent PID). Alm
disso, o valor retornado pela funo fork() 0 (zero) para o processo
filho e o PID do filho para o processo pai. Por meio desse valor de
retorno, possvel diferenciar se o processo o pai ou o filho e selecionar
cdigos diferentes para eles executarem.
Cada processo tem o seu prprio espao de endereamento, com
cpias de todas as variveis, que so independentes em relao s
variveis de outro processo. Aps a criao, ambos os processos
(pai e filho) executam a instruo seguinte primitiva fork.
A sincronizao entre os processos pai e filho feita com a primitiva
wait(), que bloqueia o processo pai, que a executa, at que um processo
filho termine. Em seguida, a primitiva wait responsvel por desalocar
os recursos alocados para o filho, como rea de dados, cdigo, pilha e
PCB. A sinopse da primitiva wait dada a seguir:
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);

Agora, vamos fazer um programa exemplo, que cria um processo filho


por intermdio da primitiva fork. Digite o programa a seguir e salve-o
com o nome fork_simples.c.

99

100

Prof. Srgio Nery Simes

Para compil-lo, utilize o comando:


$ gcc fork_simples.c -o fork_simples -Wall

Em seguida, execute-o e observe o resultado:


$ ./fork_simples
Filho: (pid=8977) e espero 10 segundos.
Pai: (pid=8976) e espero pelo meu filho=8977
Filho: Ja esperei e vou embora...
Pai: Meu filho terminou. Vou terminar tambem!

Na linha 8 desse programa, o processo pai (PID=8976) cria um processo


filho (PID=8977). A partir da linha 9, a execuo passa a ser feita por ambos
os processos. No entanto, o processo filho ter a varivel id igual a zero
que o retorno padro da funo fork para processos filhos. J o pai ter a
varivel id com o valor diferente de zero e valer o PID do processo filho.
Assim, na linha 9, o processo filho entra no bloco de cdigo do if (linhas
10 a 14) e o pai entra no bloco do else (linhas 16 a 20).
A primitiva sleep(n), ao ser chamada, faz o processo aguardar n
segundos.
O filho aguarda 10 segundos (sleep na linha 12) e sai, enquanto o pai
fica aguardando pelo filho (devido funo wait na linha 18) para poder
sair tambm. Aps o filho terminar, um sinal de aviso enviado ao pai
que o permite sair da funo wait e terminar tambm.
Como vimos nesse exemplo, aps o processo pai criar o processo
filho, ambos os processos utilizam o retorno da funo fork neste
caso, armazenado na varivel id para selecionar cdigos diferentes
para execuo.
Agora, vamos fazer um programa no qual o processo filho termina,
mas o processo pai no executa wait, deixando seus recursos alocados.
Nesse caso, chamamos o processo filho de processo zumbi, pois ele j
encerrou, mas continua com recursos alocados do sistema. Digite o
programa abaixo e salve-o com o nome zumbi.c.

Sistemas Operacionais II

Agora, compile-o com o comando:


$ gcc zumbi.c -o zumbi -Wall

Em seguida, execute-o e observe o resultado.


$ ./zumbi
PAI: (pid=9240) vou criar um processo filho...
FILHO: (pid=9241) vou aguardar 5
segundos...
PAI: no vou executar wait...
FILHO: vou terminar...

O filho termina, mas o pai no. Devido ao loop infinito nas linhas 19, o
pai nunca executar o wait da linha 22, que liberaria os recursos alocados
pelo filho. Assim, o processo filho chamado de zumbi, pois j terminou,
mas continua ocupando recursos do sistema. Para confirmar isso, abra
um novo terminal e digite o comando em negrito (ps u) a seguir:

101

102

Prof. Srgio Nery Simes

$ ps u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME
COMMAND
aluno 7937 0.0 0.3 4724 2048 pts/0 Ss+ 03:48 0:00
bash
aluno 9640 66.2 0.0 1628 376 pts/0 R 05:18 0:15 ./
zumbi
aluno 9641 0.0 0.0 0 0 pts/0 Z 05:18 0:00 [zum]
<defunct>
aluno 9647 0.0 0.3 4716 1996 pts/1 Rs 05:18 0:00
bash
aluno 9650 0.0 0.1 2744 1004 pts/1 R+ 05:18 0:00
ps u

Observe o programa com PID 9641: ao lado do nome dele h palavra


defunct, indicando que ele no est mais sendo utilizado. Outra forma
de ver isso por meio do comando top, assim: digite top nesse segundo
terminal e observe algo semelhante Figura 15.
Figura 15: Um processo zumbi

Fonte:

Observe, no final da segunda linha, que o comando top informa que


h um processo zombie (zumbi, em ingls). Agora, envie um sinal
-15 (SIGTERM) para terminar esse processo. Por exemplo: no caso
da Figura 15, bastaria digitar:
$ kill -15 9640

Em seguida, verifique novamente com o comando top se o processo foi

Sistemas Operacionais II

encerrado.
Agora, vejamos outro exemplo, no qual o processo pai finalizado, mas
o filho continua sendo executado. Digite o programa que segue e salve-o
com o nome orfao.c.

Agora o compile com o comando:


$ gcc orfao.c -o orfao -Wall

Em seguida, execute-o conforme abaixo e observe o resultado.


$ ./orfao
PAI: meu pid=10092. Vou criar um processo filho.
FILHO: criado com pid=10093.
FILHO: Vou ficar em loop infinito...
PAI: (pid=10092) vou deixar meu filho orfao.

Neste exemplo, o processo filho entra em loop infinito (linha 12) e


por isso no termina. O processo pai aguarda 5 segundos (linha16) e,
em seguida, sai terminando sua execuo e deixando o processo filho
rfo. Aps isso, voc pode verificar com o comando ps o processo filho
(PID=10093) sendo executado:
$ ps
PID
7937
10093
10154

TTY
pts/0
pts/0
pts/0

TIME
00:00:00
00:02:52
00:00:00

CMD
bash
orfao
ps

Se preferir, voc pode encerrar o programa orfao com killall.


$ killall orfao

103

104

Prof. Srgio Nery Simes

1.Observe o programa a seguir e responda s perguntas.

a. Esse programa possui um nico procedimentoprintf (linha


10). Quantas linhas sero impressas na tela?
b. e se o nmero 3 (linha 6) for alterado para 4, quantas linhas
sero impressas? Por qu?
2. Descubra, por meio de manuais na internet, para que serve a
primitiva waitpid() e como utiliz-la.
3. Faa um programa em que o processo principal crie trs filhos.
Cada filho deve imprimir seu PID e em seguida aguardar 5
segundos antes de finalizar. O processo principal deve finalizar
somente aps todos os filhos finalizarem.
4. Faa um programa em que o processo principal crie um filho,
esse filho crie outro filho neste caso, neto do processo principal.
O processo neto deve imprimir seu PID e aguardar 5 segundos
antes de finalizar. O processo filho tambm deve imprimir seu PID
aguardar o processo neto para finalizar. Por sua vez, o processo pai
deve imprimir seu PID e aguardar o processo filho para finalizar.
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
____________________________________________________
____________________________________________________

Prezado(a) aluno(a),
Espero que os ensinamentos desse captulo tenham sido aprendidos
de maneira clara, pois formam a base para o prximo e derradeiro
captulo de nossa jornada. Nele, iremos aprender conceitos avanados
de programao e manipulao de threads no GNU/Linux.
Bom estudo!

Manipulao de Threads em
C no GNU/Linux
Prezado(a) aluno(a),
Neste captulo, voc aprender como fazer programas que manipulam
threads no GNU/Linux. Comearemos por algumas revises sobre o
conceito de threads, nas quais veremos que a principal caracterstica
das threads que elas compartilham a rea de dados e cdigo.
Em seguida, veremos como criar threads na linguagem C usando
o padro POSIX e veremos alguns exemplos de programao de
threads. Ao final do captulo, veremos os problemas que podem
ser causados quando compartilhamos recursos. Aconselho que
voc faa todos os programas deste captulo para obter um melhor
entendimento das informaes aqui apresentadas.
Bom estudo!
Vimos na disciplina Sistemas Operacionais I que, a partir do conceito
de mltiplas threads (multithread), foi possvel projetar e implementar
aplicaes concorrentes de forma eficiente, pois um processo pode ter
partes diferentes do seu cdigo sendo executadas em paralelo com um
overhead (sobrecarga) menor que ao utilizar mltiplos processos.
Como as threads de um mesmo processo compartilham o mesmo
espao de endereamento, a comunicao entre threads no envolve
mecanismos lentos de intercomunicao entre processos, aumentando,
consequentemente, o desempenho da aplicao.
O desenvolvimento de programas que exploram os benefcios da
programao multithread no simples. A presena do paralelismo
introduz um novo conjunto de problemas, como a comunicao
e sincronizao de threads. Existem diferentes modelos para a
implementao de threads em um Sistema Operacional, em que
desempenho, flexibilidade e custo devem ser avaliados.
Vimos tambm que um programa uma sequncia de instrues,
composta por desvios, repeties e chamadas a procedimentos e
funes. Quando um programa est sendo executado, h um registrador
chamado PC (Program Counter) ou IP (Instruction Pointer) que
aponta para o endereo da prxima instruo a ser executada. Ao longo

106

Prof. Srgio Nery Simes

da execuo de um programa, os endereos de instrues apontados por


esse registrador formam um caminho denominado fluxo de execuo,
fluxo de controle ou linha de execuo.
Thread pode ser definida como linha de execuo, fluxo de
execuo ou fluxo de controle de um processo.

Em um ambiente monothread, um processo suporta apenas uma nica


thread. Nesse ambiente, cada processo possui seu prprio contexto
de hardware, contexto de software e espao de endereamento. Alm
disso, aplicaes concorrentes so implementadas apenas com o uso
de mltiplos processos independentes ou subprocessos. A utilizao
de processos independentes e de subprocessos permite dividir uma
aplicao em partes que podem trabalhar de forma concorrente.
Em um ambiente multithread, cada processo pode possuir vrios fluxos
de execuo ou threads. Essas threads compartilham o mesmo espao
de endereamento, o mesmo contexto de software e possuem seus
prprios contextos de hardware e pilha.
Para que as threads sejam criadas, necessrio que sejam definidas no
programa principal. De forma simplificada, uma thread pode ser definida
como uma sub-rotina de um programa que pode ser executada de forma
assncrona, ou seja, executada concorrentemente ao programa chamador.
O programador deve especificar as threads, associando-as s sub-rotinas
assncronas. Dessa forma, um ambiente multithread possibilita a execuo
concorrente de sub-rotinas dentro de um mesmo processo.
Por exemplo: suponha que exista um programa principal que realize
a chamada de duas sub-rotinas assncronas por meio de threads.
Inicialmente, o processo criado apenas com uma thread, para a
execuo do programa principal. Quando o programa principal
chamar as sub-rotinas, sero criadas as duas threads e estas sero
executadas independentes da thread do programa principal. Neste
processo, as trs threads sero executadas concorrentemente.
Threads compartilham o processador da mesma maneira que processos e
passam pelas mesmas mudanas de estado (execuo, espera e pronto). Por
exemplo, enquanto uma thread espera por uma operao de E/S, outra thread
pode ser executada. Para permitir a troca de contexto entre diversas threads,
cada thread possui seu prprio contexto de hardware, com o contedo dos
registradores gerais e especficos. Quando uma thread est sendo executada,
seu contexto de hardware est armazenado nos registradores do processador.

Sistemas Operacionais II

No momento em que a thread perde a utilizao da UCP, as informaes so


atualizadas no seu contexto de hardware.
Dentro de um mesmo processo, threads compartilham o mesmo
contexto de software e espao de endereamento com as demais threads;
porm, cada thread possui seu contexto de hardware individual e sua
pilha individual. Threads so implementadas internamente por meio
de uma estrutura de dados denominada bloco de controle da thread
(Thread Control Block TCB). O TCB armazena, alm do contexto de
hardware, mais algumas informaes relacionadas exclusivamente
thread, como prioridade, estado de execuo e bits de estado.
A grande diferena entre aplicaes monothread e multithread est no uso
do espao de endereamento. Processos independentes e subprocessos
possuem espaos de endereamento individuais e protegidos, enquanto
threads compartilham o espao dentro de um mesmo processo. Essa
caracterstica permite que o compartilhamento de dados entre threads
de um mesmo processo seja mais simples e rpido, se comparado a
ambientes monothread.
Como threads de um mesmo processo compartilham o mesmo espao
de endereamento, no existe qualquer proteo no acesso memria,
o que permite que uma thread possa alterar facilmente dados de outros.
Para que threads trabalhem de forma cooperativa, fundamental
que a aplicao implemente mecanismos de comunicao e de
sincronizao entre elas, a fim de garantir o acesso seguro aos dados
compartilhados na memria e a integridade dos mesmos.
O uso de multithreads proporciona uma srie de benefcios. Programas
concorrentes com mltiplas threads so mais rpidos do que programas
concorrentes implementados com mltiplos processos, pois operaes de
criao, chaveamento de contexto e eliminao das threads geram menor
overhead (sobrecarga). Como as threads dentro de um processo dividem
o mesmo espao de endereamento, a comunicao entre elas pode ser
realizada de forma rpida e eficiente. Alm disso, threads em um mesmo
processo podem compartilhar facilmente outros recursos, como descritores
de arquivos, temporizadores, sinais, atributos de segurana, etc.
A utilizao do processador, dos discos e de outros perifricos pode ser
feita de forma concorrente pelas diversas threads, significando melhor
utilizao dos recursos computacionais disponveis. Em algumas
aplicaes, a utilizao de threads pode melhorar o desempenho
da aplicao apenas executando tarefas em background enquanto

107

108

Prof. Srgio Nery Simes

operaes E/S esto sendo processadas. Aplicaes como editores de


texto, planilhas, aplicativos grficos e processadores de imagens so
especialmente beneficiadas quando desenvolvidas com base em threads.
Basicamente, existem dois tipos de Threads: as threads em modo usurio
e as threads em modo kernel. A principal diferena entre esses dois
modelos o modo como as threads so vistas pelo Sistema Operacional.
Threads em modo usurio (TMU) so implementadas pela aplicao
e no pelo Sistema Operacional. Para isso, deve existir uma biblioteca
de rotinas que possibilite aplicao realizar tarefas como criao/
eliminao de threads, troca de mensagens entre threads e uma poltica
de escalonamento. Nesse modo, o Sistema Operacional no sabe da
existncia de mltiplas threads, sendo responsabilidade exclusiva da
aplicao gerenciar e sincronizar as diversas threads existentes.
Threads em modo kernel (TMK) so implementadas diretamente
pelo ncleo do Sistema Operacional, por meio de chamadas a
rotinas do sistema que oferecem todas as funes de gerenciamento
e de sincronizao. O Sistema Operacional sabe da existncia de cada
thread e pode escalon-las individualmente. No caso de mltiplos
processadores, as threads de um mesmo processo podem ser executadas
simultaneamente, aumentando, com isso, o paralelismo da aplicao.

8.1. Implementao de Threads


Agora que j revisamos os conceitos mais importantes sobre threads,
vamos estudar como elas podem ser programadas na linguagem C,
utilizando o padro POSIX. O padro POSIX (Portable Operating System
Interface) foi definido pelo IEEE (Institute of Electrical and Electronics
Engineers). Esse padro define o conjunto de funes que as bibliotecas
devem oferecer, permitindo que as aplicaes possam ser executadas em
qualquer Sistema Operacional que siga as recomendaes do padro.
Esse padro POSIX define um conjunto de funes que manipulam
threads que a biblioteca pthreads (POSIX Threads) deve oferecer.
Nessa biblioteca (cujo cabealho denominadopthread.h), a criao
de uma thread realizada atravs da primitiva pthread_create(). Essa
primitiva usada em conjunto com outra, a pthread_join(), que serve
para aguardar o trmino de uma thread e desalocar seus recursos.

Sistemas Operacionais II

8.1.1. A primitiva pthread_create()


A primitiva pthread_create() cria uma nova thread, concorrente ao
processo principal, que executar uma funo do programa. Note que
isso difere da criao de processos pois, aps um fork ser realizado, o
novo processo inicia sua execuo pela instruo imediatamente abaixo
do fork, ao passo que, aps um pthread_create(), a nova thread
inicia sua execuo a partir de alguma funo escolhida do programa
principal. A sinopse da primitiva pthread_create() fornecida a seguir.
#include <pthread.h>
int pthread_create(*identificador, *atributo,
funcao, argumentos);

em que:
identificador

um ponteiro para uma varivel do tipo pthread_t


responsvel pela identificao da thread recm-criada.

atributo

um ponteiro para atributos que so armazenados em uma


varivel do tipo pthread_attr_t. Permite que o programador
defina alguns atributos especiais como poltica de
escalonamento, escopo de execuo, dentre outros. Para usar
o padro do sistema, deve ser passado NULL.

funcao

um ponteiro para a funo que ser executada pela thread.

argumentos

um ponteiro do tipo void* que passado como argumento


para a rotina. Contm o endereo de memria dos dados para
a thread criada.

O conjunto de instrues a ser executado pela thread definido


no corpo da funo. A thread ser disparada imediatamente aps a
primitiva pthread_create() e terminar somente ao fim da funo ou
pela chamada pthread_exit() que anloga funo exit().
8.1.2. A primitiva pthread_join()
A primitiva pthread_join() bloqueia o processamento da thread que a
chamou at que a thread identificada na funo termine normalmente
ou seja cancelada. Em seguida, desaloca os recursos da respectiva thread.
Geralmente chamada pelo processo principal para que este aguarde o
trmino da thread criada, aps o que a thread desalocada. Normalmente,
para cada pthread_create() necessrio um pthread_join().
A primitiva pthread_join() semelhante a primitiva waitpid().

109

110

Prof. Srgio Nery Simes

A sinopse da primitiva pthread_join fornecida a seguir:


#include <pthread.h>
int pthread_join(pthread_t thread, void **valor);

em que:
thread

Identificao da thread que cujo trmino vai ser aguardado.

valor

valor retornado pela thread aps terminada.

Se o parmetro valor for NULL, o valor de retorno da thread ser


descartado. Caso contrrio, o valor de retorno ser um dos argumentos
da funo pthread_exit().
Quando uma thread comum termina, os recursos de memria utilizados
descritores e pilha no so liberados at que todas as threads em
execuo do processo sofram a juno feita pela pthread_join(). Dessa
forma, esta primitiva precisa ser executada para cada thread criada para
evitar desperdcio de memria.
8.1.3. Implementao de threads em C
As duas primitivas que vimos anteriormente so suficientes para
implementarmos threads em C. Agora, vamos criar um programa para
testar seu funcionamento. Digite o programa a seguir e salve com o
nome thread1.c.

Para compilar esse programa necessrio a opo -l pthread para


que o compilador encontre a biblioteca pthread e faa a ligao. Assim,
compile esse programa com comando:
$ gcc thread1.c -o thread1 -Wall -l pthread

Sistemas Operacionais II

Onde -o (letra o) a opo que indica a o nome do arquivo de sada,


-Wall a opo que indica ao compilador que exiba todas as mensagens
de alerta, caso haja e -l (letra l) a opo que indica ao compilador qual
biblioteca deve ser utilizada. Em seguida, execute-o e observe o resultado:
$ ./thread1
PAI: criando uma nova thread...
FILHA: sou a nova thread e aguardarei 10s.
PAI: aguardando a conclusao da thread...
FILHA: terminarei agora.
PAI: a thread terminou. Vou terminar tambem.

Esse programa cria uma nova thread atravs da funo pthread_


create() (linha 16), que executar a funo funcao_thread() (linha
5). Aps a criao da nova thread, haver dois fluxos de execuo: o
processo principal e a nova thread. Chamarei o processo principal de
pai e a nova thread criada de filha. Quando o processo principal (pai)
executar a funo pthread_join() (linha 19), ele ficar bloqueado
aguardando at que a thread filha termine sua execuo.
Por sua vez, a thread filha aguardar 10 segundos (linha 8: a funo
sleep serve para aguardar um determinado nmero de segundos) e, em
seguida, terminar. Ao terminar, a thread filha enviar automaticamente
um sinal para o processo pai e este sair do estado suspenso ou bloqueado
em que se encontra aps phtread_join() (linha 19), desalocando os
recursos da thread filha. Em seguida, o processo pai terminar.
Agora, vejamos um exemplo de como criar duas threads. Digite o
programa a seguir e salve-o com o nome thread2.c.

111

112

Prof. Srgio Nery Simes

Compile-o com o comando:


$ gcc thread2.c -o thread2 -Wall -l pthread

Em seguida, execute-o e observe o resultado:


$ ./thread2
Pai: Criando duas threads...
Filha1: vou aguardar 5 segundos...
Filha2: vou aguardar 10 segundos...
Pai: Aguardando as duas threads...
Filha1: j aguardei agora vou finalizar...
Filha2: j aguardei agora vou finalizar...
Pai: Ambas as threads terminaram...

Nesse programa, o processo principal (pai) cria duas threads (linhas 23


e 24) e, em seguida, fica bloqueado aguardando o trmino delas (linhas
26 e 27). Quando ambas terminam, o processo pai termina tambm.
Observe que cada thread, ao ser criada (linhas 23 e 24), configurada
para executar funes diferentes: a primeira thread executa a funo
funcao1() e a segunda a funo funcao2(), que, neste exemplo,
diferenciam-se apenas no tempo de sleep (linhas 9 e 15) a primeira
aguarda 5 segundos enquanto a segunda aguarda 10 mas poderiam
ser funes totalmente diferentes. Note que, como a thread pai fica
aguardando as duas threads filhas terminarem, embora a thread _a
termine primeiro (5 segundos), enquanto no terminar a thread_b
(linha 27) o processo pai no prosseguir.
Agora, vejamos um exemplo de como passar argumentos para as
threads. Digite o programa a seguir e salve-o com o nome thread3.c.

Sistemas Operacionais II

Compile o programa com o comando a seguir:


$ gcc thread3.c -o thread3 -Wall -l pthread

Agora, observe o resultado de sua execuo:


$ ./thread3
Pai: Criando duas threads...
Recebi o argumento (AAA) do processo pesado
Recebi o argumento (BBB) do processo pesado
Pai: Aguardando as duas threads...
Terminando a thread que recebeu o argumento (AAA).
Terminando a thread que recebeu o argumento (BBB).
Pai: Aguardando as duas threads...

Nesse exemplo, as threads so criadas nas linhas 17 e 18 e configuradas


para executarem a mesma funo funcao_thread(). Nessas linhas
tambm so passados os argumentos AAA e BBB para a primeira
e segunda threads, respectivamente. As threads iniciam sua execuo
na funo funcao_thread() e, aps receberem seus respectivos
argumentos, esperam 2 segundos e terminam. Feito isso, o processo
principal que as estava aguardando termina tambm.
Agora vamos fazer um programa para tentar observar o escalonamento
das threads e entender um pouco mais sobre sua concorrncia. O
programa a seguir cria duas threads e fica exibindo sequncias diferentes.
O prprio escalonamento das threads vai fazer com que seja exibida de
forma alternada a sada da primeira thread com a sada da segunda.
Digite o programa que segue e salve-o com o nome thread4.c.

113

114

Prof. Srgio Nery Simes

Para compil-lo, utilize o comando:


$ gcc thread4.c -o thread4 -Wall -l pthread

Em seguida, execute-o e observe o resultado:


$ ./thread4
...
11111111
11111111
11111111
Terminando a thread 1.
...
22222222
22222222
22222222
Terminando a thread 2.
Ambas as thread terminaram...

Por razes bvias, no coloquei aqui as mais de 200 mil linhas de sada,
apenas um pequeno trecho para voc ter uma ideia. Esse programa
cria duas threads que ficam imprimindo sequncias diferentes na tela.
Observe que a sada da funo (funcao1) usada pela primeira thread
(linha 9) exibe uma sequncia de 1s precedido de uma tabulao. J a sada
da funo usada pela segunda thread (linha 16) imprime um sequncia
de 2s precedido de duas tabulaes para facilitar a visualizao.
possvel observar o escalonamento das sadas alternadamente.
8.1.4. Utilizao de threads para aumentar o
desempenho
As threads tambm podem ser utilizadas para aumentar o desempenho
de programas. Por exemplo: suponha que voc tenha um computador
com dois cores (ncleos) de processamento e queira us-lo para
calcular uma integral. (Calma, no precisa ficar com receio, no vou
ensinar clculo aqui, Ok?! Trata-se apenas de mostrar como as threads
podem ser usadas para aumentar o desempenho!). Na prtica, para
o computador, uma integral se resume apenas a uma sequncia de
somas. Assim, se voc fizer metade destas somas em um ncleo e a
outra metade em outro provavelmente o clculo ser feito na metade do
tempo aproximadamente.
Como exemplo, vou apresentar um programa que calcula o valor de PI
atravs de um integral com uma nica thread. Em seguida, apresentarei
o mesmo programa, porm utilizando duas threads. Espero que,

Sistemas Operacionais II

quando execut-lo no meu computador, que core duo, o tempo seja


menor. Vamos ento ao programa, sabendo que o valor de PI pode ser
calculado por meio de uma integral definida de 0 a 1 da funo f(x)=4/
(1+x2). O programa abaixo calcula essa integral por aproximao de
trapzios. Digite-o e salve-o com o nome de integral.c.

Compile o programa com o comando:


$ gcc integral.c -o integral -Wall

Em seguida, use o comando time para medir o tempo de execuo do


programa (basta digitar time no incio da linha):
$ time ./integral
A rea da curva eh:
3.141592653590
real 0m5.808s
user 0m5.808s
sys 0m0.004s

O programa gastou 5.808s (real) para calcular a integral numrica de 0


a 1, utilizando 50 milhes de trapzios. Agora, vamos fazer esse mesmo
clculo atravs de duas threads: uma calcular de 0.0 at 0.5 e a outra
de 0.5 a 1.0. Como as threads sero calculadas em um computador com
dois ncleos (estou executando em um Core Duo), espera-se que o
tempo seja menor.

115

116

Prof. Srgio Nery Simes

Agora, vamos criar o programa que utiliza as duas threads para realizar
o clculo. Para isso, as duas threads criadas devem executar a rotina de
clculo da rea em duas partes diferentes e, ao final, devemos juntar os
resultados de cada thread. Digite o programa que segue e, em seguida,
salve-o com o nome integral_thread.c.

#include
#include
#include
#include

<stdlib.h>
<stdio.h>
<pthread.h>
<unistd.h>

double integral = 0.0;


double AreaTrapezio(double dx, double h1, double
h2)
{

double area;

area = dx * (h1+h2)/2;

return area;
}
double f(double x)
{

return (4/(1+x*x));
}
double CalculaArea(double a, double b, int N)
{

int i;

double area=0.0, dx, x1, x2, f1, f2;

dx = (b-a)/N;

for (i=0; i<N; i++)
{

x1 = a + dx * i;

x2 = a + dx * (i+1);

f1 = f(x1);

f2 = f(x2);

area += AreaTrapezio (dx, f1, f2);
}

return area;
}
void *funcao1()
{

double area1 = CalculaArea (0.0, 0.5,
25000000);

integral += area1; /* pode haver condicao de
corrida aqui */

return NULL;

Sistemas Operacionais II

}
void *funcao2()
{
double area2 = CalculaArea (0.5, 1.0,
25000000);
integral += area2; /* pode haver condicao de
corrida aqui */

return NULL;
}
int main (int argc, char **argv)
{

pthread_t thread1, thread2;

pthread_create(&thread1, NULL, funcao1, NULL);

pthread_create(&thread2, NULL, funcao2, NULL);

pthread_join(thread1, NULL);

pthread_join(thread2, NULL);

printf (A rea da curva eh:\n%.12lf\n,
integral);

return 0;
}

Compile o programa:
$ gcc integral_thread.c -o integral_thread -Wall
-lpthread

Em seguida, execute-o e observe o resultado:


$ time ./integral_thread
A rea da curva eh:
3.141592653590
real 0m2.940s
user 0m5.844s
sys 0m0.000s

Como vemos, o programa que usou threads em paralelo gastou


apenas 2.940s (real) contra os 5.808s do programa serial (monthread).
O aumento no desempenho ocorre porque as threads rodam
simultaneamente em processadores diferentes, ou seja, em paralelo.
Com isso, observamos que o tempo praticamente caiu pela metade ao
executarmos em dois cores simultaneamente provando, assim, que as
threads podem ser usadas para aumentar o desempenho. Agora, vamos
ver alguns problemas que podem acontecer quando utilizamos recursos
compartilhados entre threads.

117

118

Prof. Srgio Nery Simes

8.1.5. O problema do compartilhamento de recursos


At o momento, vimos como implementar threads criando aplicaes
concorrentes. Mas, como sabemos, as aplicaes concorrentes muitas vezes
necessitam que os processos comuniquem-se entre si. Essa comunicao
pode ser implementada por meio de diversos mecanismos, como variveis
compartilhadas na memria principal ou trocas de mensagens. Nessa
situao, necessrio que os processos concorrentes tenham sua execuo
sincronizada por meio de mecanismos do Sistema Operacional.
Os mecanismos que garantem a comunicao entre os processos
concorrentes e o acesso a recursos compartilhados so chamados
mecanismos de sincronizao. No projeto de sistemas operacionais
multi-programveis, fundamental a implementao desses
mecanismos, para se garantir a integridade e a confiabilidade na
execuo de aplicaes concorrentes.
Condio de Corrida (Race Condition) a situao na qual
alguns processos acessam simultaneamente uma regio crtica,
tornando o resultado inconsistente e dependente da ordem em
que os acessos so realizados.
Um dos problemas mais comuns quando temos recursos compartilhados
chamado de race condition. Esse problema ocorre quando mais de
um processo acessa os recursos compartilhados simultaneamente.
Para evitar esse problema, apenas um processo por vez poderia acessar
o recurso compartilhado, enquanto os demais processos deveriam
aguard-lo at a liberao do recurso.
Para vermos como ocorre esse problema, digite o programa abaixo e
salve-o com o nome de race_condition.c.

Sistemas Operacionais II

Agora, compile-o com o comando:


$ gcc race_condition.c -o race_condition -Wall -l
pthread

Em seguida, execute vrias vezes e observe o resultado:


$ ./race_condition
Encerrei a thread 1
Encerrei a thread 2
O valor da conta eh:
$ ./race_condition
Encerrei a thread 1
Encerrei a thread 2
O valor da conta eh:
$ ./race_condition
Encerrei a thread 1
Encerrei a thread 2
O valor da conta eh:
$ ./race_condition
Encerrei a thread 1
Encerrei a thread 2
O valor da conta eh:
$ ./race_condition
Encerrei a thread 1
Encerrei a thread 2
O valor da conta eh:

925443770

801939410

836119155

949457405

823170301

119

120

Prof. Srgio Nery Simes

Esse programa cria duas threads que escrevem simultaneamente em uma


varivel global compartilhada conta (linha 7). A primeira thread soma
100 milhes de vezes o valor 3 na varivel conta. A segunda thread soma
100 milhes de vezes o valor 7. Portanto, ao final de ambas as threads, o
valor esperado na varivel conta deveria ser 1 bilho (ou seja, 300 milhes
mais 700 milhes). No entanto, observamos que o programa foi executado
vrias vezes e em todas resultou em valores incorretos devido aos acessos
simultneos na varivel conta. Como vimos anteriormente e agora
estamos vendo na prtica esse problema denominado race condition.
1. Faa todos os programas deste captulo, execute-os e observe
suas sadas.
2. Em seguida, explique o funcionamento de cada programa com
as suas palavras.
3. Proponha uma soluo terica conforme vimos na disciplina
de Sistemas Operacionais 1 para o problema de race condition
encontrado no ltimo programa.
4. Descubra se h alguma biblioteca no Linux que possibilite
implementar de forma prtica em C uma soluo para o problema
de race condition encontrado no ltimo programa.
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
____________________________________________________

Prezado(a) aluno(a),
Chegamos ao fim de nossa jornada. Espero que tenha sido proveitosa
e til.
A semente foi lanada. O GNU/Linux um sistema livre, aberto,
pronto para ser explorado. Agora, voc j tem as ferramentas
necessrias para essa explorao.
Mantenha a mente aberta e procure sempre estar preparado.
Sucesso sempre!

[1] Mazioli, Gleydson. Guia Foca Linux. (www.guiafoca.org). 2007.


[2] Ribeiro, Uir. Sistemas Distribudos Desenvolvendo Aplicaes
de Alta Performance no Linux. 1.ed. Axcel, 2005
[3] MACHADO, F.B. e MAIA, L.P. Arquitetura de Sistemas
Operacionais. 4.ed. LTC, 2007.
[4] SILBERSCHATZ, A., GALVIN, P.B., GAGNE, G. Fundamentos de
Sistemas Operacionais. 6.ed. LTC, 2004.
[5] TANENBAUM, A.S. Sistemas Operacionais Modernos. 2.ed. So
Paulo: Pearson Brasil, 2007.
[6] OLIVEIRA, R.S., CARISSIMI, A.S., TOSCANI, S.S. Sistemas
Operacionais. 3.ed. Sagra-Luzzato. 2004.
[7] Site da distribuio Ubuntu no Brasil (http://www.ubuntu-br.org/)
[8] Suporte do Ubuntu no Brasil (http://www.ubuntu-br.org/suporte)
[9] Site do projeto GNU (http://www.gnu.org/)
[10] Informaes sobre sistemas Linux (http://pt.wikipedia.org/wiki/
Linux)
[11] Dicas, notcias e tutoriais sobre Linux (http://br-linux.org/)
[12] Comunidade Linux no Brasil (http://www.vivaolinux.com.br/)
[13] Apostilas gratuitas e documentao sobre o Linux (http://www.
dicas-l.com.br/)
[14] POSIX Thread Programmig (https://computing.llnl.gov/tutorials/
pthreads/)
[15] GNU Bash Reference Manual (http://www.network-theory.co.uk/
docs/bashref/)
[16] The CTDP Linux Programmers (http://www.comptechdoc.org/os/
linux/programming/)

122

Prof. Srgio Nery Simes

[17]Goldt, Sven. The Linux Programmers Guide. Version 0.4, 1995


[18]Free Linux Programming Books (http://www.techbooksforfree.
com/linux.shtml)

Anexo a - Respostas das


atividades 45
1. Quais so os tipos de interface que voc possui em sua mquina?
Esta resposta depende do hardware instalado e da configurao do seu
Sistema Operacional. Use o comando ifconfig para obter a listagem das
interfaces e compar-la com o Quadro 9.
2. Descubra o(s) servidores DNS configurados no Host1 (dica: liste o
contedo do arquivo /etc/resolv.conf)
Esta resposta depende da configurao do seu sistema operacional,
porm se pode verificar o(s) servidor(es) DNS configurados listando o
contedo do arquivo resolv.conf com o comando cat /etc/resolv.conf e
lendo o(s) IP(s) da palavra-chave nameserver.
3. Altere o IP de Host2 para 172.16.96.2 e teste a conectividade entre eles
usando o comando ping. O que ocorre? Por qu?
Edite o arquivo com o comando sudo gedit /etc/network/interfaces e
altere a diretiva address da interface correspondente para 172.16.192.2.
Use o comando ping 192.168.10.100. O resultado deve ser connect:
network is unreachable, pois agora, Host1 e Host2 esto em dois
segmentos de redes distintos.
4. Altere a configurao da interface esttica para que ela receba o IP a
partir de um DHCP. O que ocorre? Por qu?
Use o comando sudo gedit /etc/network/interfaces para abrir o arquivo
interfaces e verifique qual a interface esttica. Suponha que seja eth1,
neste caso, altere o valor da linha iface eth1 inet static para iface eth1
inet dhcp.
5. O que ocorre se o servidor DNS preferencial responder negativamente
a uma consulta?
O aplicativo retorna um erro de acesso ao usurio.
6. O que ocorre se o servidor DNS no responder a uma consulta?
Se houver um servidor DNS alternativo, este ser contatado a resolver
a consulta.

124

Prof. Srgio Nery Simes

7. Envie 10 mensagens ICMP atravs do comando ping a um site qualquer


e calcule o tempo mdio entre envio e recepo do pacote. Dica: o campo
time dar a informao do intervalo de tempo de cada mensagem.
Para o envio de 10 mensagens ping para um determinado host, digite:
ping www.ifes.edu.br -c 10. Para fazer a mdia, observe os valores
listados no campo time e use uma calculadora convencional.
8. Qual a diferena entre as clusulas domain e search no arquivo de
configurao do cliente DNS?
Domain o domnio DNS de onde o host faz parte e search so os
domnios DNS onde sero pesquisados os hosts.
9. Trace a rota entre o seu host e o site do ifes com o comando tracepath.
Para realizar o traado, use o comando tracepath www.ifes.edu.br e
verifique a lista de roteadores entre sua mquina e o destino.
10. Qual a finalidade do comando dhclient?
O comando dhclient solicita uma concesso IP a um servidor DHCP
da sub-rede.