23、linux信号学习(2)

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

原文地址:https://www.cnblogs.com/mydomain/p/2184358.html