一、函数fork

#include<unistd.h>

pid_t  fork(void)                                                                    子进程返回0,父进程返回子进程ID,出错返回-1

fork函数被调用一次,返回两次。先返回父进程还是子进程是不确定的,取决于内核使用的调度算法。

子进程和父进程并不共享存储空间,而是共享正文段。因此,子进程对变量所做的改变并不影响父进程中该变量的值。

父进程和子进程共享同一个文件偏移量。fork之后处理fd的两种情况:

(1)父进程等待子进程完成,当子进程完成操作后,它们任一共享的fd的文件偏移量,已经更新,父进程可以接着子进程继续工作。

(2)父进程和子进程各自执行不同的程序段,fork之后,父进程和子进程各自关闭它们不需要使用的fd,这样就不会干扰对方使用的fd,否则产生的文件偏移量会共享给对方,由于是执行不同的程序段,所以会产生干扰。(常用于网络服务进程,Socket通信中的server)

父进程与子进程的区别如下:

v    fork的返回值不同

v    进程ID不同

v    两个进程的父进程ID不同

v    子进程的tms_utime、tms_stime、tms_cutime、tms_ustime、的值设置为0.

v    子进程不继承父进程设置的文件锁。

v    子进程的未处理闹钟被清除。

v    子进程的未处理信号集设置为空集。

标准fork用法示例:已备后续查看

#include "apue.h"int             globvar = 6;            /* external variable in initialized data */
char    buf[] = "a write to stdout\n";int
main(void)
{int             var;            /* automatic variable on the stack */pid_t   pid;var = 88;if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)err_sys("write error");printf("before fork\n");        /* we don't flush stdout */if ((pid = fork()) < 0) {err_sys("fork error");} else if (pid == 0) {          /* child */globvar++;                              /* modify variables */var++;} else {sleep(2);                               /* parent */}printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar,var);exit(0);
}

二、函数vfork

与fork的区别:

(1).vfork也是创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为vfork的目的是让子进程立即exec一个启动例程,这样,它也就不会引用该地址空间。

(2).vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行,否则,会导致死锁。而fork之后父进程和子进程谁先执行是不确定的。

三、函数exit

进程的8种终止状态:

正常终止为:

(1).从main返回

(2).调用exit

(3)调用_exit或_Exit

(4)最后一个线程从其启动例程返回

(5)从最后一个线程调用pthread_exit

异常终止为:

(6)调用abort

(7)接到一个信号终止

(8)最后一个线程对取消请求做出响应

在任意一种情况下,该终止进程的父进程都能用wait或waitpid函数取得其终止状态。

有意思的两种情况:

(1).父亲先死:

如果父进程在子进程之前终止,那么这些子进程的父进程变为init进程,称这些子进程由init进程收养。(这里很有意思,就是说如果父亲在儿子之前死了,那么这些孩子都会被init这个孤儿收容所所认,都成了init的儿子。)

父进程30314 fork了子进程30315

kill -9 30314 我们杀死父亲之后,

果然,子进程被init进程收养,并在sleeping状态。

(2).儿子先死

如果子进程完全消失了,父进程在最终准备好检查子进程是否终止时是无法获取它的状态的,内核为每个终止子进程保存了一定量的信息,所以父进程调用wait或waitpid可以得到这些信息。在Unix中,如果父进程无法获取子进程的终止状态,那么这些子进程会变为僵死进程。(形象的说,如果父亲不负责任,他对自己儿子的死一无所知,那么这个孩子死不瞑目,变为僵死状态。)

这回我们还是先fork一个子进程,kill -9 30425 ,先杀死儿子,我们看到父进程还在后台运行,由于我们用kill -9属于“偷偷”杀死的儿子,父亲无法获取儿子的死讯,因此,儿子变为僵死进程。

此外,init被编写成无论何时只要有一个子进程终止,init就会调用一个wait函数取得其终止状态。防止在系统中塞满僵死进程。

转载于:https://www.cnblogs.com/webber1992/p/5850759.html

