23、linux信号学习(2)

简介: 5)sigaddset #include int sigaddset(sigset_t *set,int signum); ① sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。

5)sigaddset

#include<signal.h>

int sigaddset(sigset_t *set,int signum);

sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。

int sigdelset(sigset_t * set,int signum); //从信号集中删除

int sigemptyset(sigset_t *set); //将参数set信号集初始化并清空

int sigfillset(sigset_t * set); //sigfillset()用来将参数set信号集初始化(调用sigemptyset),然后把所有的信号加入到此信号集里

int sigismember(const sigset_t *set,int signum); //sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里。如果信号集里已有该信号则返回1,否则返回0

int sigpending(sitset_t *set); //获取未决信号,未决信号指信号产生到被进程处理之前的状态;被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。。set输出参数,处于未决状态的信号集。

int sigqueue(pid_t pid, int signum, union sigval val);//发送信号,同时附加数据。【5

说明:加入到信号集中信号将被屏蔽。

6)signal

void (*signal(int signum,void(* handler)(int)))(int);

    signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常数(是函数指针)之一:

SIG_IGN 忽略参数signum指定的信号。

SIG_DFL 将参数signum 指定的信号重设为核心预设的信号处理方式。

返回值返回先前的信号处理函数指针。

    说明:在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()

7)int sigpending(sigset_t *set);

sigpending()会将被搁置的信号集合由参数set指针返回

8)int sigprocmask(int how,const sigset_t *set,sigset_t * oldset);

    sigprocmask()可以用来改变目前的信号遮罩,其操作依参数how来决定:

The set of blocked signals is the union of the current set and the set argument. 做并集。也就是加入阻塞集合。mask=mask|set

SIG_UNBLOCK 将目前的信号mask减去参数set指定的信号mask。也就是set集中的信号将从阻塞集合中去掉,不再阻塞。mask=mask&~set

SIG_SETMASK 将目前的信号mask设成参数set指定的信号maskmask=set

如果参数oldset不是NULL指针,那么目前的信号mask会由此指针返回。

9)sigsuspend

int sigsuspend(const sigset_t *set); set输入参数,表示阻塞信号集。

    其工作过程如下:

设置进程的信号掩码并阻塞进程

收到信号,恢复原来的信号掩码

调用那个进程设置的信号处理函数

等待信号处理函数返回,sigsuspend返回

四步操作一次性完成,保证其原子性。

10)int sigwait(const sigset_t *set, int *sig);

    sigwait() 函数挂起调用线程直到在信号集set里指定的信号到达为止。这个函数接受信号(把它从未决信号列表里删除),并通过sig返回信号编号。

5、进程可以通过阻塞信号暂时地阻止信号的传递。每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t

    每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。

6、阻塞的概念与忽略信号是不同的:操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递;当进程忽略一个信号时,信号会被传递出去,但进程将信号丢弃。

7、关于等待信号,信号机制提供了一种不需要忙等(busy waiting)的等待事件的机制。忙等是指连续地使用CPU来检测事件的发生,而更有效的方式是将进程或线程挂起直到所等待的事件发生为止,这样其他进程或线程就可以有效使用CPU了。POSIX中的pause,sigsuspend,sigwait函数提供了三种机制,用来挂起进程,直到信号发生为止。

8、进程中的所有线程都共享进程中的信号处理程序,但每个线程可以有它自己的信号掩码。在多线程的进程中进行信号处理的一种推荐策略是:为信号处理程序使用特定的线程;主线程在创建线程之前阻塞所有的信号,由于信号掩码是从创建线程的线程中继承的,因此所有的线程将同样阻塞所有信号。然后,专门用来处理信号的线程对那个信号执行sigwait,或者线程可以用pthread_sigmask来解除对信号的阻塞,这样指定的信号都将被这个信号处理线程处理。

see more in document

document

参考

1】 很好的示例

http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html

2http://www.cnblogs.com/mydomain/archive/2011/06/17/2083837.html

3】 对各个信号作了介绍

http://xcily1.blog.163.com/blog/static/287169162011417115154312/

4】 讲述了非常好的实例

http://hi.baidu.com/xu_zhisheng/blog/item/82cbdfd7ab12872607088bdc.html

5】 对信号集进行了简单的讲解

http://blog.csdn.net/jk1860/article/details/6152083

6more

http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html

http://learn.akae.cn/media/ch33s03.html

目录
相关文章
|
3月前
|
NoSQL 关系型数据库 MySQL
Linux学习记录---(1、基本命令)
该博客文章提供了Linux系统中基本命令的使用记录,包括文件和目录操作、Redis服务管理、MySQL数据库操作以及Tomcat服务器的启动和检查。
Linux学习记录---(1、基本命令)
|
6天前
|
存储 安全 Linux
|
8天前
|
Linux Shell 数据安全/隐私保护
|
27天前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
1月前
|
网络协议 Linux
linux学习之套接字通信
Linux中的套接字通信是网络编程的核心,允许多个进程通过网络交换数据。套接字提供跨网络通信能力,涵盖本地进程间通信及远程通信。主要基于TCP和UDP两种模型:TCP面向连接且可靠,适用于文件传输等高可靠性需求;UDP无连接且速度快,适合实时音视频通信等低延迟场景。通过创建、绑定、监听及读写操作,可以在Linux环境下轻松实现这两种通信模型。
31 1
|
26天前
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
|
3月前
|
NoSQL Ubuntu Linux
Linux内核学习
Linux内核学习
79 3
|
3月前
|
Linux 调度
Linux0.11 信号(十二)(下)
Linux0.11 信号(十二)
25 1
|
3月前
|
存储 Linux 调度
|
2月前
|
Linux
使用qemu来学习Linux的休眠和唤醒
使用qemu来学习Linux的休眠和唤醒
下一篇
无影云桌面