Скажем, я создаю канал между дочерним и родительским процессами, и дочерний процесс завершается нормально, будут ли каналы дочернего процесса автоматически закрыты?
Кроме того, если у дочернего процесса также есть дочерний процесс, и дочерний процесс завершается ошибкой сегментации, убьет ли он мой внучатый процесс? Я имею в виду удалить его из таблицы процессов (мне не нужно его ждать).
РЕДАКТИРОВАТЬ: Например, для следующего кода я генерирую ошибку сегментации в дочернем процессе и пытаюсь дождаться ее в родительском процессе. После того, как я запустил программу, waitpid возвращает -1, но когда я проверяю WIFEXITED (статус), кажется, что программа дочернего процесса завершается нормально. И я получил
Не удалось убить дочерний процесс: такого процесса нет
ошибка, попробуйте убить мой внучатый процесс. Интересно, это потому, что ошибка сегментации автоматически закрывает как дочерний, так и внучатый процесс?
#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;
}
while(waitpid(...)==-1) {;}
. Также вы можете заменить эти другиеwhile(1) ;
наpause();
. Избегайте SIGKILL (9), чтение и запись могут быть успешными частично, аpipe
может дать сбой. - person PSkocik   schedule 09.03.2016