【问题标题】:getpid and getppid return two different valuesgetpid 和 getppid 返回两个不同的值
【发布时间】:2013-02-17 11:18:06
【问题描述】:

当我运行下面的代码时

#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) 有何不同?这两者不应该相等吗?

【问题讨论】:

    标签: c fork pid


    【解决方案1】:

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

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

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

    【讨论】:

    • 或者,更传统的,wait() 和 waitpid()。
    • @Jackson 通过链接添加了更多信息。我觉得它需要完成你的好答案。如果你不喜欢恢复。
    【解决方案2】:

    由于父进程用完释放,其子进程成为孤儿,pid为1的init(initialization的缩写)收到孤儿进程。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2014-08-14
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多