微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

信号处理器为什么不输出任何东西?

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

一个进程如何知道什么时候是背景?

如何知道程序是否通过信号结束了执行?

信号(SIGTERM)不被Windows上的subprocess接收

正确的方式来使用信号处理程序

在c静态库中使用定时器/信号不好的做法?

来自sigwait - wait for queued signals

描述

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

所以,通过使用sigwait() ,信号已经被你的程序传递和处理了。

当您移除sigwait呼叫并进行休眠或繁忙等待时, SIGUSR1信号将被传送到您的信号处理器,并且将打印“接收到的信号”消息。

你会得到这种行为,因为当你调用sigwait()你的线程进入睡眠状态,控制权交给操作系统。 当你发送SIGUSR1信号时,它正在被操作系统处理,然后操作系统唤醒你的线程并将控制权交还给你。 即使你已经注册一个信号处理程序,你的处理程序也没有被调用,因为信号在线程被重新唤醒的时候已经被处理了。

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

有关讨论,请参阅关于sigwait()的含糊描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