Pergunta

Na minha shell personalizada simples que estou lendo comandos da entrada padrão e executá-los com execvp (). Antes disso, eu criar um fork do processo atual e eu chamo o execvp () nesse processo filho, logo depois disso, eu chamo de saída (0).

Algo parecido com isto:

pid = fork();

if(pid == -1) {
    perror("fork");
    exit(1);
}

if(pid == 0) {
    // CHILD PROCESS CODE GOES HERE...
    execvp(pArgs[0], pArgs);
    exit(0);
} else {
    // PARENT PROCESS CODE GOES HERE...
}

Agora, os comandos executados com execvp () pode retornar erros certo? Eu quero lidar com isso corretamente e agora, estou sempre de chamar exit (0), o que significa o processo filho terá sempre um estado "OK".

Como posso devolver o status adequada do (call) execvp e colocá-lo na chamada exit ()? Devo apenas obter o valor int que execvp () retorna e passá-lo como uma saída () argumento em vez de 0. Isso é suficiente e correcta?

Foi útil?

Solução

Você precisa usar waitpid(3) ou wait(1) no código pai para esperar a criança para sair e obter a mensagem de erro.

A sintaxe é:

pid_t waitpid(pid_t pid, int *status, int options);

ou

pid_t wait(int *status);

status contém o status de saída. Olhada nas páginas man para vê-lo como analisá-lo.


Note que você não pode fazer isso a partir do processo filho. Uma vez que você chamar execvp o processo filho dies (para todos os efeitos práticos) e é substituir pelo processo exec'd. A única maneira que você pode chegar exit(0) existe se a própria execvp falhar, mas, em seguida, a falha não é porque o novo programa terminou. É porque nunca corri para começar.

Editar: o processo filho não realmente die. O PID e ambiente permanecem inalterados, mas todo o código e os dados são substituídos com o processo de exec'd. Você pode contar com não retornando para o processo filho original, a menos que exec falhar.

Outras dicas

Desde a sua pergunta é um pouco difícil de descobrir o que está pedindo. Então, eu vou tentar cobrir algumas das questões relacionadas com:

  • execvp() ou não voltar (em caso de sucesso), ou ele retorna um erro. Significado seu código criança só precisa lidar com condições de erro. Seu código criança deve capturar o resultado de execvp() e usar esse valor em exit() como você sugeriu. Seu código de criança nunca deve retornar 0, já que o único meio de sucesso que o execvp trabalharam e que processs retornará 0 (ou não).
  • O pai pode obter informações criança de waitpid() sobre isso do estado de saída. Existem várias macros definidos para puxar informações do parâmetro status retornado. Notável por sua finalidade são WIFEXITED de dizer se a criança saiu "normalmente" e WEXITSTATUS para obter o status da criança como passado para exit(). Veja a página man waitpid para outras macros.

Use wait() ou waitpid() no processo pai. Um exemplo aqui: código de retorno quando OS mata seu processo .

Além disso, quando uma criança morre o sinal SIGCHLD é enviado para o processo pai.

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