Sistemas de Operação
Aula Prática 2: Criação de Processos
Esta aula tem por objectivo familiarizá-lo com as operações
básicas de manipulação de processos em ambientes UNIX: criação,
terminação, relação com outros processos, o estado do processo, etc.
Para tal, deverá implementar pequenos programas que respondam aos
requisitos de cada uma das tarefas que se seguem. Para obter mais
informação sobre as funções de sistema referidas, consulte as
man-pages correspondentes.
- Identificar o processo: o programa deve imprimir o
PID, o PPID e UID do processo que executa o programa. Funções a ter
em conta: getpid, getppid e getuid.
- Criar um novo processo: o programa deve criar um processo
filho e ambos os processos (pai e filho) devem calcular e escrever
os números de Fibonacci entre 20 e 30. Funções a ter em conta:
fork.
- Criar uma descendência directa de N processos: o programa
deve criar N processos filho do processo original. Cada processo
filho deve escrever o seu PID e o PID do processo pai.
- Criar uma série de N processos: o programa deve criar uma
série de N processos, em que cada processo p cria o processo
p+1. Por exemplo, para N=4, o 1º processo da série cria o
2º, o 2º cria o 3º e o 3º cria o 4º. Cada processo deve escrever o
seu PID e o PID do processo pai.
- Sincronizar processos: o programa deve criar um processo
filho que calcula o número de Fibonacci de ordem 10 e que termina
enviando esse cálculo como sinal ao processo pai. O processo pai
deve esperar que o processo filho termine, apanhar o sinal enviado
e escreve-lo. Funções a ter em conta: exit e
wait.
- Criar um processo para executar um dado comando: o programa
deve criar um processo filho para executar o comando ls
-l. Funções a ter em conta: família de funções exec.
- Criar um processo zombie: o programa deve criar um
processo filho que termina de imediato. O processo pai deve
adormecer durante 10 segundos e só depois terminar. Enquanto o
processo pai está adormecido abra uma nova shell e execute o
comando ps -e -o pid,ppid,stat,cmd de modo a verificar o
estado do processo filho. Funções a ter em conta: sleep.
- Criar processos em background (se executarem indefinidamente
chamam-se daemons): o programa deve criar um processo
filho que vai executar em background o cálculo do Fibonacci de
ordem 40 e escreve o resultado para um ficheiro fib. O
processo pai deve adormecer durante 10 segundos e só depois
terminar. De modo a verificar se o processo filho se tornou
independente do processo pai, termine a shell respectiva
enquanto o processo pai está adormecido e verifique se o ficheiro
fib contém o resultado esperado. Funções a ter em conta:
setsid, open, write e close.
- Criar um biff (programa que sinaliza a chegada de
correio): supondo que o seu correio aparece num ficheiro na sua
área e com o seu nome, o programa deve verificar da existência do
ficheiro no caminho indicado, e caso exista deve emitir um beep
(caracter '\a'). Se o ficheiro não existe não faz nada. O programa
deve executar indefinidamente em background (daemon) e
verificar da existência do ficheiro a cada 10 segundos.
Atenção: não se esqueça de eliminar os processos em
background. Use ps para descobrir o PID dos processos
em background, e depois use kill -9 seguido dos PID
encontrados para os eliminar.