<aside> 💡 系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型
</aside>
<aside>
💡 当 fork
成功后,父进程和子进程开始并发执行
</aside>
<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;
}