7、fork 精辟剖析
程序如下:
#include <unistd.h>;
#include <sys/types.h>;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
}
结果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
1:
要搞清楚 fork 的执行过程,就必须先讲清楚操作系统中的“进程(process)”概念。一个进程,主要包含三
个元素:
o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context)。
不妨简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程
的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程
的情况。对于单 CPU 的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个
活动的(等待执行或继续执行的)进程。一个称为“程序计数器(program counter, pc)”的寄存器,指出
当前占用 CPU 的进程要执行的下一条指令的位置。当分给某个进程的 CPU 时间已经用完,操作系统将该
进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU 的那
个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context
switch)”,实际的上下文交换需要涉及到更多的数据,那和 fork 无关,不再多说,主要要记住程序寄存器 pc