为什么 fork() 和 getpid() 的 pid 不同?

问题描述 投票:0回答:1

我的作业是这样问的:

使用下面的程序,确定 A、B、C、D 行的 pid 值。(假设父子的实际 pid 分别为 10 和 20。)为每一行解释 pid 的原因价值。

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main() {
    pid_t pid, pid1;
    /* fork a child process */
    pid = fork();
    if (pid < 0) { /* error occurred */
        fprintf(stderr, "Fork Failed\n");
        return 1;
    }
    else if (pid == 0) { /* child process */
        pid1 = getpid();
        printf("child: pid = %d\n",pid); /* A */
        printf("child: pid1 = %d\n",pid1); /* B */
    }
    else { /* parent process */
        pid1 = getpid();
        printf("parent: pid = %d\n",pid); /* C */
        printf("parent: pid1 = %d\n",pid1); /* D */
        wait(NULL);
    }
    return 0;
}

当我运行它时,我得到(例如):

parent: pid = 1586
parent: pid1 = 1585
child: pid = 0
child: pid1 = 1586

为什么

fork()
getpid()
为所谓的相同进程返回不同的 pid?

fork pid
1个回答
0
投票

你应该首先了解这两个函数的返回值:

  • fork
    在子进程中返回0,在父进程中返回非零值;这个非零值是子进程的 PID。
  • getpid
    返回当前进程的PID; current 表示调用
    getpid
    函数的任何人。

首先,在您的代码中,即使

pid1 = getpid()
行相同,caller 也不同。在
else if
块中它是子进程,而在
else
块中它是父进程。因此这两个
pid1
在输出中是不同的。

其次,在父进程中,

pid
fork
的返回值)是子进程的PID,不是自己的。
fork
返回子进程的 PID 的原因是为了让父进程与子进程进行通信和控制。

© www.soinside.com 2019 - 2024. All rights reserved.