fork函数,在我的前几篇博客中已经使用,在这篇博客里我们具体谈谈fork函数的相关知识
1. fork函数的说明如下
fork的功能是创建一个子进程,并且返回两个值,对于父进程返回子进程的PID,对于子进程返回0,这些在前面都说过了,不再浪费时间。
当进程调用fork时,内核会做的事情如下
- 分配新的内存块和内核数据结构给子进程
- 将父进程的部分数据结构内容拷贝至子进程
- 添加子进程到系统进程列表中
- fork返回,由调度器调度两进程运行。
当我们运行一个有fork()的程序时,其实运行了两个进程,不过要注意的是除非在代码中体现了对两进程运行顺序的管理,否则,谁先指向完全由调度器决定。
fork()的创建子进程的机制为写时拷贝
表现为:父子代码共享,父子不再写入的变量,数据也是共享的,当任意一方试图写入时,便以写时拷贝的方式各自有一份副本。
这种方法的好处是,节省资源,且加快创建时间。
fork常规用法
- 利用if等条件判断语句,让父子进程分别执行不同的代码段
- 一个进程执行不同的程序,利用exec函数实现。
失败可能原因 - 系统有太多进程
- 实际用户的进程超过了限制
进程终止
进程终止有三种情况
- 代码运行完成,结果正确
- 代码运行完成,结果错误
- 代码异常
一个代码运行完毕后,会对系统返回退出码,可以用指令echo $?查看最近一次的进程退出码,进程退出码是返回给操作系统用于判断进程情况的。
值和main()函数的返回值相同,在linux中用execl()或者_execl()
也能结束函数,返回退出码,不同的是,
exit()函数在调用exit 系统调用前要检查文件的打开情况,把文件缓冲区中的内容写回文件。_execl直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构,无论在main函数或者在其他函数中。