LEIC/LERC 2011/12
Sistemas Operativos
Aula 2
Processos Unix
Objectivo
- Utilização dos comandos Unix para gestão de processos.
- Familiarização com as funções sistema para criação de processos: fork, exec, wait.
Introdução
1. Observação dos processos no sistema (slide)
Execute o comando seguinte:
ps -lA
Compreenda o resultado e responda às questões seguintes. Use as páginas do manual como ajuda (man ps).
a) Que processos observa?
b) Que aplicação o processo está a executar?
c) O que significam as colunas PID e PPID?
d) Identifique três processos relacionados hierarquicamente.
2. Principais chamadas sistema para criação de processos
Copie o ficheiro aula2-eg1.tgz para a sua área de trabalho e descomprima o seu conteúdo com o comando:
tar -zxvf aula2-eg1.tgz
a) Estude o código fonte com a ajuda do slide, compile e execute a aplicação.
b) Confirme que se trata realmente de dois processos em execução:
- Adicione a instrução sleep(20) no final da função main (estude a página do manual: man -S3 sleep).
- Recompile, execute a aplicação e, noutra consola, observe os dois processos com: ps -lu <username>.
- Confirme o PID e PPID produzidos pelo output do programa.
- No fim do teste remova a instrução sleep(20).
c) Modifique o código para que o processo pai espere pela terminação do processo filho (slide).
d) Verifique que o pai espera realmente pelo filho:
- Adicione a instrução getchar() na função executada pelo processo filho.
- Recompile e execute a aplicação. Explique o que acontece ao pressionar Enter.
- Remova a instrução getchar().
e) Verifique o que acontece se o pai não esperar pelo filho:
- Adicione a instrução getchar() na função executada pelo pai, antes da chamada à função wait().
- Recompile e execute a aplicação sem introduzir um caracter.
- Abra outro terminal e execute o comando ps -lu <username>. Explique a lista de processos existentes.
- Introduza um caracter de modo a que o processo pai execute a função wait.
- Execute novamente o comando ps -lu <username>. Explique a nova lista de processos existentes.
- Remova a instrução getchar().
f) Modifique o programa de acordo com o slide.
- Recompile e execute a aplicação. Compreenda o output produzido.
- Qual a utilidade da função execl? Explique os argumentos usados no execl do exemplo.
g) Modifique o programa anterior para que o comando seja executado com a opção -b.
Material de Apoio
Exercícios
SO Shell (sosh)
Uma shell é uma aplicação que lê os comandos introduzidos pelo utilizador numa consola e os executa de acordo com uma semântica própria, como por exemplo bash e ksh. O exercício consiste em desenvolver um interpretador de comandos muito simples chamado sosh. A construção do interpretador será feito por etapas (sugestão: crie cópias de segurança sucessivas entre versões).
1. Implemente a sosh 0.1 suportando os seguintes requisitos:
- está em loop a servir comandos introduzidos pelo utilizador;
- reconhece o comando quem que serve executando o comando Unix who num processo independente;
- o processo pai deve esperar pelo processo filho;
- a aplicação termina com Ctrl-C.
2. Implemente a sosh 0.2:
- Suportar os seguintes comandos introduzidos pelo utilizador:
- quem - executa o comando Unix who.
- psu - lista os processos em execução do utilizador.
- help - lista os comandos suportados.
- exit - sai da shell.
Sugestões:
- Se utilizar a versão execlp, não é necessário indicar o caminho absoluto do comando desde que este se encontre na variável de ambiente PATH.
- Utilize o ddd como ajuda para identificar se a leitura e parsing dos comandos de entrada são feitos correctamente.
3. Implemente a sosh 0.3.
a) Além dos comandos anteriores, a nova versão deve permitir executar as aplicações localizadas em /usr/bin, com número variável de argumentos.
Sugestões:
- Faça parsing da linha de comandos utilizando o strtok (exemplo strtok.c).
- Utilize a variante execv para suportar argumentos variados (exemplo execv.c).
b) Organize o código da aplicação colocando a implementação dos comandos da sosh num módulo (.h e .c) independente:
- Adopte o ficheiro cmds.h e coloque a implementação respectiva no ficheiro cmds.c.
- O programa principal deve encontrar-se no ficheiro sosh.c.
- Adopte esta Makefile para suportar regras implícitas. Compreenda como funcionam as regras implícitas.
Exercício de Avaliação 2
Interpretador de Comandos mysh (My Shell)
Além das funcionalidades suportadas pelo sosh 0.3, a mysh deve suportar ainda o seguinte comando:
- estatistica - lista todos os comandos já executados colocando à frente de cada comando o número de vezes que foi executado.
- Outro requisitos:
- Utilize a chamada de sistema fork aquando da execucao dos comandos.
- Utilize uma lista dinâmica para armazenar a estrutura de dados com a strings e a informação sobre o número de vezes que o comando foi executado (pode modificar a lista de inteiros da primeira aula).
- Adicione o código fonte da lista como ficheiros independentes (.h e .c) e actualize a Makefile.