【问题标题】:Is child process pid() gets assigned to parent process?子进程 pid() 是否被分配给父进程?
【发布时间】:2015-12-23 04:21:18
【问题描述】:

我在书籍和一些在线论坛中读到了这个子进程 pid 分配给它的父进程的内容。但我有这个代码:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
    pid_t pid;
    pid=fork();
    if(pid==0)
        {
            printf("In Child Process\n");
            printf("Child process PID : %d\n",getpid());
            printf("Parent Process PID : %d\n",getppid());
        }
    else
        {
            printf("In Parent Process\n");
            printf("Child PID : %d\n",getpid());
            printf("Parent PID : %d\n",getppid());
        }
}

它输出:

在父进程中 儿童 PID : 2061 父 PID : 1830 在子进程中 子进程PID:2062 父进程 PID:1161

但是如果我在 else 块中写了一个 wait() 函数,即:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
    pid_t pid;
    pid=fork();
    if(pid==0)
        {
            printf("In Child Process\n");
            printf("Child process PID : %d\n",getpid());
            printf("Parent Process PID : %d\n",getppid());
        }
    else
        {
            wait();
            printf("In Parent Process\n");
            printf("Child PID : %d\n",getpid());
            printf("Parent PID : %d\n",getppid());
        }
}

它输出-

在子进程中 子进程PID:2044 父进程 PID:2043 在父进程中 儿童 PID : 2043 父 PID : 1830

我不明白为什么第一个代码中子进程返回的 pid 值与父 pid 不同。 在第二个代码中,它是相同的。有人能解释一下上述问题的原因吗?

【问题讨论】:

  • 你有没有看过,哪个进程实际上是 1830 ?据我记得,如果父进程运行,并且仍然存在一个孤立的子进程,它会被进程“init”占用,它可能是 1830。
  • @icbytes init 进程总是进程 1。pid 1830 更可能是 shell 的 pid。
  • 那不是 "init" ,谢谢。

标签: c linux unix process operating-system


【解决方案1】:

记住getpid返回当前进程的pid,getppid返回当前进程的父pid。

因此,在第二个示例中,当您在父进程中调用 getpid 时,您会获得 if 本身(父进程)的 pid,而 getppid 会获得 grand-parent 的 pid .

子pid是fork返回的值。


与您的问题更相关的是,您无法控制特定进程何时在现代多任务系统中运行,这意味着子进程和父进程可能会轮流打印出文本。在您的情况下,第一个示例中的子进程似乎在父进程打印其行之前不会运行。

wait 函数所做的实际上是等待一个子进程退出,因此父进程将阻塞直到子进程退出。

【讨论】:

  • 你能澄清一下这个答案吗?我不明白它如何解决 OP 的问题。 OP 并没有抱怨不同的打印顺序。报告的问题是,在第一种情况下,从子 (1161) 打印的 getppid 值与从父 (2061) 打印的 getpid 值不同。
  • OP 确实通过为父级中的getpid 结果打印“子 pid”而造成混淆,而实际上那是父级的 pid。
【解决方案2】:

Joachim 的回答非常出色。作为附加说明,您可以通过打印fork 的结果在else 分支中获取子进程的pid:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
    pid_t pid;
    pid=fork();
    if(pid==0)
        {
            printf("In Child Process\n");
            printf("Child process PID : %d\n",getpid());
            printf("Parent Process PID : %d\n",getppid());
        }
    else
        {
            wait();
            printf("In Parent Process\n");
            printf("Child PID : %d\n", pid); // fork returns the pid of the child
            printf("Parent PID : %d\n", getpid());  // because I'm the parent
        }
}

【讨论】:

    【解决方案3】:

    第一个例子: fork 返回两个进程,在 fork 之后的第一个示例中,父进程开始执行并打印其 pid 2061 和父进程 pid 1830(bash),父进程将终止而不等待子进程完成,因此当子进程开始执行时,它将打印其pid 2062 和它的父进程已经终止它正在打印一些其他的 pid。

    当子进程正在运行时,请在打印父 pid 之前 sleep() 并在其他终端上使用命令 ps -l 来查看子进程作为父 pid 打印的 pid。

    第二个例子:

    您在父进程中使用等待,父进程将等待直到子进程终止,因此子进程正在打印正确的父进程,因为父进程仍未终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2018-07-02
      • 2013-03-08
      • 2011-06-01
      相关资源
      最近更新 更多