zombie procesess

Тема в разделе "WASM.UNIX", создана пользователем Cr4sh, 30 ноя 2006.

  1. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    можно ли сделать так, чтоб дочерние процессы, созданые вызовом fork() после завершения работы не висели в состоянии zombie, а прибивались, без участия родительского процесса
     
  2. f0rk

    f0rk New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2006
    Сообщения:
    18
    дык, они и так прибиваются. если род.процесс завершается раньше, чем дочерние, то процесс init завершает корректно дочерние процессы
     
  3. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Cr4sh
    После вызова wait();или waitid(); вроде прибиваются...
     
  4. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    _Serega_ да, но тогда родительский процесс ждёт дочерний... вобщем, следующий код, чтоб немного прояснить ситуацию, в коддинге под никсами я полное ламо(
    Код (Text):
    1. int main(int argc, char *argv[])
    2. {
    3.     int sock, client_socket;
    4.     struct sockaddr_in sin;  
    5.     char buff[1024];
    6.  
    7.     if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
    8.     {
    9.         printf("socket creation error\n");
    10.         return 0;
    11.     }
    12.  
    13.     bzero(&sin, sizeof(sin));
    14.     sin.sin_family = AF_INET;
    15.     sin.sin_port = htons(atoi(argv[1]));
    16.     sin.sin_addr.s_addr = INADDR_ANY;
    17.  
    18.     if (bind(sock, (struct sockaddr *)&sin, sizeof(sin)))
    19.     {
    20.         printf("bind() error\n");
    21.         goto end;
    22.     }
    23.  
    24.     while (1)
    25.     {
    26.         struct sockaddr_in client_addr;
    27.         int client_addr_size = sizeof(client_addr);
    28.  
    29.         int len = recvfrom(sock, buff, sizeof(buff), 0, (struct sockaddr *)&client_addr, &client_addr_size);
    30.    
    31.         if (len > 0)
    32.         {
    33.             int pchild = fork();
    34.             if (pchild == 0)
    35.             {
    36.                      // child process - do something, it may take a long time
    37.  
    38.                 exit(0);
    39.             }
    40.             else if (pchild < 0)
    41.                 printf("fork() error\n");
    42.         }
    43.     }
    44.  
    45. end:
    46.     close(sock);
    47.  
    48.     return 0;
    49. }
     
  5. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Cr4sh
    Жди SIGCHILD, а в нем вызывай wait(), тады задержки не будет.