1. Observação dos processos no sistema (slide)
Execute o comando seguinte:ps -lACompreenda 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çãomain
(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çãowait()
.- 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 noexecl
do exemplo.g) Modifique o programa anterior para que o comando seja executado com a opção
-b
.
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:
quem
que serve executando o comando
Unix who
num processo independente;
2. Implemente a sosh 0.2:
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:
execlp
, não é necessário indicar o caminho
absoluto do comando desde que este se encontre na variável de ambiente
PATH.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:
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: