fork() 函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
fork() 函数创建进程成功则多了一个PCB,有新的代码和数据,它们中大多数都来自父进程。也就是说,使用 fork() 函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
因此子进程对于父进程
(1)代码共享,因为代码只读。
(2)数据私有,因为进程的独立性。
数据私有:Linux内核采用写时拷贝,并不是每个数据都有多份。
这是因为有个 exec 系列的系统调用,它会勾引子进程另起炉灶。如果创建子进程就要内存拷贝的的话,一执行exec,辛辛苦苦拷贝的内存又被完全放弃了。
因为子进程继承了父进程的PCB,PCB中有PC(程序计数器),所以子进程创建成功后,父子进程都执行。
fork 完成后有两个返回值
(1)0 ,给子进程返回0;
(2)fork 成功后的子进程pid,返回给父进程。给父进程返回pid是由于父子进程是1对多的关系。
测试:
结果为什么打印了6次?
这种现象类似于细胞分裂