进程的创建
fork
fork函数用来创建一个子进程
子进程获得父进程的栈、数据段、堆和执行文本段的拷贝
内存节约
需要注意的是,执行文本段其实就是代码段,这个段是父子进程共享的,换句话说,虚拟的进程空间各自有一份,但是指向的物理空间共享一份
还有,对于父进程数据段、堆段和栈段中的各页,内核采用写时复制的技术,简单来说,就是刚开始,父子进程指向的都是一样的,并没有复制,当子进程要修改时,内核才会对这些要修改的页进行拷贝,这个时候,对这些页的修改就不会影响对方了
这两种技术,都是为了节省空间,单纯的复制还是有点浪费了
文件共享
执行fork,子进程会获得父进程的文件描述符的副本,但是指向的文件是一样的,所以父子进程间共享文件偏移量和打开文件状态标志,换句话说,对文件的修改会通知对方
如果不想共享,可以使用以下两种办法
- wait(),让父进程等待子进程结束后,在执行
- 令父子进程使用不同的文件描述符,各自立即关闭不在使用的描述符
竞争条件
fork创建进程后,我们是没办法知道哪一个进程会优先执行,即获得cpu的使用权,这取决于操作系统的进程调度
可以使用信号量、文件锁等方法,不过一般来说是默认父进程为fork之后优先调度的对象
使用方法
fork返回值为-1,表示失败,返回值为0,表示是子进程,剩下的是父进程
switch (fork()) {
case -1:
/* 失败 */
case 0:
/* 子进程 */
default:
/* 父进程 */
}
还有需要注意的是,父子进程的代码段最开始是一样的,然后都是从fork函数的返回点开始执行,也就是说他们都会进入case的情况,然后根据各自的fork的返回值进入不同的case内执行,如果中途没有退出,那么他们都会顺利执行完整个程序,这点很重要
vfork
vfork()因为如下两个特性而更具效率,这也是其与 fork()的区别所在。
无需为子进程复制虚拟内存页或页表。相反,子进程共享父进程的内存,直至其功执行了 exec()或是调用_exit()退出。
在子进程调用 exec()或_exit()之前,将暂停执行父进程。
vfork创建进程后,执行的顺序是确定的,只有等子进程结束,父进程才能执行
并且,vfork创建出的子进程是和父进程共享内存的,但仍存在一些情况,子进程的修改不会影响父进程,比如说对子进程的文件描述符进行操作(如果指向的是同一个打开文件句柄,那还是会有影响的),不过情况很少就对了
需要注意的是,尽管子进程也会有自己的文件流标,但是文件流对应着底层的一个或多个文件描述符,对文件流的操作可能会影响
wait
系统调用 wai(t &status)的目的有二:其一,如果子进程尚未调用 exit()止,那么 wait()会挂起父进程直至子进程终止;其二,子进程的终止状态通过 wait()的 status 参数返回。
execve
系统调用 execve(pathname,argv,envp)加载一个新程序(路径名为pathname,参数列表为 argv,环境变量列表为 envp)到当前进程的内存。这将丢弃现存的程文本段,并为新程序重新创建栈、数据段以及堆。通常将这一动作称为执行(execing)一个新程序。
进程的终止
_exit
_exit()的 status 参数定义了进程的终止状态(termination status),父进可调用 wait()以获取该状态。虽然将其定义为 int 类型,但仅有低 8 位可为父进程所用。按照惯例,终止状态为 0 表示进程“功成身退”,而非 0 值则表示进程因异常而退出。
- EXIT_FAILURE 是1,表示非正常终止
- EXIT_SUCCESS 是0,表示正常终止
需要注意的是_exit(-1)传递给父进程的状态码是255, 因为status仅有低8位有效,即0-255, -1会被视为补码形式
exit
exit()会执行的动作如下
- 调用退出处理程序(通过 atexit()和 on_exit()注册的函数),其 执行顺序与册顺序相反 (就像是栈一样)
- 刷新 stdio 流缓冲区。
- 使用由 status 提供的值执行_exit()系统调用
程序的另一种终止方法是从 main()函数中返回(return),或者或明或暗地一直执行到main()函数的结尾处1。执行 return n 等同于执行对 exit(n)的调用,因为调用 main()的运行时函数会将 main()的返回值作为 exit()的参数。
退出处理程序
退出处理程序执行的顺序与注册顺序 相反
总结
不论程序是正常终止或者异常终止,内核都会执行多个清理步骤,包括关闭所有打开的文件描述符、文件流、目录流等等
标签:fork,文件,创建,进程,exit,linux,终止,执行 From: https://www.cnblogs.com/dylaris/p/18445063