2016-03-08 3 views
0

Предположим, что я создаю канал между дочерним и родительским процессом, и дочерний процесс заканчивается нормально, будут ли закрыты каналы дочернего процесса автоматически?Выйдет программа автоматически закроет трубку?

Кроме того, если дочерний процесс также имеет дочерний процесс, а дочерний процесс заканчивается ошибкой сегментации, будет ли он также убивать процесс моего внука? Я имею в виду удалить его из таблицы процессов (мне не нужно ждать его).

EDIT: Например, для следующего кода я генерирую ошибку сегментации в дочернем процессе и пытаюсь дождаться его в родительском процессе. После запуска программы waitpid возвращает -1, но когда я проверяю WIFEXITED (статус), кажется, что программа дочернего процесса выходит нормально. И я получил

Killing дочерний процесс не удалось: Нет такого процесса

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

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <signal.h> 


int main(void) { 

    pid_t childpid; 
    int ends[ 2 ]; 
    pipe(ends); 
    if ((childpid = fork()) == -1) { 
     perror("fork failed"); 
     exit(0); 
    } 
    if(childpid == 0) { 
     pid_t cpid; 
     if ((cpid = fork()) == -1) { 
      perror("fork failed"); 
      exit(0); 
     } 
     if (cpid == 0){ 
      while(1); 
     } 
     else{ 
      printf("cpid is : %d\n",cpid); 
      char msg[32]; 
      sprintf(msg, "%d", cpid); 
      printf("cpid con is : %s\n", msg); 
      if(write(ends[ 1 ], msg, 32) == -1) { 
       perror("Write failed"); 
       exit(0); 
      } 
      char *s = NULL; 
      *s = 15; 
      while(1); 
     } 
    } 
    else{ 
     printf("childpid is : %d\n",childpid); 
     char msg[ 32 ]; 
     int cpid; 
     if(read(ends[0], msg,32) == -1) { 
      perror("read failed"); 
      exit(0); 
     } 
     cpid = atoi(msg); 
     int status; 
     while(1) { 
      if (waitpid(childpid, &status, WNOHANG) == -1) { 
       //printf("%d\n", WIFEXITED(status)); 
       if (kill(cpid, 9) == -1) { 
        perror("Killing child process failed"); 
        exit(0); 
       } 
       /*if (kill(cpid, 9) == -1) { 
        perror("Killing child process failed"); 
        exit(0); 
       }*/ 

      } 
     } 
    } 
    return 0; 
} 
+1

Да к первому. Нет второму. – kaylum

+0

Взгляните на последний цикл while. Вы ждете своего ребенка. Этого ожидания, скорее всего, удастся с первой попытки. Статус вашего ребенка получен, и pid больше не принадлежит вам. Следующая итерация. Вы ждете от pid, который не принадлежит вам, - ожидание неизбежно потерпит неудачу. Вы пытаетесь убить внука - вам это удается. Следующая итерация. Ваше ожидание продолжает сбой, и теперь убийство также терпит неудачу. Вы выходите. – PSkocik

+1

Да, я просто выяснил пару секунд назад такую ​​глупую ошибку. Спасибо, в любом случае! – user5574376

ответ

4

ОС закроет все filedescriptors, связанные с процессом, который умер или вышел из него. Если это закрывает последний filedescriptor, указывающий на конец чтения в трубе, тогда записи на конец записи начнут генерировать SIGPIPE (fds ссылаются на ref-counted ссылки на объект vnode позади них).

Если родитель умирает, его ребенок будет перенаправлен на init. init будет ждать на нем. (Бабушки и дедушки не могут wait на внуков в любом случае).

+0

Так будет ли init никогда не убить процесс внуков? Подождите, пока он не закончится? – user5574376

+0

@ user5574376 Это правильно. Процесс по-прежнему будет принадлежать группе процессов и может быть убит, потому что эта группа процессов была, например, отправлена ​​SIGINT через управление заданиями (^ C) или SIGHUP, когда процесс переходит в спящий режим, а его группа процессов переходит в группу сиротских процессов. – PSkocik

+0

Я понимаю, что когда дочерний процесс заканчивается нормально, процесс моего внука будет принят init, но то, что происходит, когда дочерний процесс генерирует seg-ошибку. Когда я пытаюсь убить процесс внука через его pid после моего дочернего процесса, создающего ошибку сегментации. У меня нет такой ошибки процесса. Но когда я не создал ошибку seg и просто убил дочерний процесс, я могу успешно убить процесс внука без такой ошибки процесса. – user5574376

 Смежные вопросы

  • Нет связанных вопросов^_^