为什么signalhandler没有输出任何东西?

时间:2013-03-05 20:20:06

标签: c++ linux signals

#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系统上。

3 个答案:

答案 0 :(得分:6)

来自sigwait - wait for queued signals

  

说明

     

sigwait()函数从set中选择一个待处理信号,原子从系统的待处理信号集中清除它,并在sig引用的位置返回该信号编号。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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