The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"выход из child-процесса, не оставляя 'зомби' ?"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"выход из child-процесса, не оставляя 'зомби' ?"
Сообщение от dek emailИскать по авторуВ закладки on 30-Янв-03, 16:37  (MSK)
Программа, по приходу команд из сокета, создает - fork() - обрабатывающие их процессы, которые должны работать параллельно. В конце обрабатывающего (child) процесса находится функция exit(). В результате, по окончании child-процесса  остается процесс-"зомби". Чтобы не было такого ("зомби") в предок надо включать функцию wait(). Но мне не надо, чтобы предок ожидал окончания child-процесса, процессы должны порождаться независимо друг от друга, по приходу нужной информации. Кто может подсказать как прекращать child-процессы, не оставляя записей в таблице процессов (в смысле "зомби"-процессов)?

Заранее благодарен.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: выход из child-процесса, не оставляя 'зомби' ?"
Сообщение от kalinin_den emailИскать по авторуВ закладки on 30-Янв-03, 18:01  (MSK)
Ловишь сигнал, который сообщает, что порожденный процесс завершился, и вызываешь wait(0), он ждать уже не будет:

void sig_hdlr(int signo)
{
  signal(SIGCHLD, sig_hdlr);

  if (signo == SIGCHLD)
    wait(0);

  ...
}

void main()
{
  signal(SIGCHLD, sig_hdlr);
  ...
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: выход из child-процесса, не оставляя 'зомби' ?"
Сообщение от Soldier Искать по авторуВ закладки on 30-Янв-03, 18:12  (MSK)
>Ловишь сигнал, который сообщает, что порожденный процесс завершился, и вызываешь 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);

То бишь просто игнорировать сигнал безо всяких дополнительных заморочек.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: выход из child-процесса, не оставляя 'зомби' ?"
Сообщение от dek emailИскать по авторуВ закладки on 30-Янв-03, 18:47  (MSK)
Большое спасибо.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: выход из child-процесса, не оставляя 'зомби' ?"
Сообщение от romanSA Искать по авторуВ закладки on 31-Янв-03, 10:09  (MSK)
>>Ловишь сигнал, который сообщает, что порожденный процесс завершился, и вызываешь 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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: выход из child-процесса, не оставляя 'зомби' ?"
Сообщение от Soldier Искать по авторуВ закладки on 31-Янв-03, 15:27  (MSK)
>Ну это не совсем так. Ибо...
>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 это страшшшное преступление... :)))


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру