Linux学习笔记19——信号2
上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数。
一 sigaction函数的作用
定义在接收到参数sig指定的信号后应该采取的行动,声明如下:
#include <signal.h> int sigaction(int sig, //指定动作的信号码
const struct sigaction * act, //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信号相关的动作
struct sigaction *oact //负责接收与信号相关的前一个动作,如果为NULL,对sigaction的调用就不会返回与信号相关的前一个动作
);
我们注意到,上面的参数中出现了struct sigaction的结构,该结构体的成员如下:
struct sigaction{ void (*sa_handler)(int); //SIG_DFL,SIG_IGN或者指向函数的指针,SIG_DFL的值说明sigaction应该恢复信号的默认行为,
// SIG_IGN的值说明进程应该忽略信号
sigset_t sa_mask; //处理程序的执行过程中需要阻塞的额外的信号 int sa_flags; //特殊的标志符和选项 }
参数sa_flags的取值如下:
SA_NOCLDSTOP 子进程停止时不产生SIGCHLD信号
SA_RESETHAND 将对此信号的处理方式在信号处理函数的入口重置为SIG_DFL
SA_RESTART 重启可中断的函数而不是给出EINTR错误
SA_NODEFER 捕获到信号时不将它添加到信号掩码中
例子:
#include <signal.h>
#include <stdio.h>
#include <unistd.h> void ouch(int sig){
printf("OUCH! - I got signal %d\n",sig);
} int main(){
struct sigaction act;
act.sa_handler=ouch;
act.sa_flags=;
sigemptyset(&act.sa_mask); sigaction(SIGINT,&act,); while(){
printf("Hello world\n");
sleep();
}
}
结果如下:
二 等待信号——sigsuspend和sigwait
1 sigsuspend函数
#include <signal.h> int sigsuspend(const sigset_t *sigmask);
sigsuspend函数用sigmask指向的那个掩码来设置信号掩码,并将进程挂起,直到进程捕捉到信号为止。
2 sigwait函数
#include <signal.h> int sigwait(const sigset_t *restrict sigmask,int *restrict signo);
sigwait函数一直阻塞到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指向的那个位置中。
3 sigsuspend和sigwait区别
这两个函数的第一个参数都是指向信号集的指针(sigset_t *)。对sigsuspend来说,这个信号集装载的是新的信号掩码,因此不在信号集中的信号是能使sigsuspend返回的信号。对sigwait来说,这个参数中装载的是需要等待的信号集,因此在信号集中的信号是能使sigwait返回的信号。与sigsuspend不同,sigwait没有改变进程的信号掩码,sigmask中的信号应该在调用sigwait之前被阻塞起来。
Linux学习笔记19——信号2的更多相关文章
- Linux学习笔记19-ssh远程管理
远程管理 服务器一般运行在IDC机房中,一般都是通过远程管理方式对服务器进程控制. 常见的远程管理工具: RDP(remote desktop protocol)协议,window远程桌面管理 Tel ...
- Linux学习笔记(19) Linux服务管理
1. 服务的分类 Linux服务可分为RPM包默认安装的服务和源码包安装的服务.前者可细分为独立的服务(直接作用于内存中)和基于xinetd服务.xinetd本身是独立的服务,其唯一的功能是管理其他服 ...
- Linux学习笔记18——信号1
一 信号的基本概念 信号:是向进程发送的软件通知,通知进程有事件发生. 生成:表示一个信号的产生. 捕获:表示接收到一个信号. 信号的寿命:信号的生成和传递之间的时间间隔. 挂起的信号:已经生成但还未 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- linux —— 学习笔记(汇总)
笔记目录:一.系统知识 和 基本概念 二.常用操作 三.系统管理(内存.设备.服务等管理) ...
- Linux 学习笔记之超详细基础linux命令 Part 14
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 12
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 11
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...
随机推荐
- ASP.NET得到系统相关信息
1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHos ...
- Wi-Fi无线网络下行速度超级慢 (5kb/s)之解决方案
转载:http://www.iplaysoft.com/wifi-slow-solution.html 作者:X-Force 转载原因:该文分类提出了多种解决方案,并详述其原因.简洁清晰,可作为参考方 ...
- sqlserver2005唯一性约束
[转载]http://blog.163.com/rihui_7/blog/static/21228514320136193392749/ 1.设置字段为主键就是一种唯一性约束的方法,如 int p ...
- Flex:CSS3布局利器
实习以来做了三个小控件,都是用的CSS2.1里传统的DIV+CSS布局方式,综合使用position.margin.float.BFC等属性或特性将元素放到指定的位置上.然而面对日益复杂的界面,这些来 ...
- css文件加载:@import和link的区别
刚看了一个百度试题:请简述CSS加载方式link和@import的区别? 平时一般都用link,也知道css的加载方式,但还真的没有仔细研究过其之间的差别,查了一些资料,大致总结如下: @impot使 ...
- 菜鸟日记之 java中的集合框架
java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...
- POJ_3143 验证“歌德巴赫猜想”
今天晚上的火车回家啦.所以提前更出来~.愉快的收拾我的包裹~滚回家吃半个月~胖几斤又要回学校啦~ T T这个假期虽然很忙.但是我觉得很有意义.很有价值~爱你们~ 描述 验证“歌德巴赫猜想”,即:任意一 ...
- mysql 刘道成视频教程1、2课----------大致结构
第1课 第2课 一.整体结构 1.mysql -h localhost -u root -p *** 如果-h不写,则默认连接localhost. 2.连接服务器成功,-------> 显示数据 ...
- OPENCV
opencv_ts300.libopencv_world300.lib IlmImfd.lib libjasperd.liblibjpegd.liblibpngd.lib libtiffd.lib l ...
- C#连接、访问MySQL数据库
一.准备工具 visual stuido(本示例使用visual studio 2010) MySql.Data.dll mysql_installer_community_V5.6.21.1_set ...