例程

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
int status,i;
fpid=fork();
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
sleep(10);
printf("I am the child process, my process id is %d\n",getpid());
count++;
exit(123);
}
else {
printf("I am the parent process, my process id is %d\n",getpid());
count++;
int res = wait(&status);
i = WEXITSTATUS(status);
printf("The child exits status:%d\n", i);
}
printf("count is: %d\n",count);
return 0;
}

编译执行上面的代码,然后,删除下面两行代码再次编译执行。

int res = wait(&status);
i = WEXITSTATUS(status);

对比两次执行结果,很容易发现wait的作用:让父进程等待子进程执行结束并且接收子进程的退出状态。

什么场景需要用到wait?当子进程和父进程协同完成一项任务并且在父进程中汇总任务结果的时候。

本文的主题,便是探讨如何实现wait和exit。

wait

在父进程中使用wait。流程如下:

  1. 父进程没有子进程,调用wait后,不阻塞父进程,父进程按照正常流程执行。
  2. 父进程有子进程,但是所有子进程的状态都不是“挂起”状态,把父进程设置成“等待”状态。
  3. 父进程有子进程,而且这个子进程的状态是“挂起”状态,回收子进程占用的进程表,并且解除父进程的阻塞。

exit

在子进程中使用exit。流程如下:

  1. 子进程是C,父进程是P。
  2. 遍历进程表数组,找到进程P。
  3. 如果P是“等待“状态,回收C占用的进程表,解除P的阻塞。
  4. 如果P不是”等待“状态,把C设置为”挂起“状态。
  5. 还没有结束,还需要处理C的子进程。
  6. 把C的子进程”过继“给INIT进程。
  7. INIT进程是什么进程?所有的进程都通过这个进程调用fork产生。
  8. 所谓”过继“,就是把子进程的父进程由C设置成INIT。
  9. 接着判断INIT的状态是否为”等待“状态,然后判断子进程的状态是否为”挂起“状态。
  10. 如果答案都是”是”,把INIT进程设置成”运行“态,回收子进程。
  11. C的其他子进程调用了exit,怎么处理?
  12. 使用一个循环,循环体内,INIT进程调用wait。如此,INIT进程能不断处理调用了exit的其他子进程。

怎么实现系统调用wait和exit的更多相关文章

  1. [Linux]系统调用理解(2)

    本文介绍了Linux下的进程概念,并着重讲解了与Linux进程管理相关的4个重要系统调用getpid,fork,exit和_exit,辅助一些例程说明了它们的特点和使用方法. 关于进程的一些必要知识 ...

  2. 基于int的Linux的经典系统调用实现

     先说明两个概念:中断和系统调用 一 系统调用: 是应用程序(运行库也是应用程序的一部分)与操作系统内核之间的接口,它决定了应用程序是如何和内核打交道的. 1,  Linux系统调用:2.6.19版内 ...

  3. _exit和exit的区别

    在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf .fopen .fread .fwrite都在此列,他们也被称作缓冲I/O.其特征是对应每一个打开的文件,都存在一个缓冲 ...

  4. XV6源代码阅读-中断与系统调用

    Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混合编写成的XV6引导加载器.boo ...

  5. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  6. linux服务之audit

    http://blog.chinaunix.net/uid-20786165-id-3167391.html http://blog.chinaunix.net/uid-8389195-id-1741 ...

  7. 33c3-pwn350-tea

    TEA 感觉这个题目出得很不错.先运行程序了解基本功能,程序可以读取对系统上存在的文件的内容,如果文件不存在的话,直接退出. 使用IDA打开后,发现父进程通过clone api克隆出一个子进程,主要的 ...

  8. Linux性能及调优指南(翻译)之Linux进程管理

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

  9. linux audit审计(7)--读懂audit日志

    让我们先来构造一条audit日志.在home目录下新建一个目录,然后配置一条audit规则,对这个目录的wrax,都记录审计日志: auditctl -w /home/audit_test -p wr ...

随机推荐

  1. 黎曼曲面Riemann Surface

    黎曼曲面Riemann Surface A Riemann surface is a surface-like configuration that covers the complex plane  ...

  2. python+selenium基础篇,cookie绕过验证码小案例

    1.绕过验证码有许许多多的方法,笔者在此介绍其中的一个小方法,原理其实就是获取已登陆了之后的凭证(会话保存在本地的cookie中)再打开另一个页面的使用 2.F12(浏览器开发者调试工具)可以查看的需 ...

  3. 5, java数据结构和算法: 栈 , 入栈, 出栈, 正序遍历,,逆序遍历

    直接上代码: class ArrayStack{ //用数组模拟栈 int maxSize; int[] stack; int top = -1;//表示栈顶 public ArrayStack(in ...

  4. MySQL笔记01(黑马)

    一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...

  5. springboot异常错误处理

    1.在有模板引擎的情况下: springboot会默认找 templates/error/错误状态码.html,所以我们要定制化错误页面就可以到templates/error下创建一个[对应错误状态码 ...

  6. 使用regulator_get时的一个小注意事项

    Linux kernel 使用 regulator 框架来管理电源,比如 PMIC 芯片上常见的LDO.使用 regulator 的常规流程如以下代码所示: void set_vbus_voltage ...

  7. 【题解】Luogu P2214 [USACO14MAR]哞哞哞Mooo Moo

    P2214 [USACO14MAR]哞哞哞Mooo Moo 题目描述 Farmer John has completely forgotten how many cows he owns! He is ...

  8. csp-s模拟测试42「世界线·时间机器·密码」

    $t3$不会 世界线 题解 题目让求的就是每个点能到点的数量$-$出度 设每个点能到的点为$f[x]$ 则$f[x]=x \sum\limits_{y}^{y\in son[x]} U f[y]$ 用 ...

  9. 循序渐进BootstrapVue,开发公司门户网站(3)--- 结合邮件发送,收集用户反馈信息

    在我们公司门户网站里面,如果有需要,我们可以提供一个页面给用户反馈信息,以便获得宝贵的用户信息反馈或者一些产品咨询的记录,一般这个结合邮件发送到负责人的邮箱即可.本篇随笔结合后端发送邮件的操作,把相关 ...

  10. 快速串讲——JVM内存的区域划分

    目的 快速定位JVM内存泄漏或者溢出等问题. 面试基础题,加分项. 文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍. 程序计数器(Progra ...