trabalho2: Processos no sistema operacional. 1) crie um arquivo no islenefs chamado ifs_fork que implemente a chamada fork(). 1.a Ao escrever "process" no arquivo, o processo atual deve criar um novo processo. 1.b Ao escrever "thread" no arquivo, o processo atual deve criar uma nova thread. 1.c Ao ler do arquivo, deve-se retornar os mesmos valores que a chamada fork() retornaria. O retorno deve ser referente à ultima chamada executada _neste file descriptor_. Note também que o valor de retorno deve estar disponível, ainda que diferente, tanto para o processo pai quanto filho através de seu file descriptor. Nota: Caso hajam várias escritas em seqüência, apenas a última estará disponível Nota2: Leituras que aconteçam antes da escrita devem retornar EAGAIN. Pergunta: O que acontece se um filho recém criado faz uma nova escrita no mesmo file descriptor antes que o pai leia o seu valor de retorno? Como você faria para resolver este problema? (Você _não precisa_ resolver esse problema) Você pode utilizar a chamada clone(2). 2) utilizando a chamada do item 1, crie uma estrutura de _processos_ como se segue: Pai / | \ A B C / \ D E Faça com que "Pai" retorne, mantendo todos os outros em um loop infinito. Em seguida, escreva um tratador de sinais para o sinal SIGUSR1. Esse tratador deve conter o seguinte comando: printf("eu (%d) informo: meu pai eh %d\n", getpid(), getppid()); 3) Adicione um arquivo chamado ifs_prctl no islenefs. 3.a Ao escrever "reparent yyy", onde "yyy" é um pid, yyy deve se tornar o novo Pai. Se yyy não for um processo da hierarquia, retornar ESRCH. 3.b Ao escrever "reap yyy", onde "yyy" é um pid em estado zumbi, deve limpar a área de memória associada ao processo. Se o processo não for zumbi, retornar EBUSY. O último passo de 3.a. e 3.b. deve ser: enviar o sinal SIGUSR1 para os processos da hierarquia. Nota: Apenas os processos criados pelo arquivo ifs_fork devem ser afetados por essas operações. Pergunta: Quais condições de corrida existem nas operações dos itens 3.a e 3.b? (você _não_ precisa se preocupar com elas nas implementações). 4) Teste 3) com novas hierarquias a sua escolha. Você deve submeter dois scripts que criem hierarquias diferentes da hierarquia de 2), e ter certeza que sua implementação funciona _pelo menos_ para essas hierarquias.