unix c 07
进程的结束函数 (exit、_Exit)
exit 并不是立即退出,退出前执行 用atexit/on_exit函数 注册的函数。
exit(int status)中的status可以用 wait函数获取
_Exit底层调用 Unix的系统调用 _exit,会立即退出,而不会调用任何函数。_Exit的status也可以用wait函数获取。
进程的调度机制(wait/waitpid)
wait和waitpid功能是让 父进程等待子进程,如果没有子进程,会立即返回,如果没有结束的子进程,父进程处于 阻塞状态,如果 子进程结束,父进程取得退出状态码 并返回(包括僵尸子进程)。
区别:
wait是等待所有子进程中的任意一个结束,waitpid可以等待任意一个(pid=-1),也可以指定某一个(pid>0),waitpid的第三个参数一般给0即可。
取退出状态:
用wait(&status)或waitpid(pid,&status,0)可以把退出的信息放入status变量,用WIFEXITED(status)可以判断是否正常退出,用WEXITSTATUS(status)可以取得exit()退出码。
vfork不复制父进程的内存,功能和fork一样,也是创建一个子进程。vfork在创建时 抢占父进程的内存空间。因此vfork 确保子进程先运行。
vfork自身意义不大,一般和exec系列函数结合使用。vfork创建一个新的子进程,exec系列函数提供新的代码区和内存存储空间。(exec系列函数不负责创建新进程,只是进程的替换)
fork是父子进程执行相同的代码段时使用,vfork+exec系列函数是父子进程执行不同的代码段时使用。
信号(signal)
信号是一种软件中断技术,中断就是中止当前正在实行的代码,转而执行其他的代码。
中断分为软件中断和硬件中断。
常见信号:
ctrl+c 2信号 ctrl+\ 信号3 段错误 总线错误
浮点数例外(整数除法0做除数)
信号的本质就是一个整数,有一个宏定义的名字,都是SIG开头,比如2信号 就是SIGINT。
#define SIGINT 2
信号可以在进程间互发,类似于进程间通信。
信号无法确定 何时产生,程序 没法判定信号什么时候会到来。(异步处理)
在Unix系统中,信号主要来自于:硬件产生和函数调用。
Unix和Linux在信号的数值上有区别,但 宏定义是一样的。
kill -l 显示所有的信号(数值和名字)
经验:编程时 信号用 宏定义比较好,有通用性。
信号分为 可靠信号和不可靠信号:
不可靠信号不支持排队,因此当有多个不可靠信号同时到来时,只留下一个,其他会丢失。不可靠信号都是非 实时的,Linux的1-31都是不可靠信号。
可靠信号支持排队,因此不会丢失。可靠信号是 实时的,Linux的34-64 都是可靠信号。
信号的处理方式:
1 默认处理,80%的默认处理都是退出进程。
2 忽略信号
3 自定义信号处理函数。
注:信号9 不能忽略,也不能自定义处理函数。
当前用户只能给自己的进程发信号,root可以给所有进程发信号。
signal函数可以 注册(设定)信号的处理方式。
typedef void (*sighandler_t) (int);
sighandler_t signal(
int signum,sighandler_t);
其中,signum是信号的数值,
sighandler_t是 处理函数的函数指针(函数名)
sighandler_t 的值是SIG_IGN 代表忽略
sighandler_t 的值是SIG_DFL 代表默认
子进程的信号处理
子进程如果是fork方式启动,完全照搬父进程对信号的处理方式。父忽略,子也忽略;父自定义函数,子也会调用相同函数。
如果是vfork+exec方式启动,父忽略,子也会忽略;父自定义函数,子改为默认处理。(子进程找不到父进程的函数)
如何发送信号??
1 键盘直接发送
ctrl+c -> 信号2
ctrl+\ -> 信号3
ctrl+z -> 信号20
2 程序出错
内存没有映射 -> 信号11(段错误)
总线错误 -> 信号7(Linux中)
3 kill 命令
kill -信号 进程ID
4 系统函数(信号发送函数)
raise() kill() alarm() sigqueue()
raise函数只能当前进程发送信号
kill函数更实用。
kill(pid_t pid,int signo)
pid > 0 是指定某个进程(pid)发送
pid == -1 给有授权的所有进程发送
pid == 0 给进程组的所有进程发送
alarm函数设定N秒后产生一个SIGALRM信号(闹钟)
sigqueue函数可以在发送信号的同时附带其他数据
unix c 07的更多相关文章
- UNIX系统的显示时间何时会到达尽头
本文分为三个小块: 一.UNIX系统中时间的存储形式: 二. time_t 的最大值是多少: 三. 将time_t 的最大值转化为真实世界的时间: #---------------------# # ...
- 转:浅谈UNIX下Apache的MPM及httpd.conf配置文件中相关参数配置
为什么要并发处理 以Apache为代表的web服务器中,如果不支持并发,则在一个客户端连接的时候,如果该客户端的任务没有处理完,其他连接的客户端将会一直处于等待状态,这事不可想象的,好像没有为什么要不 ...
- js 取得 Unix时间戳(Unix timestamp)
js 取得 Unix时间戳 Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间19 ...
- 转: unix实际用户ID和有效用户ID解析
今天在看APUE,这两个问题很难理解,GOOGLE一下,有篇文章总结的不错,看了一下才明白透彻了. 由于用户在UNIX下经常会遇到 SUID.SGID的概念,而且SUID和SGID涉及到系统安全,所以 ...
- 读《UNIX编程艺术》一感
我记得早在2006年的时候就开始频繁使用awk做文本处理方面的工作,07年的时候周围有人用perl,我还感到很不解,觉得写得很复杂,没有awk one liner 那么方便和神奇.一直在了解awk的具 ...
- multiple definition of `err_sys' 《UNIX环境高级编程》
本文地址:http://www.cnblogs.com/yhLinux/p/4079930.html 问题描述: [点击此处直接看解决方案] 在练习<UNIX环境高级编程>APUE程序清单 ...
- 编写 unix和 windows的 Scala 脚本
编写 unix和 windows的 Scala 脚本 今天在看<Scala 编程>的时候看到附录了,里面提到了怎么在 unix 和 windows 下面编写 scala 脚本. 之前我也一 ...
- Linux/UNIX 定时任务 cron 详解
定时任务( job)被用于安排那些需要被周期性执行的命令.利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行.cron 是 Linux 或者类 Unix 系统中最为实用的工具之一 ...
- UNIX Time 时间戳 与 北京时间 相互转换
typedef struct t_xtime { int year; int month; int day; int hour; int minute; int second; } _xtime ; ...
随机推荐
- 第31讲 UI组件之 Gallery画廊控件
第31讲 UI组件之 Gallery画廊控件 1.Gallery的简介 Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息.Gallery只 ...
- mybatis重拾---部署官方demo
学习一个框架,个人认为不是从什么start開始.而是从官方的demo開始,先将demo跑起来,了解到这个框架做了什么.能够实现那些功能.对框架有了一个总体的宏观概念! demo看得差点儿相同后再看官方 ...
- Network 20Q--Q2 How does Google sell ad spaces?
在使用Google搜索的时候会发现,搜索出来的页面除了在左边显示搜索结果以外,还会页面的右边推荐一些广告.那么Google是怎么从这些广告挣钱以及广告商可以通过Google广告获得什么利益呢? Goo ...
- Picasso – Android系统的图片下载和缓存类库
Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目.该项目和其他一些下载图片项目的主要区别之一是:使用4.0 ...
- ulimit 参数介绍
Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限制.下面我把某linux用户的最 ...
- 应用highcharts做直观数据统计
最近在看上了统计类的东东,发现以前端图表神器:highcharts Highcharts是一款功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯Js图表库,Highcharts支持的图表类型有直线 ...
- asp.net mvc 页面缓存
在任务中需要实现点击浏览器back按钮,加载的前一页面需要强制刷新. 想要在前端通过js来绑定数据实现,但是觉得太麻烦,还是用另一种方式来解决: 不缓存该页面. 简单易懂: Response.Cach ...
- 如何禁用不需要的HTTP方法
IIS7.0默认开启了不安全的OPTIONS和TRACE方法,建议关闭这两个方法. 以下环境为windows server 2008.IIS7.0 方法(1):web.config 在<conf ...
- 3D图片采集与展示(SurfaceView 自适应 Camera, 录制视频, 抽取帧)
最近在做一个3D图片采集与展示. 主要功能为:自定义Camera(google 已经摈弃了Camera, 推荐使用Camera2,后续篇幅,我将会用Camera2取代Camera),围绕一个物体360 ...
- 《第一行代码》学习笔记21-Git
Git(1) 1.Git是一个开源的分布式版本控制工具,其开发者是Linux操作系统的作者Linus Torvalds. 2.仓库(Repository)是用于保存版本管理所需要信息的地方,所有本地提 ...