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---------------- ...
随机推荐
- Tomcat-java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
好些天没弄java了,今天开MyEclipse,发现启动Tomcat的时候发错了,后来发现,报错如题. 解决方案是将 bin/tomcat-juli.jar 添加到add tomcat classpa ...
- java中Map的用法(HaspMap用法)
public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import java.util.HashMap; impo ...
- Object-C — KVC
1:使用kvc存取对象属性 如果要更改对象属性可以通过什么方法达到呢? (1)通过setter和getter方法. (2)属性. (3)直接设置实例变量. 今天学习新的一种方法:键值编码-kvc.通过 ...
- 输出第N个素数
输出第N个素数 public class FindNthPrime { public static void main(String[] args){ int N = Integer.parseInt ...
- 简单的背包问题(入门)HDU2602 HDU2546 HDU1864
动态规划,我一直都不熟悉,因为体量不够,所以今天开始努力地学习学习. 当然背包从01开始,先选择了一个简单的经典的背包HDU2602. Many years ago , in Teddy's home ...
- LINUX命令行操作
Linux 命令行快捷键 7条回复 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令.Bang(!)命令.控制命令等.让basher更有效率. 说明 Ctrl – k: 先按住 ...
- 《ln命令》-linux命令五分钟系列之十八
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 关于abbr 的一些用法
<span style="margin: 20px;">位 000置:</span><abbr title='四川省绵阳市梓潼县文昌镇金龙乡一大队二组 ...
- Spring MVC 3.2 406 Not Acceptable
Spring MVC 3.2 406 Not Acceptable 这个报错主要是因为SpringMVC配置文件配置问题. 修改步骤如下: 首先,修改spring-mvc.xsd为 spring-mv ...
- WorkerScript QML Type
官方描述:在一个Qt Quick应用程序中可以使用线程了. Import Statement: import QtQuick .属性:source : url信号:message(jsobje ...