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指定的信号mask。mask=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
参考
【1】 很好的示例
http://www.cnblogs.com/taobataoma/archive/2007/08/30/875662.html
【2】 http://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
【6】more
http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html