next up previous
Next: Problemas e Dicas Up: FMA 215 Aula 6: Previous: Pipeline:

Tarefas

Este conjunto de tarefas deve ser realizado no sistema de janelas X11, o que irá possibilitar o uso de âncoras visuais que facilitarão a compreensão dos elementos com os quais vamos lidar.

Para trabalhar com este tipo de interface gráfica, é necessário lembrar que existe nele o conceito de foco, como já vimos na aula anterior: a janela que tem o foco é aquela que recebe o que se digita no teclado. Para colocar o foco em uma determinada janela, a melhor forma é clicar o botão esquerdo do mouse na parte central da barra superior da janela, o que também a colocará acima de outras janelas que a estejam cobrindo parcialmente.

Às vezes pode ser necessário também movimentar uma janela para que ela fique mais visível. Para fazer isto, basta clicar e segurar o botão esquerdo do mouse sobre a parte central da barra superior da janela e movimentar o mouse, que carregará a janela consigo. A nova posição da janela será aquela na qual o botão do mouse for solto. Neste momento ela terá também o foco, ou seja, estará recebendo o input do teclado.

  1. Faça um login no sistema, usando o sistema de janelas X11. Caso o computador esteja com o Linux rodando mas a bandeira de login do sistema X11 não esteja visível, digite [Ctrl]-[Alt]-F7. Isto o levará de qualquer dos consoles virtuais para o sétimo, onde em geral estará rodando o sistema X11.

  2. Quando você entrar, será aberto para você um terminal xterm, que aparecerá como uma janela em algum lugar da tela. Esta janela tem um papel especial em sua seção, se ela for eliminada toda a seção terminará e o X11 será reciclado, aparecendo novamente a bandeira de login. Para evitar que você termine sua seção acidentalmente, vamos evitar usar esta janela por enquanto.

    Abra duas outras janelas xterm para uso nestas tarefas. Para fazer isto, clique e segure o botão esquerdo do mouse sobre o fundo da tela. Aparecerá um menu, o primeiro ítem do qual abre um novo terminal. Leve o cursor do mouse para cima deste primeiro ítem e solte o botão da esquerda, o que causará o aparecimento de uma nova janela de terminal.

    Tendo aberto os dois novos terminais, iconize o terminal original, clicando o botão esquerdo do mouse no botão que contem um pequeno quadradinho, o penúltimo à direita na barra superior da janela. Organize os dois novos terminais na tela, mudando suas posições, até que se tenha boa visibilidade de ambas as janelas e que seja possível passar o foco facilmente de uma para a outra.

  3. Execute, em uma das duas janelas, o comando ps. Você consegue reconhecer cada um dos processos que estão rodando e identificar a que janelas cada um está associado?

  4. Execute, na outra janela, o comando xclock. Vai aparecer em sua tela um relógio. Observe que o terminal fica ``preso'', não responde mais ao seu input no teclado, não mostra mais o prompt quando você aperta a tecla [Enter]. Olhe os processos de novo, no outro terminal.

  5. Coloque o foco no terminal onde você está rodando o relógio e digite [Ctrl]-C. Isto significa segurar a tecla [Ctrl] (control) enquanto você digita uma vez a tecla da letra C (ou c). Apesar de que em geral indicamos este tipo de coisa usando letras maiúsculas, não se deve apertar a tecla [Shift]. Caso isto seja necessário estará indicado explicitamente. Observe o que acontece com o relógio. Verifique a situação dos processos no outro terminal.

  6. Execute mais uma vez, na mesma janela que usou antes, o comando xclock. Para desconectar o seu terminal do processo que foi iniciado, digite a combinação [Ctrl]-Z. Trata-se de um caracter de controle que faz com que um sinal seja enviado pela shell ao processo, provocando a sua suspensão temporária. Observe que você ganha de volta o acesso de input à janela. Verifique a situação dos processos no outro terminal.

  7. Voltando ao terminal onde está rodando o xclock, execute o comando jobs. Ele irá mostrar todos os processos que estão sendo administrados pela shell que está rodando neste terminal. Examine o output do comando e veja se dá para entender o que aparece lá.

  8. É possível rodar um programa de forma que ele já se inicie sem conexão com o terminal. Para fazer isto, na mesma janela que está usando para rodar o primeiro relógio, rode um segundo relógio usando o comando xclock &. Observe que desta vez o seu terminal ficou livre para outras tarefas.

  9. Execute de novo o comando jobs e examine o resultado. Verifique a situação dos processos no outro terminal. Observe os dois relógios durante alguns minutos e verifique o que acontece com eles. Você sabe porquê os dois se comportam de forma diferente?

  10. Para por para rodar de fato o job que está suspenso no background, como indicado no output do comando jobs, basta executar o comando bg %<número-do-job>. O número do job é o que aparece entre chaves no output do comando jobs. Execute de novo este comando, examine o resultado e verifique a situação dos processos no outro terminal. Espere mais alguns minutos e verifique como se comportam os relógios agora.

    Um processo estar no ``background'' significa que ele está rodando sob a administração da shell, sem, entretanto, que o sistema de input da sua sessão esteja ligado permanentemente a ele. Dizemos que um processo que esteja sendo rodado pela shell e que esteja ligado ao input do teclado está rodando no ``foreground''.

  11. Execute o comando jobs -l, que irá listar os números de identificação (PID) dos processos associados a cada um dos jobs. No outro terminal, olhe os processos com o comando ps, identificando aquele que corresponde ao primeiro job. Em seguida, elimine este processo usando o comando kill <número-do-processo>. O número do processo aparece tanto no output do comando jobs -l quanto no do comando ps. O que acontece com o relógio? Olhe de novo os processos e execute de novo o comando jobs no outro terminal.

  12. Observe que, ao contrário do comando ps, o comando jobs dá resultados que são específicos da shell sob a qual está rodando. O comando jobs não é um programa como o comando ps, que está num arquivo que a shell lê e roda. Ele é o que chamamos de um ``comando intrínseco'' da shell, ou um ``shell built-in'', um comando interno do programa que chamamos de ``shell''. Em cada tipo de shell existe um número relativamente pequeno de comandos deste tipo. Execute o comando jobs em ambos os terminais e verifique a diferença nos outputs de cada um.

  13. Para reconectar um job ao seu terminal, você executa o comando fg %<número-do-job>. Faça isto com o segundo relógio. Observe que o seu terminal ficou preso de novo. Você pode colocar ele no background de novo digitando [Ctrl]-Z. Para reconectar o job mais uma vez ao seu terminal, basta dar agora o comando fg sem argumento. Havendo apenas um job, todos os comandos de controle de jobs vão se aplicar a ele de forma automática. Elimine o segundo relógio usando [Ctrl]-C ou o comando kill.

  14. Num dos dois terminais que você abriu, rode o comando ps com as opções a, u e x, ou seja, use o comando da forma ps aux. O comando ps tem a peculiaridade de não exigir (na verdade, de não querer) os sinais de - antes das opções. Se você os colocar, ele entende o input e executa corretamente, mas dá um aviso de ``deprecated'', o que significa que um dia ele vai parar de aceitar esta forma de se colocar as opções. Em geral, com ou sem os sinais de -, quando um comando é submetido com várias opções, você pode juntar as opções, ou seja, em nosso caso ps aux é equivalente a ps a u x.

    Esta forma do comando vai colocar na tela uma lista de todos os processos que estão rodando no sistema. A opção a significa ``all'', ou seja, não apenas os seus processos, mas também os de outros usuários. A opção u faz com que o comando mostre o usuário ao qual pertence cada processo. A opção x inclui na lista os processos que não estejam conectados a um terminal. Caso você queira descobrir mais sobre este comando, olhe a sua página do manual, executando man ps.

    Provavelmente você vai descobrir que a lista que aparece não cabe toda no seu terminal. Em geral há um número considerável de processos rodando em qualquer sistema, mesmo quando ele não está fazendo nada particularmente notável. A maior parte destes processos é do usuário root, o que indica que se trata de processos internos do sistema ou de serviços mantidos pelo sistema, que não pertencem a nenhum usuário em particular.

  15. Para poder olhar toda a lista de processos de uma forma controlada, vamos agora usar o conceito de pipeline de comandos, que é um dos conceitos importantes do sistema. Desta forma, redirecionamos o output do comando ps aux, que é uma lista um tanto longa, para o input de um outro programa, um paginador como o programa more, que nos permita olhar uma página de cada vez. Faça isto, executando a pipeline ps aux | more, passando de cada página para a seguinte com a barra de espaço do teclado, ou indo de linha em linha com a tecla [Enter].

  16. O comando more também pode ser usado diretamente para paginar um arquivo qualquer. Use-o da forma more /etc/passwd para verificar este fato. Tente também ypcat passwd | more, caso o seu sistema esteja rodando o sub-sistema NIS (Network Information Service, vamos ver isto mais tarde). Alguns comandos e programas já paginam o seu output de forma automática como, por exemplo, o comando man. Execute o comando man more para verificar este fato.

    O comando man não tem um código de paginação interno. Em vez disso, ele está fazendo, internamente, uma pipeline e usando um programa de paginação. Note como, desta forma, economiza-se muita repetição de programação no sistema. Podemos ter dois ou três programas diferentes de paginação, mas não é necessário repetir todo o código de paginação em cada programa que necessitar deste tipo de ação sobre os dados de saída.

  17. O comando ps nos permite olhar os processos do sistema num determinado momento. Há também uma utilidade, chamada top, que nos permite monitorar os processos de forma mais detalhada, pois ele fica rodando, atualizando o seu output a intervalos regulares, mostrando os processos em ordem decrescente de tempo de CPU utilizado por cada um. Ou seja, ele nos mostra os processos mais ativos do sistema por ordem decrescente de atividade. Desta forma, ele nos dá uma boa idéia de como está a carga de processos no sistema. Execute este aplicativo em um dos dois terminais que você abriu, digitando top. Observe durante algum tempo o output que aparece na tela.

  18. No outro terminal, vamos rodar um programa que vai consumir uma grande quantidade de tempo de CPU, para ver o que acontece no output do comando top. Execute no outro terminal o comando cat /dev/zero > /dev/null. Como o arquivo /dev/zero não é de fato um arquivo comum e sim uma conexão com o gerador de zeros binários do kernel, este comando vai usar muito tempo de CPU. O resultado de toda esta atividade é uma grande quantidade de zeros, que vão ser descartados, pois o output está re-direcionado para /dev/null.

    Não se recomenda rodar algo assim durante a operação normal do sistema, pois trata-se de um exemplo paradigmático de atividade 100 % ineficiente, que vai consumir grande quantidades de recursos do sistema com absolutamente nenhum resultado. Observe o output do comando top que está rodando no outro terminal durante algum tempo. Depois disto, interrompa o processo que você está rodando neste terminal, digitando [Ctrl]-C. Volte a observar mais um pouco o output na outra janela.

  19. Termine o comando top digitando a letra q no terminal onde ele está rodando. O comando top também pode ser rodado num terminal comum, fora do sistema de janelas X11. Para fazer isto, é necessário que você faça um novo login no sistema, em um dos consoles de caracteres. Ao fazer isto, não saia da sua seção X11, você vai passar a ter duas seções independentes no sistema, uma no X11 e outra num console de caracteres.

    Para fazer isto, digite [Ctrl]-[Alt]-F1, o que o levará para o primeiro console virtual, que é o terminal tty1 do sistema. Faça um login neste terminal. Este console é agora um novo terminal de acesso ao sistema, onde está rodando mais uma shell pertencente a você. Rode o comando top neste terminal. Verifique que ele funciona exatamente como você já viu antes ao rodá-lo dentro do sistema de janelas X11.

  20. Deixe o top rodando no primeiro console e volte ao sistema X11, digitando [Alt]-F7 (ou [Ctrl]-[Alt]-F7, tanto faz, quando você está executando isto fora do sistema X11). Execute o comando ps dentro de uma das duas janelas de terminal que ainda estão lá. Você consegue identificar os processos que se referem à sua outra seção? Mate o processo do comando top com o comando kill e volte ao primeiro console para verificar o que aconteceu. Termine sua seção no console executando o comando exit. Observe a bandeira de login do terminal de caracteres voltar a aparecer e depois volte ao X11.

  21. Existe outra forma de se executar um processo, que às vezes é útil. Trata-se do uso do comando exec, que é outro ``built-in'' da shell. Para usar este comando, basta executar exec <programa>. Quando executamos programas usando este comando, a shell comete um tipo de suicídio: em vez de rodar o programa como um novo processo, ela roda o programa em lugar dela mesma e morre. Para testar isto, execute o comando exec top em um dos dois terminais que você tem no sistema X11. Em seguida, digite neste mesmo terminal a letra q para terminar o top e veja o que acontece.

  22. Isto sugere que qualquer programa que rode num terminal de caracteres pode ser rodado dentro do sistema X11 através do uso de um terminal e de uma operação do tipo que é realizada pelo comando exec. De fato, o comando xterm tem uma opção que permite exatamente este tipo de uso.

    Normalmente, quando se executa o xterm, uma shell é iniciada dentro dele, para que o terminal possa ser usado para a interação com o sistema. Verifique isto executando o comando xterm &. Você agora voltou a ter duas janelas de terminal disponíveis. Execute agora o comando xterm -e top &, em qualquer das duas janelas de terminal. A opção -e <programa> troca a shell pelo programa discriminado. Verifique que aparece mais uma janela de terminal rodando o top dentro. Digite q nesta nova janela e veja o que acontece.

  23. Você acaba de fabricar um aplicativo X11 a partir de um aplicativo para terminais de caracteres, que poderíamos até chamar de xtop! Com isto, podemos associar a um botão do sistema de janelas qualquer comando, mesmo que ele rode apenas em terminais de caracteres.

  24. Saia da sua seção X11. Para isto, de-iconize a janela de terminal que apareceu originalmente quando você entrou. Dependendo de como estiver configurado o sistema de gerenciamento de janelas você estiver usando, o ícone que representa aquela janela pode estar dentro de uma caixa, um gerenciador de ícones, ou em qualquer lugar da tela. Nestas notas estaremos assumindo que você está usando o gerenciador fvwm, configurado de uma certa forma padronizada.

    Caso o gerenciador de ícones esteja sendo usado, basta clicar uma vez o botão esquerdo do mouse em cima do botão que representa a janela. Caso contrário, basta dar um double-click, ou seja, clicar rapidamente duas vezes com o botão esquerdo do mouse, em cima do ícone que representa a janela, o qual pode estar em qualquer lugar da tela.

    Uma vez aberta a janela, execute o comando exit nela para terminar a sua seção. Sempre que abandonar um terminal, verifique que você fechou todas as seções que tiver iniciado nele, tanto no X11 quando nos consoles de caracteres, caso contrário sua conta estará aberta e sem proteção, à mercê de qualquer um que tenha acesso ao terminal.


next up previous
Next: Problemas e Dicas Up: FMA 215 Aula 6: Previous: Pipeline: