【发布时间】:2013-02-04 13:30:52
【问题描述】:
如果我在fork 之后在子级中使用以下行:
while( getppid() != 1 )
为了确保父进程在子进程之前终止(当父进程终止时,子进程的父进程变为init 进程)那么我可能面临哪些问题(如果有的话)?
这是确保孩子在父母之后终止的好方法吗?
还有什么办法?
【问题讨论】:
如果我在fork 之后在子级中使用以下行:
while( getppid() != 1 )
为了确保父进程在子进程之前终止(当父进程终止时,子进程的父进程变为init 进程)那么我可能面临哪些问题(如果有的话)?
这是确保孩子在父母之后终止的好方法吗?
还有什么办法?
【问题讨论】:
自旋循环从来都不是一件好事。分叉前打开管道。让孩子阻止阅读。当父级终止时,管道将关闭,子级将继续。 (确保孩子关闭管道的写入端!)
例如:(警告:省略所有错误检查)
int
main( void ) {
int fd[ 2 ];
pipe( fd );
if( fork() ) {
sleep( 2 );
puts( "parent awakes" );
} else {
char k;
close( fd[ 1 ]);
read( fd[ 0 ], &k, 1 );
puts( "child continues" );
}
return 0;
}
还要注意,子进程完成后应该关闭管道的读取端,但我已将其从示例代码中删除,因为它与等待父进程终止的问题无关。
【讨论】: