Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么signalhandler不输出任何东西? #包括 #包括 #包括 使用名称空间std; 无效信号发生器(内部信号){ 不能_C++_Linux_Signals - Fatal编程技术网

C++ 为什么signalhandler不输出任何东西? #包括 #包括 #包括 使用名称空间std; 无效信号发生器(内部信号){ 不能

C++ 为什么signalhandler不输出任何东西? #包括 #包括 #包括 使用名称空间std; 无效信号发生器(内部信号){ 不能,c++,linux,signals,C++,Linux,Signals,说明 函数的作用是:从集合中选择一个待处理信号,原子地从系统的待处理信号集合中清除该信号,并返回sig引用位置的信号号 因此,通过使用sigwait(),您的程序已经发送并处理了信号 当您取消sigwait呼叫并进行睡眠或忙碌等待时,SIGUSR1信号将发送到您的信号处理程序,并显示消息“signal received”(信号已接收)将被打印。我正在试图找到一个确定的引用,但似乎信号处理程序和sigwait是互斥的。如果使用sigwait同步处理信号,则永远不会调用处理程序 有关讨论,请参见您将

说明

函数的作用是:从集合中选择一个待处理信号,原子地从系统的待处理信号集合中清除该信号,并返回sig引用位置的信号号

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


当您取消
sigwait
呼叫并进行睡眠或忙碌等待时,
SIGUSR1
信号将发送到您的信号处理程序,并显示消息“signal received”(信号已接收)将被打印。

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


有关讨论,请参见

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

您可能希望在
sigaddset
之前添加
sigeptyset(&accept)
。在信号处理程序中使用
cout
调用。如果不这样做,请编写一个信号处理程序。
#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;
}