【问题标题】:Why is signalhandler not outputting anything?为什么信号处理器不输出任何东西?
【发布时间】:2013-03-05 20:20:05
【问题描述】:
#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 系统上。

【问题讨论】:

  • 您可能希望在您的sigaddset 之前添加sigemptyset(&amp;accept)
  • 在信号处理程序中使用cout 会调用undefined behavior。不要那样做,写一个信号处理程序correctly

标签: c++ linux signals


【解决方案1】:

来自sigwait - wait for queued signals

描述

sigwait() 函数从集合中选择一个未决信号,自动将其从系统的未决信号集中清除,并在 sig 引用的位置返回该信号编号。

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

当您移除sigwait 调用并进行睡眠或忙等待时,SIGUSR1 信号将被传递到您的信号处理程序,并且将打印“收到信号”消息。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      如需讨论,请参阅About the ambiguous description of sigwait()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        相关资源
        最近更新 更多