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