fork系统调用
- fork系统调用用于创建进程
- fork创建的进程初始化状态与父进程一样(对于进程有进程空间,包括内存以及内核态等,初始化时一模一样,包括他们拥有的变量、逻辑空间等)
- 系统为fork进程分配新的资源(包括CPU、内存资源等)
fork系统调用没有参数,fork调用一次会返回两次,分别是子进程id是父进程,返回的0是子进程。返回两次是因为当时有fork系统调用的时候,子进程初始化和父进程一模一样,子进程也拥有fork的逻辑,所以会返回两次。第一次由父进程所返回,第二次由子进程所返回。
fork_demo
//
// Created by 文若 on 2020/9/5.
//
#include <iostream>
#include <unistd.h>
using namespace std;
int main() {
// 定义进程id
pid_t pid;
int num = 666;
pid = fork();
// 对返回进行判断
if (pid == 0) {
cout << "这是一个子进程||";
cout << "子进程中的num:" << num << endl;
for (int i = 0; i < 5; ++i) {
num += 1;
cout << num << " ";
}
} else if (pid > 0) {
cout << "这是一个父进程||" << "子进程id" << pid << "||父进程中的num:" << num << endl;
for (int i = 0; i < 5; ++i) {
num -= 1;
cout << num << " ";
}
cout << endl;
} else {
cout << "创建进程失败" << endl;
}
return 0;
}
输出结果:
这是一个父进程||子进程id2926||父进程中的num:666
665 664 663 662 661
这是一个子进程||子进程中的num:666
667 668 669 670 671
打印结果分析
- 虽然进行了条件判断,仍旧输出了父进程和子进程两种情况,说明fork函数确实返回两次。
- num的初始值在父进程和子进程中一样,说明了fork调用初始化状态一模一样
- 但是子进程不继承父进程,可以看到父子进程分别对num进行不同的逻辑操作,他们的运算结果也是不同的。