arg*_*nza 4 c linux fork pid process
我正在尝试使用fork()C中的函数在Linux中使用多个进程,这是我的代码:
p1 = fork();
if(p1 != 0){
p2 = fork();
}
printf("My PID is %d\n",getpid());
printf("My parent PID is %d\n",getppid());
Run Code Online (Sandbox Code Playgroud)
现在让我们假设父进程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
Run Code Online (Sandbox Code Playgroud)
相反,我看到不同的东西,两个子进程具有相同的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
Run Code Online (Sandbox Code Playgroud)
我的问题是,两个子进程的父PID不应该是3383吗?希望有人可以解释这一切是如何起作用的,以及我在做什么(或思考)错误.
[通过评论确认]
您的输出取决于时间.如果父进程在子进程处理完成后,您的输出将按预期进行.
如果父进程在子进程之前完成,则输出可能会令人惊讶(在父进程不再存在之前,父ID将不同).一旦父进程死亡(结束),init或其他一些实现定义的进程(在你的情况下为1508),就成为子进程的新父进程(ren).这些孩子被称为孤儿过程.
根据The Single UNIX Specification,Version 2 的退出手册页:
调用进程的所有现有子进程和僵尸进程的父进程ID应设置为实现定义的系统进程的进程ID.也就是说,这些过程应由特殊的系统过程继承.
要避免这种情况,请确保在获取父pid时父进程处于活动状态.一种方法是在退出之前在父(或所有)进程中添加等待.
| 归档时间: |
|
| 查看次数: |
1970 次 |
| 最近记录: |