C语言 fork()系统调用返回两个值给父进程和子进程?

li9yvcax  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(148)

在《操作系统概念》一书中我发现了这样一个语境:
在UNIX中,正如我们所看到的,每个进程都由其进程标识符标识,该标识符是一个唯一的整数。fork()系统调用创建了一个新进程。新进程由原始进程地址空间的副本组成。该机制允许父进程与其子进程轻松通信。两个进程(父进程和子进程)都在fork()之后的指令处继续执行,但有一个区别:对于新(子)进程,fork()的返回代码为零,而子进程的(非零)进程标识符被返回给父进程。
我很困惑。听起来像是同一个fork()函数向父进程和子进程返回两个不同的值?这怎么可能(一个函数向两个进程返回两个不同的值),还是我误解了?

g6ll5ycj

g6ll5ycj1#

当输入fork时,只有一个进程。在fork中,这个进程被克隆/复制。现在有两个进程并行运行相同的代码。这两个进程仍然在fork函数中。最终,每个进程都会退出fork函数:父进程将退出fork函数(返回子进程的PID),并且子进程将退出fork函数(返回0)。
分叉(ASCII艺术):

,-- (parent process) child PID returned to parent
parent -- fork() --
                   `-- (child process)  0 returned to child

分叉(剪贴画):

cdmah0mi

cdmah0mi2#

下面是一些演示该行为的代码:

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

int main() {
    printf("parent: %ld\n", (long) getpid());
    pid_t p = fork();
    if(p) {
        printf("parent: %ld, child: %ld\n", (long) getpid(), (long) p);
        pid_t p2 = wait(&(int) {0});
        printf("parent: p == p2? %d\n", p == p2);
    } else {
        printf("child: %ld\n", getpid());
    }
}

示例会话:

parent: 76693
parent: 76693, child: 76694
child: 76694
parent: p == p2? 1

初始(父)进程(76693)调用fork(),这将创建一个新的子进程(76694)。子进程的进程id在父进程的变量p中返回给父进程。值0返回到子进程的变量p中,该变量与父进程的变量p不同(即使它们具有相同的虚拟地址)。为了更好地衡量,父进程等待子进程退出,并验证我们是否获得了预期的子进程ID。

相关问题