[英]Process parent ID of child process is different from PID of parent
我正在尝试使用C中的fork()
函数在Linux中使用多个进程,这是我的代码:
p1 = fork();
if(p1 != 0){
p2 = fork();
}
printf("My PID is %d\n",getpid());
printf("My parent PID is %d\n",getppid());
现在让我们假设父进程ID是100,并且两个子进程(p1,p2)ID是101和102,并且init进程PID将是0我的预期输出是:
My PID is 100
My parent PID is 0
My PID is 101
My parent PID is 100
My PID is 102
My parent PID is 100
相反,我看到不同的东西,两个子进程具有相同的PPID,但第一个进程具有不同的PID。 这是我得到的示例输出:
My PID is 3383
My parent PID is 3381
My PID is 3387
My parent PID is 1508
My PID is 3386
My parent PID is 1508
我的问题是,两个子进程的父PID不应该是3383吗? 希望有人可以解释这一切是如何起作用的,以及我在做什么(或思考)错误。
[通过评论确认]
您的输出取决于时间。 如果父进程在子进程处理完成后,您的输出将按预期进行。
如果父进程在子进程之前完成,则输出可能会令人惊讶(在父进程不再存在之前,父ID将不同)。 一旦父进程死亡(结束),init或其他一些实现定义的进程(在你的情况下为1508),就成为子进程的新父进程(ren)。 这些孩子被称为孤儿过程。
根据The Single UNIX Specification,Version 2的退出手册页:
调用进程的所有现有子进程和僵尸进程的父进程ID应设置为实现定义的系统进程的进程ID。 也就是说,这些过程应由特殊的系统过程继承。
要避免这种情况,请确保在获取父pid时父进程处于活动状态。 一种方法是在退出之前在父(或所有)进程中添加等待。
您的代码没有任何错误
它只是你的父进程在子进程完成之前退出,因此它们变成了孤儿,并被init或任何实现定义的进程(在你的情况下为1508)所采用。
试试puttin wait(); 用于父完成所有子进程的执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.