只是混淆了子进程块中的父进程pid值。我的课程如下:
int main(int argc, char *argv[])
{
pid_t pid;
pid=fork();
if(pid==-1){
perror("fork failure");
exit(EXIT_FAILURE);
}
else if(pid==0){
printf("pid in child=%d and parent=%d\n",getpid(),getppid());
}
else{
printf("pid in parent=%d and childid=%d\n",getpid(),pid);
}
exit(EXIT_SUCCESS);
}输出: parent=2642和childid=2643中的pid
child=2643和parent=1中的pid
在“高级Unix编程”中,它说子进程可以使用getppid()函数获得父进程id。但在这里,我得到了"1“,即"init”进程id。
如何获得子进程块中的父pid值。请帮助我获得产量。
我在"Linux“中执行,但在"WindRiver”操作系统中,我没有遇到这个问题。这个程序是否根据操作系统改变行为?
发布于 2013-08-09 19:35:58
那是因为父亲可以在儿子之前离开。如果父亲存在而没有请求它的子进程的返回值,那么该子进程将被pid=1所拥有。在传统的UNIX或GNU系统SystemV init中。
解决方案是在父亲中使用waitpid():
int main(int argc, char *argv[])
{
pid_t pid;
pid=fork();
if(pid==-1){
perror("fork failure");
exit(EXIT_FAILURE);
}
else if(pid==0){
printf("pid in child=%d and parent=%d\n",getpid(),getppid());
}
else{
printf("pid in parent=%d and childid=%d\n",getpid(),pid);
}
int status = -1;
waitpid(pid, &status, WEXITED);
printf("The child exited with return code %d\n", status);
exit(EXIT_SUCCESS);
}发布于 2013-08-09 19:35:46
在分叉之后,您有两个新的进程,您可以知道父进程中的子id,而不是相反的。如果您真的需要这样做,您必须在叉子之前打开一个管道(popen),然后家长可以将它写入管道中,而子管道可以读取它。
发布于 2017-03-26 17:52:59
一旦父程序完成了它的执行,并且子程序仍然在运行。然后,孩子被称为孤儿(因为它的父母去世了),如果您是通过root登录(它的pid =1 ),则init进程会采用它。
如果您希望在父级之前先退出子程序,那么使用wait()系统调用及其变体。
https://stackoverflow.com/questions/18154296
复制相似问题