Pergunta

Eu estou escrevendo um shell de onde eu preciso para iniciar vários processos filhos de uma só vez e registar a hora do sistema e o tempo de utilizador.

Então, agora eu sou capaz de fazê-lo.O único problema é que eu estou usando wait4 para pegar os recursos do sistema utilizados pelo programa criança e colocá-la na minha rusage estrutura chamada de utilização.

Como posso iniciar todos os processos ao mesmo tempo e manter o controle do usuário e sistema de vezes?Eu posso remover o wait4() chamada de sistema e usá-lo fora de ciclo, para que eu possa fazer o pai de espera, mas se eu fizer isso, então eu só posso registar os tempos para o último processo e não todos eles.

Você tem alguma idéia de como posso resolver isso?

execute(commandPipev,"STANDARD",0);
wait4(pid,&status,0,&usage);
printf("Child process: %s\t PID:%d\n", commandPipev[0], pid);
printf("System time: %ld.%06ld sec\n",usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
printf("User time:   %ld.%06ld sec\n\n",usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
Foi útil?

Solução

De um complicado responder.

Em um ambiente POSIX, o lançamento de as crianças, em seguida, usar waitid() com o WNOWAIT opção para dizer que uma criança foi encerrado.A opção deixa a criança em um waitable estado - que é, você pode usar outro aguarde-família chamada para obter as informações de que você precisa.Em seguida, você pode usar o não-POSIX wait4() chamada de sistema para obter as informações de uso para os acabado de sair criança, e lidar com a contabilidade o que você precisa fazer.Observe que você pode encontrar um diferente processo foi encerrado entre as waitid() e wait4() chamadas;você precisa usar um loop e sinalizadores apropriados e testes para recolher todos os corpos, a criança morta processos) antes de voltar para o waitid() ligar para saber sobre as outras anteriormente incompleta processos filho.Você também terá de se preocupar com qualquer uma das aguarde-família de funções de retornar as informações para um processo que anteriormente foi iniciado em background e tem agora a terminar.

A página de manual do Linux para wait4(2) sugere que WNOWAIT pode trabalhar diretamente com wait4(2), então você pode ser capaz de fazer tudo de forma mais limpa - se, de fato, você precisa da opção.

Considere se você pode usar grupos de processos de grupo de processos subordinados juntos, para fazer de espera para os membros do grupo o processo mais fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top