我正在尝试使用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 吗? 希望有人可以解释这一切是如何起作用的,以及我在做什么(或思考)错误。
答案 0 :(得分:6)
[从评论中确认]
您的输出与时间有关。如果父进程在子进程处理完成后结束,则输出将按预期进行。
如果父进程在子进程之前完成,则输出可能会令人惊讶(在父进程不再存在之前,父ID将不同)。一旦父进程死亡(结束),init或其他一些实现定义的进程(在您的情况下为1508),将成为子进程的新父进程(ren)。这些孩子被称为孤儿过程。
根据The Single UNIX Specification,Version 2的exit手册页:
调用进程的所有现有子进程和僵尸进程的父进程ID应设置为实现定义的系统进程的进程ID。也就是说,这些过程应由特殊的系统过程继承。
要避免这种情况,请确保在获取父pid时父进程处于活动状态。一种方法是在退出之前在父(或所有)进程中添加等待。
答案 1 :(得分:1)
您的代码没有错误
只是您的父进程在子进程完成之前退出 因此它们变成了孤儿,并被init或任何实现定义的过程所采用(在你的情况下为1508)。
尝试puttin wait();让父母完成所有子进程的执行。