1. 创建子进程:fork函数
函数原型:
#include <unistd.h>
pid_t fork(void);
fork函数创建一个新的进程,即Child process
fork调用一次,却返回两次,分别代表父进程和子进程(初学者往往会有诸多疑问与猜想:为什么会这样?)
很多图书都在尝试解释“为什么fork返回两次的问题”,就笔者的经历来看:最有效的方法莫过于阅读早期的操作系统源代码,譬如《linux 源代码完全剖析》,赵炯著
- fork 举例
#include <iostream>
extern "C"
{
#include <unistd.h>
}
using namespace std;
int main(void)
{
pid_t child = 0;
cout << "origin process" << endl;
if(!(child = fork()))
{
/*child*/
cout << "child process pid =" << child << endl;
}
else
{
/*father*/
cout << "father process" << endl;
}
cout << "Both will excute here" << endl;
return 0;
}
2. 父子进程:内存资源
现代操作系统将进程的虚拟内存通过一种叫做VM区段的技术进行管理。
一个区段与内存关联的属性有:
- 进程可读|可写|可执行
- 进程间共享或者进程私有
进程间共享的VM区段,父进程和子进程访问的是同一块内存
进程所私有的VM区段,父进程和子进程各自有自己的资源拷贝(通常是写时复制技术)
典型的私有VM区段,包括:
可执行文件 .data段 .bss段 Heap Stack
动态链接库 .so文件
3. 父子进程:打开的文件
父进程打开的文件同样会在子进程中被打开,操作系统会在子进程创建时 将文件表项和v节点的引用计数加1