• 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

  • 相关阅读:
    java.net.BindException: Address already in use: 解决方法
    openlayers中单击获取要素
    OpenLayers绘制图形
    springboot启动失败( No active profile set, falling back to default profiles: default)
    Java学习日报7.16
    Java学习日报7.15
    Java学习日报7.14
    Java学习日报7.13
    Java学习日报7.12
    Java学习日报7.10
  • 原文地址:https://www.cnblogs.com/mydomain/p/2184358.html
Copyright © 2020-2023  润新知