paulo1205
(usa Ubuntu)
Enviado em 17/11/2016 - 13:59h
webbester escreveu:
[ ... ]
Eu tentei fazer alguma coisa seguindo um exemplo que mostra como criar processos filho (passado pelo professor), mas não consigo fazer o com que seja criado um filho 2. Somente o 1º é criado.
Há outros problemas, além desse.
O tipo de retorno de
main() tem de ser
int, não
void.
Seu professor pediu que a comunicação entre os processos ocorra através de um
pipe, mas eu não vi nenhum
pipe no seu programa.
Do jeito como foi especificado, existe a chance de que o processo que achou o número primeiro não seja aquele que vai escrever no
pipe, pois é possível que a troca de contexto entre processos, feita pelo sistema operacional, ocorra justamente entre o momento em que o número foi encontrado e o envio dessa informação ao processo gestor, e outro processo que achou o número depois pode ser escolhido pelo SO para execução, e acabar enviando seus dados antes. Mesmo que isso não faça diferença para você, é bom saber que pode acontecer, pois pode haver aplicações em que isso seja relevante.
Se você não inicializar a semente geradora de números (pseudo-)aleatórios, ou se a inicializar com o mesmo valor nos três processos, os três vão gerar exatamente as mesmas sequências de números. Desse modo, você não vai realmente medir nada a respeito da (pseudo-)aleatoriedade dentro de cada processo, mas tão-somente qual deles ganhou mais tempo de CPU (não deixa de ser relativamente aleatório, mas o será somente por causa de fatores externos ao programa).
Os três processos que fazem o sorteio têm de ser filhos do mesmo processo pai. Isso significa que o processo pai tem de chamar
fork() três vezes. Isso pode ser feito dentro de um laço de repetição ou com três chamadas consecutivas a
fork(). No seu programa, você só fez duas chamadas.
Após chamar a função especificada, que faz a busca do número aleatório e envia o resultado pelo
pipe, só resta a cada processo terminar. Você não precisa fazer um
sleep de 13 (3+10) ou 16 (6+10) segundos.
Como você só precisa imprimir qual foi o primeiro processo a terminar, o processo pai poderia matar, através da função
kill(), os dois outros processos, até porque existe o risco, com um programa que depende de aleatoriedade para terminar, de ele seguir executando por longo tempo, até mesmo por tempo indefinido.