Unix高级环境编程—进程控制(一)相关推荐

  1. Unix高级环境编程 学习小结(一)

    这个系列的博客主要是针对Unix高级环境编程的内容做一个小结,针对的是面试中经常问道或者可能问到的问题. Unix体系结构: 环境的核心是内核,内核的接口被称为系统调用,公用函数库建立在系统调用接口只 ...

  2. 《UNIX高级环境编程》 -- apue.h

    在看<UNIX高级环境编程>这本书的时候,会遇到一个问题就是这个"apue.h",这个是作者为了编写代码方便封装了一个库,我们可以使用下面的方式解决这个问题,让我们的代 ...

  3. UNIX高级环境编程—第八章进程控制

    第八章-进程控制 1进程相关概念 1.1 程序和进程 1.2 并行和并发 1.3 进程控制块 1.4 进程标志 1.5进程状态(面试考) 2 创建进程 2.1 fork函数 2.2 ps命令和kill ...

  4. Unix高级环境编程

    [07] Unix进程环境 ================================== 1. 进程终止     atexit()函数注册终止处理程序.     exit()或return语句 ...

  5. unix高级环境编程-基础知识

    对于一个从C#转向Linux/unix系统开发的菜鸟,中间无数次的焦头烂额只有自己心理明白,所幸我没有在大风大浪中凋零破碎,依然坚挺着我的学习之路. Unix操作系统结构: UNIX ,是一个强大的多 ...

  6. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...

    本章包含内容有: 创建新进程 程序执行(program execution) 进程终止(process termination) 进程的各种ID 1 进程标识符(Process Identifiers ...

  7. UNIX高级环境编程 第11、12章 线程同步及属性

    第11.12章 线程及其控制 主要内容 互斥量 非递归互斥量 递归互斥量 读写锁 条件变量 自旋锁 屏障 互斥量 int pthread_mutex_init(pthread_mutex_t *res ...

  8. UNIX高级环境编程 第3章 文件IO

    3.3 函数open和openat open int open(const char *pathname, int flags);int open(const char *pathname, int ...

  9. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

最新文章

  1. 用了5年的旧笔记本不要丢,1/4新机价格升级机器学习战斗本,隔壁研究员都馋哭了...
  2. oracle学习笔记一
  3. 理解并取证:DLS网络架构和PPPOE数据帧
  4. 【酷熊科技】工作积累 ----------- 在unity3d里怎样隐藏物体
  5. Repeater,DataList,DataGrid 【转】
  6. RHEL5远程部署操作指导手册
  7. Atitit避免出现空指针异常解决方案
  8. 新浪财经三人行:专家谈萨班斯法案聊天实录
  9. django微信公众号开发入门详细指南
  10. r语言和python语法对比_R语言和Python区别对比,你会选择哪一个?
  11. FOI对象中显示labels --Oracle Map
  12. 【硬见小百科】二极管和三极管的命名原则
  13. 修改注册表为当前用户和默认用户添加日文输入法
  14. Kth Largest Element
  15. go学习笔记之bufio的使用
  16. python输入一个三位整数、求逆序数_输入一个三位正整数,要求其输出对应的逆序数...
  17. 电子器件系列26:el 375n光耦 电气特性参数
  18. Jenkins定时发布项目
  19. 农村土地确权之调查公示 ——二轮公示前数据检查说明
  20. vue实现省市区三级联动地址选择

热门文章

  1. php 最大数字,PHP 计算至少是其他数字两倍的最大数的实现代码
  2. matlab打开显示系统错误,win7系统笔记本运行Matlab软件弹出已停止工作错误窗口的解决方法...
  3. php 应用程序错误,php – 应用程序中的错误处理函数
  4. Verilog设计实例(6)基于Verilog的各种移位寄存器实现
  5. 关于XDC约束文件,你需要知道的几点
  6. DSP专家给你一个选择FPGA的理由(让人看了热血沸腾的一篇科普文章)
  7. 如何插入页面,PDF怎么插入页面
  8. 《Android应用开发》——1.3节配置Eclipse
  9. Haproxy+Keepalived实现网站双主高可用-理论篇
  10. 学习和在生产环节使用d语言的三个条件