5.1 fork函数
fork函数是unix唯一的进程创建方法
#include "unistd.h"
pid_t fork(void);
/*在子进程中为0,在父进程中为子进程的ID,若出错则为-1*/
fork在子进程返回0而不是父进程的进程ID的原因是:任何子进程只有一个父进程,而且子进程总是可以通过调用getppid取得父进程的进程ID。相反,父进程可以有许多子进程,而且无法获取各个子进程的进程ID。如果父进程想要跟踪所有子进程的进程ID,那么它必须记录每次调用fork的值。
5.1.1 fork有两个典型的用法:
-
一个进程创建一个自身的副本,这样每个副本都 可以在另一个副本执行其他任务的同时处理各自的某个操作。 这是网络服务器的典型用法;
-
一个进程想要执行另一个程序。既然创建新进程的唯一办法是调用fork, 该进程于是首先调用fork创建一个自身的副本,然后另一个副本(通常为子进程)调用exec把自身替换成新的程序。 这是shell之类程序的典型用法;
5.1.2 fork函数做了什么?
使用 fork() 函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间:包括进程上下文(进程执行活动全过程的静态描述)、进程堆栈、打开的文件描述符、信号控制设定、进程优先级、进程组号等。子进程所独有的只有它的进程号,计时器等(只有小量信息)。因此,使用 fork() 函数的代价是很大的。
简单来说, 一个进程调用 fork() 函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己,并且执行特定的业务。