16

当我运行下面的代码时

#include <stdio.h>
#include <sys/types.h>
//int i=0;
int main(){

int id ;
id = fork() ;
printf("id value : %d\n",id);
    if ( id == 0 )
    {
    printf ( "Child : Hello I am the child process\n");
    printf ( "Child : Child’s PID: %d\n", getpid());
    printf ( "Child : Parent’s PID: %d\n", getppid());
    }
    else
    {
    printf ( "Parent : Hello I am the parent process\n" ) ;
    printf ( "Parent : Parent’s PID: %d\n", getpid());
    printf ( "Parent : Child’s PID: %d\n", id);
    } 

}

我的输出是

id value : 20173
Parent : Hello I am the parent process
Parent : Parent’s PID: 20172
Parent : Child’s PID: 20173
id value : 0
Child : Hello I am the child process
Child : Child’s PID: 20173
Child : Parent’s PID: 1

父母的 PID(20172) 与孩子的父母 ID (1) 有何不同?这两个不应该相等吗?

4

2 回答 2

24

发生的事情是父母在孩子跑之前就终止了。这会使子进程成为孤儿,并被 PID 为 1 的根进程采用。如果您延迟或从标准输入读取数据,而不是让父进程终止,您将看到您期望的结果。

进程ID 1 通常是主要负责启动和关闭系统的 init 进程。init(initialization 的缩写)是一个守护进程,它是所有其他进程的直接或间接祖先。init 的 wiki 链接

正如 user314104 指出的那样,wait() 和 waitpid() 函数旨在允许父进程暂停自身,直到子进程的状态发生变化。因此,在 if 语句的父分支中调用 wait() 会导致父级等待子级终止。

于 2013-03-03T07:28:41.987 回答
0

因为父进程跑完释放了,它的子进程变成了孤儿,pid为1的init(initialization的缩写)收到了孤儿进程。

于 2016-04-19T07:13:52.880 回答