programação em linux

Transcrição

programação em linux
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
INTRODUÇÃO
Este curso tem o objetivo de informar os recursos e metodologias de programação em
ambiente GNU/Linux.
O Governo Federal tem motivado a utilização de software livre. Os ministérios estão migrando
e entendendo que nem sempre “o que é gratuito não tem valor”.
Não se pretende “forçar” ou “convencer” qual é o melhor sistema operacional. Tal comparação
não tem fundamento pois cada sistema operacional tem a sua finalidade. Ao fazê-lo está-se
comparando “alhos com bugalhos”.
O maior desafio da migração não é só o treinamento ou a disseminação das vantagens e
desvantagens, mas a quebra de padrões inexistentes, tais como:
“sistema operacional padrão”. Não existe sistema operacional padrão. Assim como TODO
e QUALQER SOFTWARE, um sistema operacional tem a sua finalidade específica operando
num cenário específico.
“não há suporte em Linux”. Existe, somente, uma grande família de profissionais que
prestam o suporte, patrocinadas ou não por grandes e pequenas empresas, além de suporte
fornecido pelas empresas que distribuem as várias versões de Linux. Existem listas de
discussão na Internet que prestam suporte. Até em redes sociais há o suporte em Linux!
Talvez não seja um suporte em “linux” que o usuário precise! Quem sabe?
“não há pessoal especializado para Linux”. É irônico ouvir isso. Tem-se a impressão que
o GNU/Linux é feito e utilizado por “fantasmas”, entidades sub-aquáticas e extra-terrestres.
Procurar um torcedor do Palmeiras na Gaviões da Fiel é, no mínimo, inocência ...
“Linux resulta em custos excessivos”. É mesmo? Compra-se (se não optar por baixar
gratuitamente), uma única mídia e a distribui para todos da empresa, sem custo adicional.
Dispensa-se a compra de compiladores, Aplicações de Escritório, Aplicações de Pesquisa em
diversos áreas, mantendo o parque de computadores por mais de 10 anos. Por outro lado,
com o tal “SO Padrão” gasta-se: licença para cada computador, licença antivírus para cada
computador, licença de compiladores para os computadores dos profissionais de
desenvolvimento e pesquisa, paga-se por consultas de suporte, custos repetitivos em cada
atualização de versão do “SO Padrão” por incompatibilidade, atualização do parque de
computadores a cada ano por não atender aos requisitos que a “nova versão padrão” exige,
mas que antes não exigia para a mesma atividade. Será que um lado da balança é diferente
do outro?
“Linux é inseguro”. Tão inseguro quanto qualquer sistema operacional se não utilizado no
cenário a que ele foi proposto operar. Alias, não é à toa que algum SO tido como “padrão” tem
quase 1 milhão de vírus enquanto o GNU/Linux tem 600.
“O IE é o mais seguro dos navegadores”. Não é isso que o histórico daquele navegador
tem mostrado. Segundo o “submundo” ainda são explorados várias vulnerabilidades muito
sérias no IE que ainda não são reconhecidas pelo fabricante, sem contar com as
vulnerabilidades
já
detectadas
e
registradas
no
MITRE/CVE
(http://cve.mitre.org/cve/index.html) e que ainda não foram sanadas.
“É difícil encontrar driver de um periférico para Linux”. Também é fácil verificar qual
Cap 1 - 1/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
fabricante de um hardware alternativo fornece driver para Linux. Há 15 anos, contava-se os
fabricantes que forneciam drivers para Linux com os dedos de uma das mãos. Se o “cliente”
desiste de uma compra o “fabricante” muda o comportamento e, com um simples gesto de
“dispor as especificações”, terá o driver feito pela comunidade Linux em pouco tempo.
RealTek, HP, Intel, IBM, Dell são exemplos de empresas que, no passado, mantinham sigilo de
seus periféricos e computadores. Hoje são patrocinadores de desenvolvimento em Linux.
“As janelinhas são muito feias!”. Humm! Esta é uma justificativa tipicamente Windows.
Não tem fundamento técnico.
“Eu nunca sei onde está o ícone para abrir a aplicação X”. Esta é bem mais interessante
pois confirma uma situação de ego duvidoso. Quando novas versões do tal “SO que se diz
padrão” vão para as vitrines e para os CDs piratas, os mesmos usuário perdem meses para
aprender onde estão as mesmas aplicações.
“Alguns produtos só rodam em ambiente Windows”. Será? Não existe alternativa? Não?
Então use o Windows. É “uma” licença do SO. É “uma” licença de antivírus. É “uma” licença
daquele produto. Se observar direito, talvez os recursos utilizados naquele produto também
estão disponíveis em produtos em código livre. A área de desenhos técnicos e projetos CAD é,
realmente, uma área exclusiva Windows, pois o maior fabricante do produto tem razões
comerciais para isso que fogem do escopo. Mas será mesmo necessário um produto assim
para um projeto em fase de desenvolvimento, onde os “requintados recursos” não são
utilizados? Acredita-se que não, e neste caso há alternativa em código livre.
“O sistema de arquivos do Linux não é confiável”. Assim como o NTFS-2, FAT-16 e FAT32 também não eram. Hoje tem-se sistemas de arquivos mais robustos tanto em Linux
quanto em Windows. Logo a “suposta” justificativa também não tem fundamento. Alias,
software livre não significa que exclusividade Linux!
“Alguns sites só permitem a visualização se for o Navegador X”. Hummm. Se for site
do Governo Federal basta acionar a Ouvidoria do órgão. Governo Federal não pode gerar
demanda ao prestar serviços que já foram pagos pelo poder público. Isto é Lei. Se for uma
entidade privada (Bancos, por exemplo), e você é cliente, exija uma licença gratuita ou opte
por serviço de outro banco que atende às suas necessidades. Agora, se for um site do
Governo Britânico, não se preocupe. Eles são super-poderosos. Aliás, a justificativa para não
atualizar o site britânico para compatibilidade com o IE8 é, até, razoável. O IE6 segue muito
mais os padrões do HTML-4.01 que o IE8, o que permite o uso de outros navegadores além do
IE. Se tivessem seguido os padrões HTML (e não o padrão HTML do fabricante) não haveria
problema algum na atualização. http://info.abril.com.br/noticias/tecnologia-pessoal/governoingles-nao-quer-atualizar-ie6-01082010-4.shl (em 01/Ago/2010).
“Já estou velho demais para aprender outro SO”. Para rebater esta justificativa só
disponho de 2 respostas pessoais: “Minha mãe tem 83 anos, usa Linux com BrOffice,
impressora multifuncional, acesso à Internet, adora política, religião e é fã do pinguin”. Minha
sobrinha-neta de 7 anos diz: “Esse é bem melhor. Ele não pega bicho fácil porque tem veneno
dentro dele, Tio?”
“Não uso o Linux porque não há garantias de continuidade”. Em termos de mercado
nada tem garantia de vida permanente. Ex-Digital, Ex-Novel, Ex-Netscape, Ex-Hotmail, ExConectiva, Ex-DKV, Ex-Willis. Nada é permanente! Desde 1970 o único kernel que tem
sobrevivido é o UNIX. Software Livre não é só Linux, nem GNU/Linux.
Cap 1 - 2/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
E aí vem a perguntinha chata: Quem gera tais produtos em software livre? O programador e o
desenvolvedor. Então os equívocos não estão no software mas na equipe que o fez e o faz.
Muitos usuários programadores estão “acostumados” com o ambiente Windows, cheio de
“janelinhas”, segredos e funções não documentadas propositalmente. Contudo, mesmo
naquele SO, as mesmas atividades são encontradas em comandos de console com recursos
avançados e muito mais eficientes. Vários usuários compram aplicativos citados como “de
segurança”. Basicamente são vendidos apenas as “cascas” de interface gráfica de um
comando já existente sob console (recursos de firewall é uma delas, leia sobre o comando
NETSH do Windows, que existe desde o Windows NT 4.0!). Em GNU/Linux tais funções estão
a sua disposição para modificar, estudar e utilizar conforme o seu interesse. Existem os
comandos em modo texto e, em vários casos, a aplicação gráfica correspondente.
Em GNU/Linux várias atividades administrativas (e auxiliares de programação) estão
disponíveis, somente, em consoles de texto. Sob o ponto de vista de usuários Windows, “é um
retrocesso às janelas de comandos DOS”. Por outro lado, nada impede que o programador
crie, em poucas linhas de código, uma interface gráfica em Tcl/TK, em Python, ou mesmo em
Perl. Então, a filosofia de uso é a mesma que motivou Linus Torvalds a criar o kernel Linux e
Richard Stallman a fundar o projeto GNU.
Em GNU/Linux encontramos códigos não documentados, fracamente documentados e
largamente documentados. Existe muita documentação no site do Total Linux Documentation
Project, acessíveis através da URL http://www.tldp.org , em tópicos dos Manual Pages e
HOWTOS. Contudo, a visita ao site oficial da aplicação é ainda mais saudável, pois encontramse a documentação e versões atualizadas.
As IDEs (Integrated Development Environment), em GNU/Linux, ainda estão em
desenvolvimento e apresentam instabilidades de execução em alguns casos. O progresso está
visível mas ainda falta muito o que fazer, contudo nada impede o desenvolvimento. IDE é uma
ferramenta e não a capacidade de raciocínio lógico.
Outro aspecto importante em programação (válida tanto para GNU/Linux quanto para
qualquer ambiente operacional) é a programação de forma segura. Assim, exige-se o conceito
mínimo de Engenharia de Software pelos programadores que, normalmente, ou não acreditam
que isso seja importante, ou acreditam que as funções “proprietárias” ou “já desenvolvidas”
considerem o fato (o que nem sempre é verdadeiro!). “Leia a Bula” (analise o código) antes
de usá-las. Ficarão surpresos ao verem que 90% delas deixam o aspecto de segurança por
“sua conta”.
Ou seja, será necessário que o usuário programador não se atenha a uma única linguagem de
programação. Siga padrões reais e não aqueles exclusivos de produtos. Criem páginas web
tão sofisticadas quanto queiram, mas que sejam acessíveis por todos os navegadores (em
caso de dúvida, leias as especificações do HTML, disponível em http://www.w3.org/). Criem
aplicações visando segurança entendendo, corretamente, o sentido da palavra e não ao “pé
da letra”. Documente os produtos desenvolvidos de forma correta sem ocultar detalhes. Não
busque um código exclusivo pois computação é uma área com dinâmica muito rápida e o seu
produto cairá em desuso na mesma velocidade.
A ementa do curso foi elaborada por um bolsista do INPE. Buscou-se estabelecer uma
comparação de procedimentos e recursos entre Linux e Sistemas Windows, para evidenciar as
diferenças de abordagem de um projeto durante o seu desenvolvimento. O respaldo técnico
baseia-se na pequena experiência adquirida em 25 anos de INPE, em sistemas DOS,
Cap 1 - 3/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Windows, Linux, Solaris e (Open)VMS, quanto ao desenvolvimento de software para as
atividades do Departamento de Mecânica Espacial e Controle (DMC) do INPE.
Os assuntos não foram abordados na íntegra. Em alguns casos, quando a documentação é
farta e “amigável” sob algum ponto de vista didático, o tópico é reduzido propositalmente,
mas conterá as indicações necessárias para aperfeiçoar os conhecimentos.
Sejam bem vindos ao mundo do código livre!
OBSERVAÇÃO:
As opiniões técnicas e pessoais aqui expressas são de responsabilidade do autor. Nem o INPE
nem o Governo Federal as endossa ou assume responsabilidade sobre elas ou de ações que
delas originar.
Cap 1 - 4/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
CONCEITOS BÁSICOS SOBRE O LINUX
•
•
•
•
•
•
•
Como executar comandos sobre o Linux
Variáveis de Ambiente
Consoles Virtuais
Escolhendo um Editor de textos para escrever os fontes
Comandos básicos do Linux
Como verificar as tarefas em execução
O Envio de sinais para as tarefas
Cap 1 - 5/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
COMO EXECUTAR COMANDOS SOBRE O LINUX
A execução de comandos é feita em janela de console, ou através da aplicação gráfica de
interface para aquele comando.
Em modo texto, a janela de comandos se apresenta com um 'prompt' (sinalizador de
prontidão) que pode variar conforme o ambiente shell (interpretador de comandos) utilizado,
ou conforme especificado pelo usuário. Adotaremos o prompt do ambiente shell BASH,
configuração padrão:
[usuario@sistema diretório-corrente]$
Digita-se o comando desejado, os seus argumentos, e pressiona-se a tecla [ENTER].
No exemplo, a seguir, o usuário utvg é um usuário normal, sem privilégios:
Exemplo:
[utvg@torrinha ~]$ echo "Abacaxi"
Abacaxi
[utvg@torrinha ~]$
Se o comando estiver em diretório fora do caminho de busca (varável PATH), será necessário
incluir o caminho completo de execução.
Exemplo:
[utvg@torrinha ~]$ traceroute -n 150.163.1.139
bash: traceroute: command not found
[utvg@torrinha ~]$
onde está o comando?
[utvg@torrinha ~]$ whereis traceroute
traceroute: /usr/sbin/traceroute
[utvg@torrinha ~]$
Execute-o:
[utvg@torrinha ~]$ /usr/sbin/traceroute -n 150.163.1.139
traceroute to 150.163.1.139 (150.163.1.139), 30 hops max, 60 byte packets
1 192.168.2.254 10.560 ms 10.566 ms 10.572 ms
2 * 189.127.6.225 147.353 ms 156.519 ms
3 189.127.6.193 167.945 ms 169.506 ms 173.256 ms
4 201.12.254.21 217.731 ms 226.759 ms *
…...
15 150.163.1.139 223.428 ms 223.522 ms 224.964 ms
[utvg@torrinha ~]$
Alguns comandos só podem ser executados se o usuário tiver privilégio root (super-usuário),
como um Administrador (ou Administrator) no Windows. Os comandos executáveis sob
condições privilegiadas são, em princípio, de propriedade do usuário privilegiado com
permissão de execução exclusiva.
Cap 1 - 6/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Vejamos as propriedades da aplicação traceroute usada anteriormente.
[utvg@torrinha ~]$ ls -la /usr/sbin/traceroute
-rwsr-xr-x 1 root bin 47100 2009-09-03 05:43 /usr/sbin/traceroute*
[utvg@torrinha ~]$
Explicando ….
-rwsr-xr-x
indica que:
*******r-x
qualquer usuário pode ler (r) e executar (x)
****r-x***
qualquer usuário pertencente ao grupo proprietário pode ler (r) e executar
(x)
-rws******
o proprietário pode ler (r), escrever (w) e executar herdando alguns
privilégios especiais do super usuário (s).
1 é o número de links rígidos existentes no sistema de arquivos que apontam para aquele
arquivo.
root bin indicam o proprietário (root) e o grupo (bin).
47100 é o tamanho do arquivo em bytes
2009-09-03 05:43 é a data de criação do arquivo
/usr/sbin/traceroute é o nome completo do arquivo no sistema de arquivos e o símbolo
asterisco ( * ) no final indica que o arquivo é executável. O simbolo não faz parte do nome do
arquivo, nem das propriedades. É um mero recurso visual inserido pelo interpretador de
comandos.
Modifiquemos a propriedade de execução para ver o que acontece.... Utilize o comando
chmod.
[utvg@torrinha ~]$ chmod o=--- /usr/sbin/traceroute
chmod: changing permissions of `/usr/sbin/traceroute': Operation not permitted
[utvg@torrinha ~]$
Não foi possível realizar a operação pois o arquivo não pertence ao usuário utvg. Segundo a
política adotada naquele sistema, qualquer usuário pode ler e executar, mas não pode
escrever (sobrescrever propriedade ou o conteúdo do arquivo).
Altere a propriedade para efeito didático para -rwsr-x--- . Uma vez que o usuário utvg não é o
proprietário, a operação só terá sucesso se for realizada sob privilégios adminstrativos. Isto pode ser feito
através do comando:
[utvg@torrinha ~]$ su root -c "chmod o=--- /usr/sbin/traceroute"
Password:xxxxxxx
← senha do superusuário
[utvg@torrinha ~]$
Cap 1 - 7/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Verificando os atributos do arquivo, tem-se:
[utvg@torrinha ~]$ ls -la /usr/sbin/traceroute
-rwsr-x--- 1 root bin 47100 2009-09-03 05:43 /usr/sbin/traceroute*
[utvg@torrinha ~]$
Em seguida, executando o comando traceroute a partir do usuário utvg, obtém-se :
[utvg@torrinha ~]$ /usr/sbin/traceroute -n 150.163.1.139
bash: /usr/sbin/traceroute: Permission denied
[utvg@torrinha ~]$
Para executar uma aplicação num diretório corrente, que não está no caminho de busca.
Considere o conteudo de um diretório (abaixo) :
[utvg@torrinha Rotinas]$ ll
total 288
-rw-r--r-- 1 utvg utvg 101591
-rw-r--r-- 1 utvg utvg
2762
-rw-r--r-- 1 utvg utvg 51824
-rw-r--r-- 1 utvg utvg 116039
-rw-r--r-- 1 utvg utvg
1404
-rwxr-xr-x 1 utvg utvg
7719
-rw-r--r-- 1 utvg utvg
202
[utvg@torrinha Rotinas]$
2005-04-18
2005-04-18
2005-04-18
2005-04-14
2005-04-16
2005-04-16
2005-04-16
23:14
23:15
23:16
03:17
18:27
02:25
02:24
orba2.c
orba2.h
orba2.o
orba.c
orba.h
teste*
teste.c
Deseja-se executar a aplicação teste. Um usuário “Windows” digitaria o nome do arquivo.
Contudo, se o diretório corrente não está no caminho genérico de busca então o arquivo não
será encontrado.
[utvg@torrinha Rotinas]$ teste
bash: teste: command not found
[utvg@torrinha Rotinas]$
Ao informar ao shell para buscar no diretório corrente ( ./ ) a aplicação é executada
normalmente..
[utvg@torrinha Rotinas]$ ./teste
sizeof y=4
sizeof x[9]=72
[utvg@torrinha Rotinas]$
ALGUNS COMANDOS GNU/Linux E SUAS CORRESPONDÊNCIAS COM WINDOWS
Em GNU/Linux, assim como em sistemas UNIX, os nomes dos comandos são sensíveis ao
tamanho da caixa, enquanto no Windows não!
O comando ls lista o conteúdo de um diretório, mas o Ls ou LS ou lS podem ser comandos
diferentes ou, simplesmente, não existirem.
Cap 1 - 8/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Em GNU/Linux é possível atribuir uma sequencia de comandos ou abreviar comandos com
opções através do comando alias. Logo é possível criar um ambiente com comandos
semelhantes de um SO usando o ambiente shell e o comando alias.
FINALIDADE
WINDOWS.
Para ajuda, digite o comando
seguido de espaço e /? (ex:
dir /?)
GNU/LINUX.
Para ajuda, digite man e o
nome do comando: exemplo:
man ls.
Listar os arquivos contídos
num diretório.
DIR (comande DIR /? para as ls (use man ls para a lista de
opções)
opções)
Criar um diretório
MKDIR ou MD
mkdir
Apagar um diretório
RMDIR ou RD
rmdir
Lista o conteúdo de um
arquivo
TYPE
cat
Apagar um arquivo
DEL ou DELETE
rm
Copiar um arquivo com outro
nome ou sistema de arquivo.
COPY
cp
Criar um arquivo via linha de
comando
COPY CON nome e depois
CTRL-Z
touch nome
Usando o comando alias...
Pretende-se criar o comando TYPE com a mesma finalidade do comando WINDOWS em
GNU/Linux.
O comando 'type' tem função específica no ambiente bash. Ela mostra se um certo comando
está definido no ambiente shell, mas o comando TYPE não existe!.
[utvg@torrinha ~]$ type alias
alias is a shell builtin
[utvg@torrinha ~]$
[utvg@torrinha ~]$ type TYPE
bash: type: TYPE: not found
[utvg@torrinha ~]$
Considerando a finalidade de ler o conteúdo do arquivo testar.txt, usando o comando TYPE....
[utvg@torrinha ~]$ TYPE testar.txt
bash: TYPE: command not found
[utvg@torrinha ~]$
Ao executar o comando ...e repetindo o comando ….
[utvg@torrinha ~]$ alias TYPE=cat
[utvg@torrinha ~]$ TYPE testar.txt
Conteudo do arquivo testar.txt
[utvg@torrinha ~]$
Cap 1 - 9/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Considere uma condição onde está-se desenvolvendo uma aplicação e está-se na fase inicial
da sintaxe do código. Neste caso, sempre será executado o seguinte:
gcc -c teste.c -o teste.o
vi teste.c
Para abreviar o conjunto de comandos, que tal criar um alias para o conjunto:
alias pega=`gcc -c teste.c -o teste.o ; sleep 3 ; vi teste.c`
O sleep 3 foi inserido para que seja visto algum erro.
Após a atribuição, não será mais necessário digitar o conjunto de comandos. Bastará, apenas,
o recém criado 'pega'.
VARIÁVEIS DE AMBIENTE
O GNU/Linux explora as variáveis de ambiente pois são através delas que são passados vários
parâmetros e valores entre o ambiente shell criado para as aplicações e vice-versa.
O conjunto completo de variáveis de ambiente definidas pelo shell pode ser conhecido através
do comando set. A lista é bastante grande. Descreveremos algumas delas.
[utvg@torrinha Rotinas]$ set
ALLOW_CURDIR_IN_PATH=no
BACKSPACE=Delete
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4"
[1]="0"
mandriva-linux-gnu")
BASH_VERSION='4.0.33(2)-release'
...
[2]="33"
[3]="2"
[4]="release"
[5]="i586-
ALLOW_CURDIR_IN_PATH=no é uma variável relacionada à política adotada no sistema, para
inibir a que o diretório local faça parte do caminho de busca.
BACKSPACE=Delete diz que o efeito da tecla BACKSPACE deve apagar a letra sob o cursor. e
em seguida as variáveis do ambiente BASH_
Encontramos como a variável PATH está definida...
PATH=/bin:/usr/bin:/usr/lib/qt4/bin:/opt/real/Real
o 'prompt' de comandos...
Cap 1 - 10/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
..
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}";
A variavel USER que armazena o username o usuário e o último arquivo executado.
USER=utvg
...
_=./teste
[utvg@torrinha Rotinas]$
Todas as definições das variáveis ambientes acima podem ser modificadas. As modificações
são válidas exclusivamente para aquele ambiente shell, ou seja, são variáveis de ambientes
locais e do usuário.
Para que a definição se propague para todas as próximas sessões SHELL é necessário inserir a
definição no arquivo de configuração do shell do usuário (~/.bashrc), caso a variável deva
ficar restrita aquele usuário, ou no arquivo de configuração do sistema (ex: /etc/bashrc), ou
seja utilizado o comando export.
Na linguagem GNU/C, as variáveis de ambiente são obtidas através da função getenv (ver
man getenv).
Em Windows, é comum encontrarmos códigos que utilizam das variáveis ambientes para
estabelecerem uma comunicação entre threads. Veremos que isso só é possível em Linux se
as threads estiverem sob o mesmo processo de ambiente shell e assim mesmo com algumas
restrições.
CONSOLES VIRTUAIS
Nos antigos mainframes, o console é um terminal com entrada pelo teclado e respostas
impressas em papel. O acesso ao terminal permitia, apenas uma única sessão, como acontece
no Windows ao entrar no “modo seguro sem rede”. Com o tempo, a impressora foi substituida
por um monitor de texto.
As atribuições de um console são únicas e válidas, exclusivamente, para aquele login/sessão.
Um console virtual tem as mesmas características de um console, porém é possível ter vários
consoles virtuais operando num mesmo console real (teclado e, atualmente, monitor), mesmo
fora de um ambiente gráfico. Alias, é possível ter um ambiente gráfico em cada console
virtual, e cada um com usuário diferente.
Ao observar o arquivo /etc/inittab tem-se as linhas de configurações:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
Cap 1 - 11/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Tais linhas indicam/configuram quantos consoles virtuais são iniciados pelo sistema. man
inittab descreve cada campo com detalhes. Contudo, as linhas estão configurando 6
consoles virtuais tty1 a tty6, que são iniciados nos níveis 2345, através da aplicação
mingetty.
O acesso aos terminais virtuais é feito através das teclas [Alt][Fn] . Em modo gráfico, o
acesso é feito inserindo a tecla [Ctrl], ou seja, [Ctrl][Alt][Fn], n=1 a 6, ou conforme o número
especificado no inittab. O último valor+1 será o terminal gráfico.
Em janelas gráficas existem terminais virtuais criados através de aplicações gráficas (xterm,
konsole, etc).
ESCOLHENDO UM EDITOR DE TEXTOS PARA ESCREVER OS
FONTES
Os compiladores exigem que o código fonte seja no formato texto puro, uma vez que os
comandos seguem a tabela ASCII. Como todo código deve ser comentado e prever a
documentação on-line, sugere-se um editor de texto que permita operar em páginas de
código compatível com o gerador da documentação.
Em GNU/Linux, citam-se alguns editores :
–
emacs, kwrite, kate, gedit, wedit, nedit …..
Qual é o “recomendado” para desenvolvimento de software?
O problema não é editor, mas qual software será desenvolvido. Se a linguagem for HTML, por
exemplo, pode-se utilizar qualquer um dos editores citados, mas não não espere que aqueles
tenham ferramentas para auxiliá-lo, como encontrado no bluefish e amaya, que são
dedicados para HTML/CSS. Existem vários editores de texto puro e aqueles para fins
específicos.
Cabe ao usuário instalar o editor de texto que atende melhor a finalidade do projeto de
software. Observem ….
amaya
(1) - WYSIWYG HTML editor
atobm [bitmap]
(1) - bitmap editor and converter utilities for the X Window System
audacity
(1) - Graphical cross-platform audio editor
bitmap
(1) - bitmap editor and converter utilities for the X Window System
bluefish
(1) - editor for experienced web designers and programmers
bmtoa [bitmap]
(1)
- bitmap editor and converter utilities for the X Window
System
cooledit
(1) - 3.17.17 - Full featured text editor for the X Window System,
Version 11
cssed
(1) - A tiny GTK2 CSS editor and validator
Curses::UI::TextEditor (3pm) - Create and manipulate texteditor widgets
dotty
(1) - A Customizable Graph Editor
dune
(1) - graphical vrml97 editor and animation tool
ed
(1) - text editor
editres
(1) - a dynamic resource editor for X Toolkit applications
Cap 1 - 12/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
frozen-bubble-editor (6) - a level editor for Frozen Bubble
gedit
(1) - text editor for the GNOME Desktop
joe
(1) - Joe's Own Editor
kate
(1) - Advanced text editor for KDE
lefty
(1) - A Programmable Graphics Editor
lneato
(1) - A Customizable Graph Editor
mcedit
(1) - Internal file editor of GNU Midnight Commander
ospam
(1) - An SGML/XML markup stream editor
pdfedit
(1) - Editor for PDF files
psed
(1) - a stream editor
psed [s2p]
(1) - a stream editor
qelectrotech
(1) - Electric diagrams editor
QucsEdit [qucsedit] (1) - A simple text editor for Qucs
red [ed]
(1) - text editor
sed
(1) - stream editor for filtering and transforming text
Smalledit-3.17.17 [smalledit] (1) - Stripped down version of Cooledit - a full-featured
text editor for the X Window System
vim
(1) - Vi IMproved, a programmers text editor
Quando no ambiente gráfico KDE existem outras opções.:
kwrite,
Permite a edição de 1 arquivo por sessão, mas tem vários recursos, inclusive de scripts
criados por usuários e de plugins de edição.
Kate
permite a edição de vários arquivos e as mesmas facilidades do kwrite, compilação em
terminal local, estilos de diversas linguagens e conjuntos de caracteres (UTF8, ISO8859-1,
etc).
No ambiente gráfico GNOME há o gedit, com finalidades e recursos semelhantes ao kate (ou
vice-vesa!).
É inconcebível utilizar o OpenOFFICE (BrOffice) para gerar códigos fontes, mas não o é para
gerar a documentação.
Observem, por exemplo, um trecho com comentários extraídos código fonte do Postfix, escrito
e mantido por Wietse Venema:
/*++
/* NAME
/*
anvil 8
/* SUMMARY
/*
Postfix session count and request rate control
/* SYNOPSIS
/*
\fBanvil\fR [generic Postfix daemon options]
/* DESCRIPTION
/*
The Postfix \fBanvil\fR(8) server maintains statistics about
/*
client connection counts or client request rates. This
/*
information can be used to defend against clients that
/*
hammer a server with either too many simultaneous sessions,
/*
or with too many successive requests within a configurable
/*
time interval. This server is designed to run under control
/*
by the Postfix \fBmaster\fR(8) server.
Cap 1 - 13/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
In the following text, \fBident\fR specifies a (service,
client) combination. The exact syntax of that information
is application-dependent; the \fBanvil\fR(8) server does
not care.
CONNECTION COUNT/RATE CONTROL
.ad
.fi
To register a new connection send the following request to
the \fBanvil\fR(8) server:
.nf
\fBrequest=connect\fR
\fBident=\fIstring\fR
O mesmo trecho após a execução de srctoman, um aplicativo também criado pelo autor, com
poucas linhas de código, através do comando man 8 anvil, é mostrado na figura 1. Na Figur
2 tem-se seguida o mesmo trecho em HTML, criado a partir da aplicação man2html daquele
mesmo autor.
A aplicação srcman, que converte de código fonte para um arquivo compatível com o man,
contém 203 linhas, das quais somente 106 correspondem ao código ativo.
A aplicação man2html contém, apenas, 37 linhas de código efetivo.
Assim é em GNU/Linux. Criar a sua ferramenta é, as vezes, muito mais rápido que instalar,
aprender a usar, compilar e estudar a documentação.
Existe “geradores de documentação” bastante eficientes que estilos sofisticados. É o caso, por
exemplo, do doxygen.
Cap 1 - 14/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
COMANDOS BÁSICOS DO LINUX
Acreditem! Com apenas 3 comandos é possível descobrir os outros 5 mil (com exagero e
tudo!!).
São eles: man, apropos e info.
A única condição para ativá-los é a instalação dos pacotes info e man-pages, disponíveis em
todas as distribuições GNU/Linux. As documentações individuais dos pacotes e aplicações
complementam os pacotes anteriores com mais detalhes.
Algum filósofo, no passado (não sei quem foi!), conseguiu definir como aprender um assunto
qualquer: “A busca do conhecimento está na pergunta a fazer e não na sua resposta”. É
Cap 1 - 15/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
exatamente isto que o apropos permite. Qual é o assunto?
As opções serão proporcionais ao número de pacotes de documentação instalados.
Considere um assunto qualquer. Exemplos: desenvolvimento (em inglês: development), rede
(network), segurança (security). Experimente uma das palavras chaves citadas e comande:
apropos palavra-chave
apropos network [ENTER]
Eis 11 tópicos obtidos num sistema com vários pacotes instalados:
[utvg@zedelho ~]$ apropos network
aseqnet
(1) - ALSA sequencer connectors over network
avahi-autoipd
(8) - IPv4LL network address configuration daemon
dhclient-script
(8) - DHCP client network configuration script
dumpcap
(1) - Dump network traffic
dund
(1) - BlueZ Bluetooth dial-up networking daemon
endhostent [gethostbyname] (3) - get network host entry
endnetent [getnetent] (3) - get network entry
endnetgrent [setnetgrent] (3) - handle network group entries
freeaddrinfo [getaddrinfo] (3) - network address and service translation
freehostent [getipnodebyname] (3) - get network hostnames and addresses
Assuma que o tópico (instalado) de seu interesse seha o dumpcap
man dumpcap
E, voi lá!
DUMPCAP(1)
The Wireshark Network Analyzer
DUMPCAP(1)
NAME
dumpcap - Dump network traffic
SYNOPSIS
dumpcap [ -a <capture autostop condition> ] ... [ -b <capture ring buffer option>] ...
[ -B <capture buffer size (Win32 only)> ] [ -c <capture packet count> ] [ -D ]
[ -f <capture filter> ] [ -h ] [ -i <capture interface>|- ] [ -L ] [ -n ] [ -M ] [ -p ]
[ -s <capture snaplen> ] [ -S ] [ -v ] [ -w <outfile> ] [ -y <capture link type> ]
DESCRIPTION
Dumpcap is a network traffic dump tool. It lets you capture packet data from a live network
and write the packets to a file. Dumpcap's native capture file format is libpcap format,
which is also the format used by Wireshark, tcpdump and various other tools. When the -n
option is specified, the output file is written in the new pcapng format.
finalidade, os argumentos, etc...
(a informação foi truncada propositalmente).
Os comandos GNU/Linux instalados podem ser obtidos e conhecidos através destes 3
comandos básicos.
Tente! Qual ou quais comandos podem ser utilizados para listar um diretório? E para criar um
Cap 1 - 16/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
diretório? Apagar um arquivo? Apagar um diretório? Modificar o proprietário de um arquivo?
Modificar o atributo de execução de um arquivo?
Uma das características interessantes do GNU/Linux é a facilidade de execução em pipes, ou
seja, executar um comando tendo a sua saída utilizada como entrada para outro comando.
Ao executar o comando apropos directory (por exemplo), ter-se-á uma lista imensa de
possíveis comandos, funções de sistema, etc. Aplicações utilizadas para filtragem são grep e
awk.
Considere que NÃO seja de interesse os comandos em baseados em Tcl. Para excluí-los da
“apresentação”, basta completar o comando inicial para que os resultados passem por um
pipe de filtragem usando o grep (veja man grep), na forma:
apropos directory | grep -v Tcl
Como estão percebendo, o GNU/Linux é muito rico em recursos e permite que o usuário saiba
o que ele quer e na forma que ele deseja e não o que o sistema operacional deixa que o
usuário saiba.
OS INTERPRETADORES DE COMANDOS NO GNU/LINUX:
A aplicação de um SO responsável pela busca e execução de comandos e aplicações é
denominado Interpretador de Comandos.
Um interpretador contém um conjunto de atividades pré-definidas e podem executar
aplicações auxiliares (ou comandos auxiliares) armazenados no sistema de arquivos. O
ambiente criado por um Interpretador tem o nome de Ambiente Shell. Em GNU/Linux o jargão
“shell” se refere a um ambiente qualquer.
Ao contrário do Windows, que contém apenas um ambiente de comando de texto e uma
extensão denominada PowerShell (não entendo o porquê do Power!), o GNU/Linux pode atuar
com vários Interpretadores de Comandos (bash, ash, zsh, csh, etc.) por um ou mais
usuários, ou mesmo por um mesmo usuário.
Um interpretador pode ser chamado dentro de outro, permitindo, assim, explorar os recursos
disponíveis de um interpretador em outro.
Assim como uma aplicação atende a uma finalidade, os interpretadores foram feitos para
proporcionarem um conjunto de ferramentas pré-definidas adequadas para condições
específicas. Considere, por exemplo, que se deseja testar uma aplicação servidora TCP/IP
sofisticada, tipo caixa preta. Você, desenvolvedor, ainda não sabe as reações da aplicação aos
comandos enviados à ela. O desenvolvedor tem a opção de utilizar algumas ferramentas
prontas para a análise, contudo, esteja preparado para as suas limitações. No ambiente zsh,
existem funções pré-definidas e programáveis em tempo de execução. (veja man
zshtcpsys).
Por outro lado, caso queira manipular strings, o interpretador zsh já não é “o mais fácil” (isso
Cap 1 - 17/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
não quer dizer incompleto!). Sob este aspecto, os Interpretadores bash e csh são mais
flexíveis e apresentam uma sintaxe mais amigável (Isso é um ponto de vista! Assim como
existem usuários que gostam dos comandos limitados do Windows outros gostam da sintaxe
rígida de um 'sed').
Assim, a resposta de “QUAL INTERPRETADOR USAR?” não é única.
Ao executar um comando (ou nome de aplicação), o shell busca aquele comando
internamente (comandos pré-definidos) e, caso não o encontre, ele buscará o comando ao
longo dos diretórios definidos na variável ambiente PATH. Isto é um padrão POSIX. Tanto o
GNU/Linux quanto o Windows tentam seguir tal padrão em suas implementações.
COMO VERIFICAR AS TAREFAS EM EXECUÇÃO
Há várias aplicações e comandos que mostram as tarefas em execução. Todas as tarefas em
execução estão registradas no diretório /proc . Então, a dúvida é, na verdade, qual aplicação
mostra de forma “amigável” as aplicações em execução.
Vejamos se o que foi visto até o momento é aplicável. Tarefas => task, logo, apropos task.
Em meu sistema, ao comandar apropos task obtenho:
[utvg@torrinha ~]$ apropos task
taskset
(1) - retrieve or set a process's CPU affinity
top
(1) - display Linux tasks
[utvg@torrinha ~]$
Então, a finalidade mais próxima é o top
Como funciona?
TOP(1)
Linux User's Manual
TOP(1)
NAME
top - display Linux tasks
SYNOPSIS
top -hv | -bcHisS -d delay -n iterations -p pid [, pid ...]
The traditional switches '-' and whitespace are optional.
DESCRIPTION
The top program provides a dynamic real-time view of a running system. It can display system summary information as well as a list of tasks currently being managed by the Linux ker----------8<--------------
Mas, conceitualmente, uma tarefa pode ser executada em processos (process) e em threads
(thread). (Obs: tais definições serão vistas oportunamente)... Assim, também devemos
observar as respostas de apropos process e apropos threads.
Assumindo um impulso exageradamente Windows, a pergunta poderia ser “Onde está o ícone
da barra do painel de controle que mostra as tarefas?” Hummm! É a aplicação gráfica? Se o
KDE está instalado, há uma ferramenta denominada ”System Monitor”, cujo nome da
Cap 1 - 18/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
aplicação é ksysguard (Figura 3)
Na linha de comandos, pode ser top, ou ps (para processos Linux), ou fuser (para listar os
processo que usam um determinado arquivo ou socket), jps (para processos em execução
pela máquina virtual Java), e o lsof, para conhecer os arquivos abertos por aplicações (Em
Unix TUDO é arquivo!).
Este é o grande “problema” do GNU/Linux. Você precisa saber o que quer para saber o que
procurar. O objetivo não é criar polêmica, mas o aplicativo do Task-Manager do Windows NÃO
mostra todas as tarefas em execução. Quer um exemplo? Instale o PVIEW no Windows. A
quantidade de threads é bem maior que aquelas mostradas no Task-Manager. O PVIEW é tido
como uma “Ferramenta de Desenvolvimento” e, segundo o fabricante daquele Sistema
Operacional, as informações fornecidas pelo produto não são de interesse de um usuário
“normal”. (Os desenvolvedores e administradores de sistemas são “anormais”? Eles acreditam
que sim...).
COMO ENVIAR SINAIS PARA OS PROCESSOS
A resposta é obtida aplicando a mesma técnica anterior...... apropos signal e encontra-se
kill. Agora é só procurar os detalhes (opções) do comando via man kill.
É interessante entender o que significam os sinais, que são diversos: HUP, TERM, etc. O
arquivo /usr/include/asm-generic/siginfo.h contém informações das finalidades dos vários
sinais.
Mas onde consegui tal informação? No apropos e depois no 'man kill'.
Cap 1 - 19/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Em man kill, após cometer o pecado da leitura, encontrei, em OPTIONS
-l
Print a list of signal names.
These are found in /usr/include/linux/signal.h
Foi só listar o conteúdo do arquivo /usr/include/linux/signal.h e ler os arquivos apontados
nele. Tão simples quanto um “beijo”, certo? Em Ingles fica mais simpático.... “as simple as a
KISS, but K.I.S.S. as it is!”
Lendo os conteúdos foi possível concluir que:
kill -9 PID encerra um processo em execução. kill -9 é equivalente a kill -SIGKILL .
Uma aplicação pode ser programada para desativar a ação de certos sinais para proteger os
recursos ocupados por ela ou para não ser interrompida quando em condição crítica. Uma
aplicação que trata da aquisição de dados, por exemplo, deve interceptar os sinais, tomar a
ação de desbloqueio dos recursos, encerrar processos secundários ou de baixo nível, etc,
antes que termine. Caso contrário o periférico ou dispositivo pode entrar em estados de
calibração (exemplo: giros, rodas e acelerômetros), que somente devem ser interrompidos
em condições especiais.
Exemplos “terroristas”
1) Crie um arquivo, de nome CursoLinux, sem usar qualquer editor e com um único
comando no modo console.
2) Inserir o texto entre colchetes [echo “Isso sera impresso em tela”] no arquivo criado
em 1
3) Executar o arquivo criado em 1
4) Criar um diretório onde somente o autor tenha acesso (exceto o super usuário root)
5) copiar o arquivo criado em 1 para o diretório criado em 4.
6) remover o arquivo criado em 1
7) remover o diretório e arquivo criados em 4 e 5
Cap 1 - 20/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
AS SUAS ANOTAÇÕES
Cap 1 - 21/22
PROGRAMAÇÃO EM LINUX
Usuário Avançado
Ulisses Thadeu V Guedes
Cap 1 - 22/22