怎么实现系统调用wait和exit
例程
#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。流程如下:
- 父进程没有子进程,调用wait后,不阻塞父进程,父进程按照正常流程执行。
- 父进程有子进程,但是所有子进程的状态都不是“挂起”状态,把父进程设置成“等待”状态。
- 父进程有子进程,而且这个子进程的状态是“挂起”状态,回收子进程占用的进程表,并且解除父进程的阻塞。
exit
在子进程中使用exit。流程如下:
- 子进程是C,父进程是P。
- 遍历进程表数组,找到进程P。
- 如果P是“等待“状态,回收C占用的进程表,解除P的阻塞。
- 如果P不是”等待“状态,把C设置为”挂起“状态。
- 还没有结束,还需要处理C的子进程。
- 把C的子进程”过继“给INIT进程。
- INIT进程是什么进程?所有的进程都通过这个进程调用fork产生。
- 所谓”过继“,就是把子进程的父进程由C设置成INIT。
- 接着判断INIT的状态是否为”等待“状态,然后判断子进程的状态是否为”挂起“状态。
- 如果答案都是”是”,把INIT进程设置成”运行“态,回收子进程。
- C的其他子进程调用了exit,怎么处理?
- 使用一个循环,循环体内,INIT进程调用wait。如此,INIT进程能不断处理调用了exit的其他子进程。
怎么实现系统调用wait和exit的更多相关文章
- [Linux]系统调用理解(2)
本文介绍了Linux下的进程概念,并着重讲解了与Linux进程管理相关的4个重要系统调用getpid,fork,exit和_exit,辅助一些例程说明了它们的特点和使用方法. 关于进程的一些必要知识 ...
- 基于int的Linux的经典系统调用实现
先说明两个概念:中断和系统调用 一 系统调用: 是应用程序(运行库也是应用程序的一部分)与操作系统内核之间的接口,它决定了应用程序是如何和内核打交道的. 1, Linux系统调用:2.6.19版内 ...
- _exit和exit的区别
在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf .fopen .fread .fwrite都在此列,他们也被称作缓冲I/O.其特征是对应每一个打开的文件,都存在一个缓冲 ...
- XV6源代码阅读-中断与系统调用
Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混合编写成的XV6引导加载器.boo ...
- Linux 线程与进程,以及通信
http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...
- linux服务之audit
http://blog.chinaunix.net/uid-20786165-id-3167391.html http://blog.chinaunix.net/uid-8389195-id-1741 ...
- 33c3-pwn350-tea
TEA 感觉这个题目出得很不错.先运行程序了解基本功能,程序可以读取对系统上存在的文件的内容,如果文件不存在的话,直接退出. 使用IDA打开后,发现父进程通过clone api克隆出一个子进程,主要的 ...
- Linux性能及调优指南(翻译)之Linux进程管理
本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...
- linux audit审计(7)--读懂audit日志
让我们先来构造一条audit日志.在home目录下新建一个目录,然后配置一条audit规则,对这个目录的wrax,都记录审计日志: auditctl -w /home/audit_test -p wr ...
随机推荐
- Linux内存技术分析(下)
Linux内存技术分析(下) 五.内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 page 管理 slab(kmalloc.内存池) 用 ...
- 激光雷达lidar与点云数据
激光雷达lidar与点云数据 DEM是分布和显示数字地形的首个广泛使用的机制. 点云是在空间中随机放置的3D点的集合.传感器发出能量脉冲并乘以其返回行程(TWTT,双向行程时间).知道了传感器的位置以 ...
- Spring Cloud05: Zuul 服务网关
一.什么是Zuul 服务网关 Zuul 是 Netflix 提供的⼀个开源的 API ⽹关服务器,是客户端和⽹站后端所有请求的中间层,对外开放 ⼀个 API,将所有请求导⼊统⼀的⼊⼝,屏蔽了服务端的具 ...
- C#开发之基于NPOI的操作Excel开发体验
最近遇到一个数据导入的需求,语言是.net framework 4.7的C#.但是,这次主要探讨NPOI的体验,原则就是向前兼容.所以采用.xls的支持.网上的资料,我稍微整合了一些. #1 单元格下 ...
- 【NX二次开发】多功能对话框UF_UI_message_dialog
多功能对话框 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_initialize(); ...
- 一篇文章带你吃透,Java界最神秘技术ClassLoader
ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里.网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人.本文我带读者彻底吃透 ...
- ubuntu初识
简单的Linux系统理解 Ubuntu ctrl+alt 可以令虚拟机释放鼠标,回到主系统中. 如果ubuntu有问题,如何重装? -------直接删除目录.虚拟机内的操作不会影响到宿主机. 1.挂 ...
- codeforeces 845B
题解 codefores 845B 原题 Luba has a ticket consisting of 6 digits. In one move she can choose digit in a ...
- Python语言规范之Pylint的使用
1.Pylint是什么 pylint是一个Python源代码中查找bug的工具,能找出错误,和代码规范的运行.也就是你的代码有Error错误的时候能找出来错误,没有错误的时候,能根据Python代码规 ...
- [Linux网络、命名空间、veth设备对、docker的host模式、container模式、none模式、brideg模式、网桥的增删查,容器与网桥的连接断开]
[Linux网络.命名空间.veth设备对.docker的host模式.container模式.none模式.brideg模式.网桥的增删查,容器与网桥的连接断开] 网络名称空间 为了支持网络协议栈的 ...