子进程pid()是否被分配给父进程?

时间:2015-09-25 10:42:53

标签: c linux unix process operating-system

我已经在书籍和一些在线论坛中读到了这一点,即子进程pid已分配给其父级。但是我有这个代码:

{!!html_entity_decode($text)!!}

输出:

In Parent Process
Child PID : 2061
Parent PID : 1830
In Child Process
Child process PID : 2062
Parent Process 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
        {
            printf("In Parent Process\n");
            printf("Child PID : %d\n",getpid());
            printf("Parent PID : %d\n",getppid());
        }
}

输出 -

In Child Process
Child process PID : 2044
Parent Process PID : 2043
In Parent Process
Child PID : 2043
Parent PID : 1830

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

3 个答案:

答案 0 :(得分:3)

请记住,getpid会返回当前进程的pid,并且getppid会返回当前进程的父pid。

因此,在第二个示例中,当您在父进程中调用getpid时,您将获得自己(父进程)和getppid获取 grand -parent。

子pid是fork返回的值。

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

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

答案 1 :(得分:0)

Joachim的回答非常好。作为补充说明,您可以获得子进程&#39;通过打印else

的结果在fork分支中进行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
        }
}

答案 2 :(得分:0)

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

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

第二个例子:

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