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---------------- ...
随机推荐
- GridView分页的实现
要在GridView中加入 //实现分页 AllowPaging="true" //一页数据10行 PageSize="10" // 分页时触发的事件 OnPa ...
- SQL For Xml
最近遇到点棘手的问题,大致如下: 1.数据局格式: 企业名称 排口名称 监测时间 监测因子 a b c pH值 a b c 氨氮 a b c 化学需氧量(COD) 企业名称.排口名称 ...
- windows 8 vpn 错误解决
最近微软发布了Windows 8 RTM版,很多朋友也安装了,我当然也不例外.这几天就有不少朋友问我VPN连接无论怎么都说密码错误不能验证,于是,便连接VPN进行了下测试,如下: 配置好VPN,步凑不 ...
- list集合中指定字段去重
在开发中,有时会需要指定字段去重,以下为实现方法: 假设有个房地产权的类,其中宗地代码ZDDM值重复,而我们在前端页面显示时,只需要一条数据,因为公共字段都一样: IEqualityComparer需 ...
- 动效解析工厂:Mask 动画
转载自:http://www.cocoachina.com/ios/20160214/15250.html 前言:很多动效都是多种动画的组合,有时候你可能只是需要其中某个动画,但面对庞杂的代码库或是教 ...
- HUST 4681 String (DP LCS变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题目大意:给定三个字符串A,B,C 求最长的串D,要求(1)D是A的字序列 (2)D是B的子序列 ...
- boost::function实践——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》
代码段1: #include <boost/function.hpp> #include <iostream> float mul_ints(int x, int y) { r ...
- MVVM模式应用 之介绍
M-V-VM (1)M:即Model,由现实世界抽象出来的模型: V:即View,视图,界面,该界面与用户输入设备进行交互: 但是View与Model如何进行交互呢? Binding便可以发挥作用了, ...
- dedecms织梦如何删除所有的文章?
dedecms织梦如何删除所有的文章?dede一键删除所有文章的SQL命令: DELETE FROM dede_addonarticle WHERE aid >= 1 and aid<= ...
- hierarchyviewer偶然不能使用的解决方法
在DDMS的device中可以看到设备,并显示可以debug的状态,可以看到不显示进程的信息,但是hierarchyviewer也却不显示各个Window. 在控制台的打印信息如下: - hierar ...