退出程序会不会自动关闭管道?
Will exit the program automatically close the pipe?
假设我在子进程和父进程之间创建一个管道,子进程正常结束,子进程的管道会自动关闭吗?
另外,如果子进程也有子进程,子进程以段错误结束,是否也会杀死我的孙进程?我的意思是从进程中删除它table(我不需要等待它)。
编辑:
例如,对于以下代码,我在子进程中生成了一个分段错误,并尝试在父进程中等待它。在我 运行 程序之后,waitpid return -1,但是当我检查 WIFEXITED(status) 时,子进程程序似乎正常退出。
我得到了
Killing child process failed: No such process
尝试终止我的孙子进程时出错。请问这是不是因为segmentation fault自动关闭子进程和孙进程?
#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;
}
OS 将关闭与已终止或退出的进程关联的所有文件描述符。如果这关闭了指向管道读取端的最后一个文件描述符,那么写入写入端将开始生成 SIGPIPE(fds 是对它们后面的 vnode 实体的 ref-counted 引用)。
如果 parent 死亡,其 child 将重新parent 为 init
。 init
将等待它。 (无论如何,Grandparents 不能 wait
on grandchildren)。
假设我在子进程和父进程之间创建一个管道,子进程正常结束,子进程的管道会自动关闭吗?
另外,如果子进程也有子进程,子进程以段错误结束,是否也会杀死我的孙进程?我的意思是从进程中删除它table(我不需要等待它)。
编辑: 例如,对于以下代码,我在子进程中生成了一个分段错误,并尝试在父进程中等待它。在我 运行 程序之后,waitpid return -1,但是当我检查 WIFEXITED(status) 时,子进程程序似乎正常退出。 我得到了
Killing child process failed: No such process
尝试终止我的孙子进程时出错。请问这是不是因为segmentation fault自动关闭子进程和孙进程?
#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;
}
OS 将关闭与已终止或退出的进程关联的所有文件描述符。如果这关闭了指向管道读取端的最后一个文件描述符,那么写入写入端将开始生成 SIGPIPE(fds 是对它们后面的 vnode 实体的 ref-counted 引用)。
如果 parent 死亡,其 child 将重新parent 为 init
。 init
将等待它。 (无论如何,Grandparents 不能 wait
on grandchildren)。