为什么父pid返回的值与getpid()不同?

时间:2018-11-25 16:35:03

标签: c unix fork pid

根据手册页

  

getpid()返回调用进程的进程ID(PID)。

  1. 在以下代码中,为什么parent pid返回的值与getpid()不同?
  2. 主流程与父流程不一样吗?
  3. 为什么在不同的系统上运行时会得到不同的输出?

#include <sys/types.h>                  
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char const *argv[])
{

    printf("getpid = %d \n", (int)getpid());

    pid_t pid = fork();
    printf("fork returned %d \n", (int)pid);

    switch (pid)
    {
    case -1:
        perror("fork failed");
        break;

    case 0:
        printf("I am a child  with pid = %d\n", (int)pid);
        break;

    default:
        printf("I am a parent with pid = %d\n", (int)pid);

        break;

    }
    return 0;
}

我运行时输出:

getpid = 8208 
fork returned 8209 
I am a parent with pid = 8209
fork returned 0 
I am a child  with pid = 0

在另一台PC上运行时的输出:

getpid = 2522 
fork returned 2523 
I am a parent with pid = 2522
fork returned 0 
I am a child  with pid = 2523

2 个答案:

答案 0 :(得分:2)

是的,父进程和主进程是同一件事。

此代码段应为您提供有关解决方案的线索:

switch (pid) {
    /* ... */
    case 0:
        printf("I am a child  with pid = %d\n", (int)pid);
        break;

这实际上表示“如果pid为零,则子pid始终为零”。这显然是不正确的,因此您对fork()返回值的解释是错误的。

该手册页指出:

  

成功完成后,fork()向子进程返回值0,并将子进程的进程ID返回给父进程。

因此,父进程中的变量pid 子进程的pid,父进程自身的pid。< / p>

在子进程中,您需要在getpid()之后调用fork()才能获得孩子自己的pid。

答案 1 :(得分:1)

fork复制了一个进程,并且在派生之后,它们都并行运行。为了告诉程序是子进程还是父进程,它会为子进程返回0,并在父进程中返回子进程的PID。

因此,在派生之后,必须在您的代码中为父母和孩子都调用getpid()

    pid_t thispid= getpid(); 
    switch (pid)
    {
    case -1:
        perror("fork failed");
        break;

    case 0:
        printf("I am a child  with pid = %d\n", (int)thispid);
        break;

    default:
        printf("I am a parent with pid = %d\n", (int)thispid);
        break;

    }