当前位置:  技术问答>linux和unix

信号阻塞函数sigsuspend()的使用。

    来源: 互联网  发布时间:2017-03-10

    本文导语:  本帖最后由 rbf926 于 2012-08-19 22:50:09 编辑 调用后sigsuspend(&waitmask),信号SIGINT被屏蔽。执行程序后,输入ctrl+c(SIGINT),没有标准输出, 但继续输入ctrl+(SIGQUIT)后,会同时输出“quit signal”和“interrupt”。这是为什么? #i...

本帖最后由 rbf926 于 2012-08-19 22:50:09 编辑
调用后sigsuspend(&waitmask),信号SIGINT被屏蔽。执行程序后,输入ctrl+c(SIGINT),没有标准输出,
但继续输入ctrl+(SIGQUIT)后,会同时输出“quit signal”和“interrupt”。这是为什么?

#include
#include
#include
#include
void sig_int(int);
volatile sig_atomic_t quitflag=0;
int main()
{
        sigset_t newmask,waitmask,oldmask;
        signal(SIGINT,sig_int);
        signal(SIGQUIT,sig_int);

        sigemptyset(&waitmask);
        sigaddset(&waitmask,SIGINT);
        sigemptyset(&newmask);
        sigaddset(&newmask,SIGQUIT);

        sigprocmask(SIG_BLOCK,&newmask,&oldmask);
        
        while(quitflag == 0)
            sigsuspend(&waitmask);
        
        sigprocmask(SIG_SETMASK,&oldmask,NULL);
        exit(0);
}

void sig_int(int signo)
{
        if (signo == SIGINT)
                printf("interruptn");
        else if (signo == SIGQUIT)
                {
                        //quitflag = 1;
                        printf("quit signaln");
                }
        return;
}

|
sigsuspend调用后放掉了SIGQUIT,阻塞了SIGINT.

所以,

你杀SIGINT, 安然不动, 信号被阻塞.
你杀SIGQUIT, 被处理, 设置了变量, sigsuspend返回.

sigsupend返回后放掉SIGINT, 阻塞SIGQUIT, 所以SIGINT信号被处理, 打印.

|
sigsuspend的期间,你的waitmask是阻塞了SIGINT,,,所以你按下ctrl+c发出SIGINT信号后,
此信号处于未决状态。
然后你又发出SIGQUIT信号,此信号没被阻塞,,所以触发handler,,
然后根据上面的因为描述sigsuspend在handler返回后,也返回

前面没注意有个while(1)无限循环。。

注意: sigsuspend返回后,会恢复原来的阻塞情况,这时SIGINT没被阻塞,,而SIGQUIT被阻塞。
所以之前未决的SIGINT信号,在sigsuspend返回后,循环再次执行sigsuspend前,SIGINT会激活handler处理。

    
 
 

您可能感兴趣的文章:

  • 学习linux的新手问:linux进程信号掩码以及信号阻塞与信号未决怎么理解?
  • 生产者消费者问题为什么不可以共用一个信号量,如果这个信号量可以设置取值固定为0到N,即当信号量取值为N的时候阻塞进程,是否也可以?
  • 求解信号阻塞后还能打断系统调用是为什么
  • 关于信号阻塞,信号未决的代码,不明白
  • [求助]如何让阻塞的信号量、recvfrom退出?
  • 无法阻塞信号的问题(附程序)
  • 当进程处于socket读阻塞模式中,外部SIGNAL发生,此时信号相应响应函数可否进行socket写?
  • Linux下的信号忽略和信号阻塞是什么意思
  • 关于阻塞信号添加问题.sigprocmask 问题
  • 求助sigaction中sa_mask设置阻塞信号的问题!!!
  • sigprocmask函数对不再阻塞信号的返回问题
  • 为什么信号量无法打断阻塞函数??
  • 互斥锁和信号量,能不能实现先阻塞先唤醒,顺序获取互斥锁和信号量
  • 关于sigpending()无法返回被阻塞信号集的问题
  • 关于APUE信号自我阻塞的问题
  • sigsuspend中的参数和sigsuspend要处理的信号是不是没关系
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 信号处理函数里面用CRT函数可能导致"信号触发-处理"死循环吗?
  • 进入信号处理函数,是不是会自动把进入信号加入信号屏蔽字?还有sigpending
  • linux下类的成员函数不可以作为自定义的信号处理函数么?
  • 关于被信号打断的函数的执行。
  • linux的信号处理函数中如何访问共享资源
  • Linux,aix,windows下可以查询非本进程的信号处理函数吗?
  • 请教信号量处理函数signal的问题?
  • sigaction如何设置信号执行函数时屏蔽和屏蔽本身信号.
  • 内核进程间发送信号用哪个函数,如果没有这东西,那内核里异步通知用哪个东西
  • 请问:signal(), sigaction()函数会不会使自已所有的进程挂起啊,(这样就等接收各种信号,进行一些处理工作啊)
  • c++中怎么写sigaction()中的信号处理函数
  • 关于系统信号处理函数signal()的疑问.
  • NOSQL iis7站长之家
  • QT为什么发送这个信号,没有进入keyPressEvent()函数呢。。
  • 问个线程安全和异步信号安全函数的问题
  • linux中信号signal函数实例遇到的疑问
  • socket编程中的函数send和recv如何被信号中断?
  • apue书的的信号函数,看不懂
  • 向sourceid提问,还是关于“在定时器到时后,应该发送什么信号让scanf()函数返回?”的
  • gtk+中,怎样为GtkList每一项添加信号回调函数,做成QQ好友列表的效果?
  • 关于信号量与UNIX信号的疑问
  • 当信号量(灯)遇上信号,help!
  • 请问什么时候发出SIGKILL信号、什么时候发出SIGTERM信号?
  • 安全信号和不安全信号的实现机制有什么不同么?
  • 如何确定信号的来源?即如何知道接收到的信号来自于哪一个进程号?
  • 自旋锁和读写自旋锁、信号量和读写信号量分别有什么区别?
  • 关于消息队列信号量信号共享内存等核心编程的问题(求知若渴!!!.....)
  • 可靠信号和不可靠信号的问题
  • semaphore.h sem.c Posix 信号量 System v 信号量
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • 信号可靠还是不可靠,取决与信号本身还是signal()/sigaction()的区别?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3