дочерний процесс завершился нормально, даже если я отправил SIGABRT к нему - PullRequest
1 голос
/ 23 июля 2010

Я пробовал некоторые операции процесса, такие как fork () и exec (). Я пробовал этот пример, в котором родительский метод wait () возвращает своего потомка и проверяет, нормально ли завершился его потомок (путем exit () ing иливозврат к вызывающей стороне) или ненормально (получая сигнал типа SIGABRT)

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include <sys/wait.h>

int spawn (char* program, char** arg_list)
{
    pid_t child_pid;
    child_pid = fork ();
    if (child_pid != 0)
    return child_pid;

    else {
    execvp (program, arg_list);
    abort();
    }
}
int main ()
{
    int child_status;
    char* arg_list[] = {"ls","/",NULL};

    spawn ("ls", arg_list);

    wait (&child_status);


    if (WIFEXITED (child_status))
        printf ("the child process exited normally, with exit code %d\n",
        WEXITSTATUS (child_status));
    else
        printf ("the child process exited abnormally\n");
return 0;
}

Я ожидаю увидеть предложение «дочерний процесс завершился ненормально», но я увидел «дочерний процесс завершился нормально, с кодом выхода 0»!!!даже если ребенок закончил с вызовом abort (), который посылает SIGABRT любую помощь?заранее спасибо

1 Ответ

8 голосов
/ 23 июля 2010

При вызове любых функций из семейства exec() текущая исполняемая программа заменяется на ту, которая указана в вызове exec(). Это означает, что никогда не будет звонить на abort(). Таким образом, программа ls завершается, а затем завершается нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...