📜  使用fork()产生1个父级及其3个子进程(1)

📅  最后修改于: 2023-12-03 15:22:18.539000             🧑  作者: Mango

使用fork()产生1个父级及其3个子进程

在Unix/Linux系统中,fork()函数用来产生一个新的进程。在fork()函数被调用后,系统将父进程的所有数据复制一份给子进程,并使两个进程在不同的地址空间内执行。在这个过程中,子进程获得父进程的全部变量、环境以及程序执行状态,但并不继承父进程的线程。

下面给出一个使用fork()函数产生1个父进程及其3个子进程的示例代码:

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

int main() {
    pid_t child1, child2, child3;

    child1 = fork(); // 第一个子进程
    if (child1 == 0) {
        printf("Child process 1: PID=%d\n", getpid());
        sleep(3);
        exit(0);
    }

    child2 = fork(); // 第二个子进程
    if (child2 == 0) {
        printf("Child process 2: PID=%d\n", getpid());
        sleep(3);
        exit(0);
    }

    child3 = fork(); // 第三个子进程
    if (child3 == 0) {
        printf("Child process 3: PID=%d\n", getpid());
        sleep(3);
        exit(0);
    }

    printf("Parent process: PID=%d\n", getpid());
    printf("Waiting for child processes...\n");

    waitpid(child1, NULL, 0);
    waitpid(child2, NULL, 0);
    waitpid(child3, NULL, 0);

    printf("All child processes have exited.\n");

    return 0;
}

这段代码的执行结果如下:

Child process 1: PID=2484
Child process 2: PID=2485
Child process 3: PID=2486
Parent process: PID=2483
Waiting for child processes...
All child processes have exited.

在这段代码中,首先创建了三个子进程child1、child2和child3,分别使用fork()函数产生。在每个子进程中,输出子进程的PID,然后调用sleep(3)函数使子进程睡眠3秒后退出。

在父进程中,输出自己的PID和"Waiting for child processes...",然后使用waitpid()函数等待子进程的退出。最后输出"All child processes have exited."。

需要注意的是,这个示例代码使用了waitpid()函数来等待子进程的退出。waitpid()函数可以阻塞等待指定PID的子进程退出,并将子进程的返回状态保存到第二个参数中。如果不需要等待子进程的退出,可以使用wait()函数。不过,在父进程同时等待多个子进程退出时,waitpid()函数会更加灵活一些。