首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么signalhandler不输出任何内容?

为什么signalhandler不输出任何内容?
EN

Stack Overflow用户
提问于 2013-03-06 04:20:06
回答 3查看 148关注 0票数 2
代码语言:javascript
复制
#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void sighandler(int sig) {
    cout << "signal received" << endl;
}

int main() {

    int pid= getpid();
    cout << pid << endl;

    signal( SIGUSR1, sighandler );

    sigset_t accept;
    sigaddset( &accept, SIGUSR1 );
    int s;

    sigwait(&accept, &s);

    cout << s << endl;

    return 0;
}

当我运行这个程序并通过"kill -s SIGUSR1 $pid“向它发送一个SIGUSR1信号时,它只输出信号的编号(10),而不是sighandler中的文本。我不明白为什么。这是在Linux系统上。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-06 04:31:04

来自sigwait - wait for queued signals

描述

sigwait()函数从set中选择一个挂起信号,从系统的挂起信号集合中以原子方式清除它,并在signal引用的位置返回该信号编号。

因此,通过使用sigwait(),您的程序已经传递和处理了信号。

当您删除sigwait调用并进行睡眠或忙碌等待时,SIGUSR1信号将被传送到您的信号处理程序,并打印消息"signal received“。

票数 6
EN

Stack Overflow用户

发布于 2013-03-06 04:32:53

之所以会出现这种情况,是因为当您调用sigwait()时,您的线程将进入睡眠状态,并且控制权将传递给操作系统。当您发送SIGUSR1信号时,它将由OS处理,然后OS唤醒您的线程并将控制权传回。即使您已经注册了一个信号处理程序,您的处理程序也不会被调用,因为在重新唤醒您的线程时,信号已经被处理过了。

票数 3
EN

Stack Overflow用户

发布于 2013-03-06 04:31:12

我试图找到一个明确的引用,但似乎信号处理程序和sigwait是相互排斥的。如果使用sigwait同步处理信号,则永远不会调用处理程序。

有关讨论,请参阅About the ambiguous description of sigwait()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15233305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档