execv, espera, programação Unix, como esperar por uma criança
Pergunta
Oi Eu estou trabalhando em um shell unix e eu estou correndo em dois problemas. Eu queria saber se algum de vocês poderia me ajudar. Meu primeiro problema é que a casca não está aguardando o processo filho para terminar. Eu posso realmente ir digite mais comandos enquanto o processo filho está em execução. Minhas segundas problemas está nas duas linhas seguintes. Eu não estou recebendo qualquer exibição na casca.
fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
fprintf(stderr, "Child pid = %d\n", pid);
I têm o seguinte método para executar um processo introduzidos pelo utilizador: isto é firefox, sl -a, etc
void execute(char *command[], char *file, int descriptor){
pid_t pid;
pid = fork();
if(pid == -1){
printf("error in execute has occurred\n");
}
if(pid == 0){
execvp(*command,command);
fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
fprintf(stderr, "Child pid = %d\n", pid);
wait(&status);
exit(EXIT_SUCCESS);
}
else{
printf("ignore for now\n");
}
}
Este é o lugar onde eu chamo o comando executar. Ele funciona muito bem e lançamentos de um processo, mas não esperar que ela termine.
execute(commandArgv, "STANDARD",0);
Vocês têm alguma idéia do que eu poderia estar fazendo de errado? Graças Eu realmente aprecio qualquer momento que você tomar para me ajudar nisso.
Solução
Uma vez execvp () é executado, ele nunca vai voltar. Ele substitui na memória o aplicativo em execução com o que foi fornecido. Portanto, o seu fprintf () e wait () estão no lugar errado.
Outras dicas
Além de obter a lógica real funcionou corretamente (sugestões de Stephane tudo de bom), você pode também querer fflush (stderr), depois, para garantir suas mensagens de erro-ing fprintf fazê-lo fora imediatamente em vez de ser tamponado.
Você tem um pequeno erro na forma como o processo funciona. Depois execvp é chamado, não há como voltar atrás. fork () lhe dá ter o pai e uma criança idêntica, mas execvp imagem Criança de substituição para ser o comando que você está chamando.
O execvp retorna somente quando um graves ocorrem erros que impedem a substituição da imagem. Então, você precisa imprimir coisas antes de sua chamada. Então você também pode querer mudar o EXIT_SUCCESS para um EXIT_FAILURE lá.
Agora, há outro erro usando espera : você quer sempre a espera dos pais para a criança, e não o contrário. Você não pode pedir para que a criança espera. Ela não tem nada a espera, ela vai correr e terminar. Então, você precisa mover o wait () chamada para o else parte.
void execute(char *command[], char *file, int descriptor)
{
pid_t pid;
pid = fork();
if(pid == -1)
{
printf("fork() error in execute() has occurred\n");
return; /* return here without running the next else statement*/
}
if(pid == 0)
{
fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
fprintf(stderr, "Child pid = %d\n", getpid());
execvp(*command,command);
fprintf(stderr, "Error! Can't overwrite child's image!\n");
exit(EXIT_FAILURE);
}
else
{
printf("Parent waiting for child pid: %d\n", pid);
wait(&status);
printf("Parent running again\n");
}
}
Mas ler sua pergunta, talvez você realmente não quer que o pai para esperar. Se for esse o caso, simplesmente não usar o wait () função.
cuidar, Beco
Editado: alguns erros menores. pid da criança é getpid ()