URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1365
[ Назад ]

Исходное сообщение
"while (waitpid (-1, &status1, WNOHANG)>0) и всеравно зомби"

Отправлено void , 06-Фев-03 19:17 
Народ помогите я с сокетами и демонами вот только столкнулся и сразу грабли Остаются зомби процессы - вроде все по доке клеил но нифига waitpid не отлавливает
int main ()
{
  int serv_s,one = 1;
  struct sockaddr_in sin, cin;
  int cin_size = sizeof(cin);
  int sock, status1, child;

  daemon(0,0);

  serv_s = socket(PF_INET,SOCK_STREAM,0);
   .
   .
   .
  while ((sock = accept(serv_s,(struct sockaddr *)&cin, &cin_size)) >= 0)
    {
    .
    .
    .
    child = fork();
    if (child == -1)   panic("Can't fork");
    if (child == 0)
       {
        log_put("connect.log", "MAIN", "PID %d",getpid());
        if((one=proceed_connection(sock))<0)  
             log_put("connect.log", "MAIN", "Terminated abnormally");
        exit(0);
       }
     while ( (my_pid = waitpid (-1, &status1, WNOHANG))>0);
     close(sock);

    }

  panic("accept failed !!!");
  return 0;
}
Почему остаются зомби?
Я понимаю что у меня ошибка на уровне DNK:)


Содержание

Сообщения в этом обсуждении
"RE: while (waitpid (-1, &status1, WNOHANG)>0) и всеравно зомби"
Отправлено romanSA , 07-Фев-03 10:12 
>Народ помогите я с сокетами и демонами вот только столкнулся и сразу
>грабли Остаются зомби процессы - вроде все по доке клеил но
>нифига waitpid не отлавливает

А что за ошибку возвращает waitpid()?
И почему не хочешь сделать обработку смерти child-ов через перехват сигнала SIGCHLD?
IMHO, это самый правильный способ.

P.S. Тут на форуме недавно поднимали этот вопрос.


"RE: while (waitpid (-1, &status1, WNOHANG)>0) и всеравно зом..."
Отправлено void , 07-Фев-03 12:07 
Спасибо:)!
Все заработало зомбей нет:)!
Да я видел этот топик в форуме на который ты ссылался но я не разобрался в нем( видать сказалась 20 часовая борьба с этим)
А ларчик просто открывался ( поясняю мне нужно было при !!!любом!!! исходе child'a валить его)

void fsignal(int sig)
{
                exit(0);
}

int main ()
{
  int serv_s,one = 1;
  struct sockaddr_in sin, cin;
  int cin_size = sizeof(cin);
  int sock, status1, child,j;
  daemon(0,0);

  serv_s = socket(PF_INET,SOCK_STREAM,0);
  setsockopt(serv_s,SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one));
  .
  .
  .
  while ((sock = accept(serv_s,(struct sockaddr *)&cin, &cin_size)) >= 0)
    {
     .
     .
     .
    for(j=1; j<32; j++)   signal(j,fsignal);
    child = fork();
    if (child == -1)   panic("Can't fork");
    else
    if (child == 0)
       {
        if((one=proceed_connection(sock))<0)  log_put("connect.log", "MAIN", "Terminated abnormally");
        return 0;
       }
    else
      {
      while (  waitpid (-1, &status1, WNOHANG)>0);
      }
.
.
.
.
.
спасибо всем за информацию!!!!!!!!!