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