《UNIX环境高级编程》(fork和vfork)
fork
声明
特性
调用fork可以创建一个新的进程;
fork有两个返回值:
返回0给子进程(原因是每个进程只有一个父亲,子进程可以通过getppid去得到父进程的ID,进程ID 0是预留给内核使用的,所以子进程的ID不可能是0);
返回子进程的进程ID给父进程(一个进程可以有一个或多个子进程,但是没有API可以获取子进程的进程ID);- 子进程是父进程的一份拷贝,子进程会复制父进程的数据空间、堆、栈。它们之间不会共享这部分的内容,它们只会共享正文段(正文段,你可以把它理解成代码段,相当于子进程拷贝了父进程的代码);
- 一般来说,fork之后,是父子进程先后执行的顺序是不确定的。这个取决于内核的调度算法;
文件共享
- 特性
父进程所有打开的文件描述符都被复制到子进程中 - fork之后常用的两种处理文件描述符的情况
- 父进程等待子进程完成
- 父子进程各自执行不同的程序段,通常用在网络服务进程中
- 特性
fork失败的两个原因
- 系统中有太多的进程
- 该实际用户ID的进程总数超过了系统限制
vfork
作用
用于创建一个新的进程特性
- 调用序列和返回值与fork相同;
- vfork出来的子进程,不会将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),所以就需要访问地址空间。但是在子进程调用exec(或exit)之前,它在父进程的空间中运行;
- vfork保证子进程先运行,当子进程执行完exec(或exit)后,父进程才会运行。但这有可能会造成死锁,比如,子进程里有依赖父进程的进一步的操作;