Программа, по приходу команд из сокета, создает - fork() - обрабатывающие их процессы, которые должны работать параллельно. В конце обрабатывающего (child) процесса находится функция exit(). В результате, по окончании child-процесса остается процесс-"зомби". Чтобы не было такого ("зомби") в предок надо включать функцию wait(). Но мне не надо, чтобы предок ожидал окончания child-процесса, процессы должны порождаться независимо друг от друга, по приходу нужной информации. Кто может подсказать как прекращать child-процессы, не оставляя записей в таблице процессов (в смысле "зомби"-процессов)?Заранее благодарен.
Ловишь сигнал, который сообщает, что порожденный процесс завершился, и вызываешь wait(0), он ждать уже не будет:void sig_hdlr(int signo)
{
signal(SIGCHLD, sig_hdlr);if (signo == SIGCHLD)
wait(0);...
}void main()
{
signal(SIGCHLD, sig_hdlr);
...
}
>Ловишь сигнал, который сообщает, что порожденный процесс завершился, и вызываешь wait(0), он
>ждать уже не будет:
>
>void sig_hdlr(int signo)
>{
> signal(SIGCHLD, sig_hdlr);
>
> if (signo == SIGCHLD)
> wait(0);
>
> ...
>}
>
>void main()
>{
> signal(SIGCHLD, sig_hdlr);
> ...
>}В данном случае достаточно просто
signal(SIGCHLD, SIG_IGN);
То бишь просто игнорировать сигнал безо всяких дополнительных заморочек.
Большое спасибо.
>>Ловишь сигнал, который сообщает, что порожденный процесс завершился, и вызываешь wait(0), он
>>ждать уже не будет:
>>
>>void sig_hdlr(int signo)
>>{
>> signal(SIGCHLD, sig_hdlr);
>>
>> if (signo == SIGCHLD)
>> wait(0);
>>
>> ...
>>}
>>
>>void main()
>>{
>> signal(SIGCHLD, sig_hdlr);
>> ...
>>}
>
>В данном случае достаточно просто
>
>signal(SIGCHLD, SIG_IGN);
>
>То бишь просто игнорировать сигнал безо всяких дополнительных заморочек.Ну это не совсем так. Ибо...
1) По требованиям стандартов POSIX нельзя устанавливать обработчик сигнала SIGCHLD в SIG_IGN. И это нужно учесть, так как все *NIX системы стараются как можно больше соответветствовать этим стандартам.
2) Не рекомендую использовать wait() для ожидания смерти процессов в обработчике, так как возможна ситуация, когда при завершении работы _нескольких_ дочерних процессов, родитель получит только _один_ сигнал.
"Правильный" способ ожидания завершения процессов следующий:void SIGCHLD_handler (int nSignal)
{
int nPid;
signal (nSignal, SIGCHLD_handler);
while ((nPid = wait3 (NULL, WNOHANG, (struct rusage *) NULL)) > 0);
}Дополнительно, см. man 2 wait3
>Ну это не совсем так. Ибо...
>1) По требованиям стандартов POSIX нельзя устанавливать обработчик сигнала SIGCHLD в SIG_IGN.
>И это нужно учесть, так как все *NIX системы стараются как
>можно больше соответветствовать этим стандартам.
>2) Не рекомендую использовать wait() для ожидания смерти процессов в обработчике, так
>как возможна ситуация, когда при завершении работы _нескольких_ дочерних процессов, родитель
>получит только _один_ сигнал.
>"Правильный" способ ожидания завершения процессов следующий:
>
>void SIGCHLD_handler (int nSignal)
>{
> int nPid;
> signal (nSignal, SIGCHLD_handler);
> while ((nPid = wait3 (NULL, WNOHANG, (struct rusage *) NULL)) > 0);
>}
>
>Дополнительно, см. man 2 wait3Спасибо за лекцию (искренне). Но я на 99.9999....% уверен (ибо на 100% может быть уверен только господь Бог, аминь :)))), что в конкретно данном случае (запуск детей в свободное плавание) можно обойтись и "неправильным" способом и все будет OK. Хотя конечно несоответствие стандартам POSIX это страшшшное преступление... :)))