Предположим, что я создаю канал между дочерним и родительским процессом, и дочерний процесс заканчивается нормально, будут ли закрыты каналы дочернего процесса автоматически?Выйдет программа автоматически закроет трубку?
Кроме того, если дочерний процесс также имеет дочерний процесс, а дочерний процесс заканчивается ошибкой сегментации, будет ли он также убивать процесс моего внука? Я имею в виду удалить его из таблицы процессов (мне не нужно ждать его).
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;
}
Да к первому. Нет второму. – kaylum
Взгляните на последний цикл while. Вы ждете своего ребенка. Этого ожидания, скорее всего, удастся с первой попытки. Статус вашего ребенка получен, и pid больше не принадлежит вам. Следующая итерация. Вы ждете от pid, который не принадлежит вам, - ожидание неизбежно потерпит неудачу. Вы пытаетесь убить внука - вам это удается. Следующая итерация. Ваше ожидание продолжает сбой, и теперь убийство также терпит неудачу. Вы выходите. – PSkocik
Да, я просто выяснил пару секунд назад такую глупую ошибку. Спасибо, в любом случае! – user5574376