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

int main()
{
    pid_t pid;

    printf("Before fork()\n");

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

    pid = fork();  // 调用 fork()

    printf("After fork()\n");

    if (pid < 0) {
        // fork() 失败
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        // 子进程
        printf("In child process:\n");
        printf("fork() returned: %d (always 0 in child)\n", pid);
        printf("Child process ID: %d\n", getpid());
        printf("Parent process ID: %d\n", getppid());
    } else { //pid > 0
        // 父进程
        printf("In parent process:\n");
        printf("fork() returned: %d (child's PID)\n", pid);
        printf("Parent process ID: %d\n", getpid());
    }

    return 0;
}

Before fork()
8088
After fork()
In parent process:
fork() returned: 8089 (child's PID)
Parent process ID: 8088
After fork()
In child process:
fork() returned: 0 (always 0 in child)
Child process ID: 8089
Parent process ID: 1255

输出顺序

输出顺序(父进程还是子进程先输出)取决于调度器。

fork() 的行为

调用 fork() 后,系统会复制当前的进程,从而产生两个几乎完全相同的进程:

  1. 父进程继续运行,并且 fork() 返回子进程的 PID(在这里是 7802)。
  2. 子进程fork() 调用处开始运行,但 fork() 返回 0

因此,父子进程从 fork() 的下一行开始分别执行。

为什么子进程的父进程 ID 是 1255

这表明:

  • 父进程(PID 7801)在 fork() 调用后已经退出,所以子进程的父进程变成了系统的**init 进程(PID 1255) .
  • init 是 Linux 系统中负责管理孤儿进程的守护进程。