The OpenNET Project / Index page

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

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

"signal(SIGCHLD,SIG_IGN)" 
Сообщение от dna Искать по авторуВ закладки on 28-Фев-05, 09:42  (MSK)
Что я делаю не так?
Код следующий:
...
signal(SIGCHLD,SIG_IGN);
daemon(0,0);
for (;;) {
if ((log = fopen(LOG, "r")) != NULL) {
    while(fgets(readbuf, sizeof(readbuf), log) != NULL) {
        if ((pidchild = fork()) < 0) {
            syslog(LOG_NOTICE,"Can't fork\n");
        }
        else if (pidchild == 0) {
            syslog(LOG_NOTICE,"Received string: %s, %d bytes\n",readbuf,strlen(readbuf));
            fclose(log);
            sleep(30);
            _exit(0);

        }
    }
    fclose(log);
}
else {
    syslog(LOG_NOTICE,"Can't open %s (%s)\n",LOG,strerror(errno));
    exit(-1);
}
}
Т.е. для SIGCHLD указал SIG_IGN, а зомби продолжают появляться?

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

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

1. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 28-Фев-05, 09:50  (MSK)
>Т.е. для SIGCHLD указал SIG_IGN, а зомби продолжают появляться?

а почему вы решили, что игнорированием SIGCHLD вы автоматически избавляетесь от зомби? это не так.

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от dna Искать по авторуВ закладки on 28-Фев-05, 10:18  (MSK)
>а почему вы решили, что игнорированием SIGCHLD вы автоматически избавляетесь от зомби?
>это не так.

Ну я не то, что бы так решил. Просто обратил внимание, на рекомендации, что  если код возврата дочернего процесса не нужен, то можно просто игнорировать сигнал SIGCHLD:
signal(SIGCHLD,SIG_IGN);
А в итоге возникают зомби!
Если не трудно, подскажите как с ними бороться!?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 28-Фев-05, 10:54  (MSK)
>>а почему вы решили, что игнорированием SIGCHLD вы автоматически избавляетесь от зомби?
>>это не так.
>
>Ну я не то, что бы так решил. Просто обратил внимание, на
>рекомендации, что  если код возврата дочернего процесса не нужен, то
>можно просто игнорировать сигнал SIGCHLD:
>signal(SIGCHLD,SIG_IGN);
>А в итоге возникают зомби!
>Если не трудно, подскажите как с ними бороться!?

нужно ожидать завершения дочернего процесса.

man waitpid

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от dna Искать по авторуВ закладки on 28-Фев-05, 13:49  (MSK)
>
>нужно ожидать завершения дочернего процесса.
>
>man waitpid

да в таком случае все понятно, а можно сделать как-нибудь так без ожидания?

>
>// wbr


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 28-Фев-05, 14:14  (MSK)
>>
>>нужно ожидать завершения дочернего процесса.
>>
>>man waitpid
>
>да в таком случае все понятно, а можно сделать как-нибудь так без
>ожидания?

ставьте обработчик на SIGCHLD и в нем вызывайте waitpid(-1, 0, WNOHANG). будет отлавливать завершение дочерних процессов асинхронно без блокировки основного процесса. ps: не забудьте разрешить генерацию SIGCHLD через setprocmask().

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от dna Искать по авторуВ закладки on 01-Мрт-05, 08:11  (MSK)
>ставьте обработчик на SIGCHLD и в нем вызывайте waitpid(-1, 0, WNOHANG). будет
>отлавливать завершение дочерних процессов асинхронно без блокировки основного процесса. ps: не
>забудьте разрешить генерацию SIGCHLD через setprocmask().

маленькая загвоздка с setprocmask
у меня FreeBSD 4.8:
# man setprocmask
No manual entry for setprocmask

>
>// wbr


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от dna Искать по авторуВ закладки on 01-Мрт-05, 08:34  (MSK)
и еще видимо, что-то не так делаю

signal(SIGCHLD,&clean);
daemon(0,0);
...
void clean() {
    waitpid(-1, 0, WNOHANG);
}

процессы закрываются как и положенно, но вместе со всеми закрывается еще и родитель!

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 01-Мрт-05, 09:17  (MSK)
>и еще видимо, что-то не так делаю
>
>signal(SIGCHLD,&clean);

все-таки лучше

signal(SIGCHLD, clean);

или

struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = clean;
sa.sa_flags = 0;
sigaction(SIGCHLD, &sa, 0);

>daemon(0,0);
>...
>void clean() {
>    waitpid(-1, 0, WNOHANG);
>}

лучше

void
clean(int signo)
{
    if (signo == SIGCHLD) {
        waitpid(-1, 0, WNOHANG);
    }
}

>процессы закрываются как и положенно, но вместе со всеми закрывается еще и
>родитель!

обычно, если вы используете вызов daemon(), он вызывается *перед* любыми выделениями системных ресурсов. причина проста - он вызывает fork() и не факт, что ранее открытые вами ресурсы безболезненно перейдут к дочернему процессу.

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "signal(SIGCHLD,SIG_IGN)" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 01-Мрт-05, 09:19  (MSK)
>>ставьте обработчик на SIGCHLD и в нем вызывайте waitpid(-1, 0, WNOHANG). будет
>>отлавливать завершение дочерних процессов асинхронно без блокировки основного процесса. ps: не
>>забудьте разрешить генерацию SIGCHLD через setprocmask().
>
>маленькая загвоздка с setprocmask
>у меня FreeBSD 4.8:
># man setprocmask
>No manual entry for setprocmask

ммм.. ну плохо вам :) FreeBSD вещь конечно хорошая, но с поддержкой POSIX там есть некоторые проблемы.. или как минимум были в 4.x версиях.

тогда смотрите manы на предмер того, разрешен ли по умолчанию SIGCHLD или нет. в соотв. с POSIX - нет. как на FreeBSD 4.8 я не знаю.

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

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




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

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