📅  最后修改于: 2023-12-03 15:22:18.539000             🧑  作者: Mango
在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()函数会更加灵活一些。