<aside> 💡 系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型

</aside>

fork——创建子进程

<aside> 💡 当 fork 成功后,父进程和子进程开始并发执行

</aside>

Untitled

返回值

Untitled

<aside> 💡 fork()的返回值会返回两次。一次在父进程中,一次在子进程中。

</aside>

如何区分父进程和子进程:通过fork的返回值(子进程返回0,父进程返回一个>0的值)

典型用法

pid_t pid = fork();

if (pid < 0) {
    // 处理 fork 失败的情况
} else if (pid == 0) {
    // 子进程的代码
} else {
    // 父进程的代码
}

案例

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

int main() {

    int num = 10;

    // 创建子进程
    pid_t pid = fork();

    // 判断是父进程还是子进程
    if(pid > 0) {
        // 如果大于0,返回的是创建的子进程的进程号
        // 当前是父进程,子进程无法执行其中代码(进程隔离)
        printf("i am parent process, pid : %d, ppid : %d\\n", getpid(), getppid());

        printf("parent num : %d\\n", num);
        num += 10;
        printf("parent num += 10 : %d\\n", num);

    } else if(pid == 0) {
        // 当前是子进程,父进程无法执行其中代码
        printf("i am child process, pid : %d, ppid : %d\\n", getpid(),getppid());
       
        printf("child num : %d\\n", num);
        num += 100;
        // 父进程中对num的操作不会影响子进程中的num,此处返回110
        printf("child num += 100 : %d\\n", num);
    }

    // for循环,父子进程都会执行
    for(int i = 0; i < 3; i++) {
        printf("i : %d , pid : %d\\n", i , getpid());
        sleep(1);
    }

    return 0;
}