fork()如何知道它是在子进程中还是在父进程中?

use*_*412 2 c linux operating-system

执行fork()系统调用时,处理器将进入内核模式.因此,在fork调用结束时,新进程产生了堆栈,用户数据和用户程序的副本.那么fork如何在此时决定它是否在子进程中返回0并且如果它是主父进程那么它必须返回子进程的PID.

fork()被调用两次?请解释.我很迷惑 !!!

mil*_*non 6

fork()被调用时,一个进程生成具有共享或复制过程段子进程.这意味着在程序中,在fork()调用之前,只有一个进程或一个执行单元.之后fork()的回报,也有同时运行两个进程.由于此时两个进程都具有相同的调用堆栈,因此它会将每个进程视为刚刚调用的进程fork().在父进程中,返回值fork()是子进程的PID.在子进程中,返回值为fork()0.

你可以通过一个非常简单的演示来看到这个:

#include <unistd.h>
#include <stdio.h>

int main(){
    pid_t parent = getpid();
    pid_t child = fork();

    if(child != 0){
        printf("I am the parent process. My PID is %d\n", parent);
        printf("Parent process terminating\n");
    }
    else{
        printf("I am the child process. My PID is %d\n", getpid());
        printf("    My parent's PID is %d\n", parent);
        printf("Child process terminating\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的笔记本电脑上运行的示例:

$ gcc -o fork fork.c
$ ./fork
I am the parent process. My PID is 16048
Parent process terminating
I am the child process. My PID is 16049
    My parent's PID is 16048
Child process terminating
$
Run Code Online (Sandbox Code Playgroud)

请注意,运行此时,PID将不同.此外,输出受竞争条件的影响,因此有时,父进程将在子进程完成打印之前返回到shell,因此它可能如下所示:

$ ./fork
I am the parent process. My PID is 16265
Parent process terminating
$ I am the child process. My PID is 16266
    My parent's PID is 16265
Child process terminating
Run Code Online (Sandbox Code Playgroud)

重要的是要理解的是,fork()将单个执行过程分成两个独立的单元.由于每个进程仍然是从同一程序(或源代码)生成的,因此两个进程的行为相同.它们的输出不同的原因仅在于fork()为父进程或子进程返回不同的值.

  • 第一个(父)进程调用`fork()`系统调用,操作系统计算出如何创建具有相同结构的第二个(子)进程.这是依赖于操作系统的,但我们可以假设任何操作系统都有一种方法可以跟踪哪些进程正在运行.由于系统调用能够像函数一样返回值,因此系统调用将子PID返回到父进程,并将0返回到子进程.它通过内部流程簿记知道返回哪个流程的值. (2认同)