Порожденные процессы перестают существовать - PullRequest
0 голосов
/ 16 апреля 2009

Я использую posix_spawnp для порождения дочерних процессов из моего основного процесса.

    int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);   

    if (iRet != 0)
    {       
        return false;
    }

Иногда после того, как дочерний процесс создается без ошибок, он внезапно перестает функционировать. Как это могло произойти?

Я использую обработчик сигнала для сбора дочерних процессов:

void SigCatcher(int n)
{       
    while(waitpid( -1, NULL, WNOHANG ) > 0);        
}

и я вызываю его вручную всякий раз, когда убиваю дочерний процесс.

    kill(oProcID, SIGKILL);

    signal (SIGCHLD, SigCatcher);

Может ли это привести к тому, что порожденные дети перестают существовать (я не призываю убить)?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2009

Это:

kill(oProcID, SIGKILL);

signal (SIGCHLD, SigCatcher);

выглядит как состояние гонки . Вам нужно установить обработчик сигнала перед уничтожением дочернего процесса, иначе вы рискуете пропустить сигнал.

1 голос
/ 16 апреля 2009

Вы звонили:

signal(SIGCHLD, SigCatcher);

где-нибудь еще?

Если нет, то вам нужно сделать это до того, как будут запущены какие-либо дочерние процессы, чтобы гарантировать, что эти дети будут пожинены после завершения.

Как указывает Unwind, ваши текущие звонки на kill и signal неверны.

Типичное использование будет:

signal(SIGCHLD, handler);
posix_spawnp(...);
...
// do other stuff
...
kill(pid, SIGKILL);
...