我想知道当系统调用()被中断时,哪个信号到达
I want to know which a signal is arrived when system call() is interrupted
我的应用程序有两个线程。每个线程通过每个套接字从服务器接收一些数据。线程等待返回epoll_wait()。有时epoll_wait()返回-1,errno为EINTR。EINTR表示系统调用()被一个信号中断。我添加到处理EINTR。然而,我不知道到达的信号是什么,也不知道为什么会到达信号。我想知道。
方法1
我创建了一个线程。
sigset_t sMaskOfSignal;
sigset_t sOldMaskOfSignal;
sigfillset(&sMaskOfSignal);
sigprocmask(SIG_UNBLOCK, &sMaskOfSignal, &sOldMaskOfSignal)
while(1)
{
sigwait(&sMaskOfSignal, &sArrivedSignal);
fprintf(stdout, "%d(%s) signal caughtn", sArrivedSignal, strsignal(sArrivedSignal));
}
epoll_wait()中断时,我无法捕捉到信号。
方法2
当我在strace工具中执行应用程序时,epoll_wait()永远不会被中断。
我的问题在GDB工具中得到了很好的再现。我需要帮助。。。。
您可以尝试实现自己的信号处理程序。如果您的应用程序再次被信号中断,您自己的信号处理程序将被调用,您可以看到引发了什么样的信号。
void
signal_callback_handler(int signum)
{
printf("Caught signal %dn",signum);
exit(signum); // terminate application
}
int main()
{
// Register signal handler for all signals you want to handle
signal(SIGINT, signal_callback_handler);
signal(SIGABRT, signal_callback_handler);
signal(SIGSEGV, signal_callback_handler);
// .. and even more, if you want to
}
这不是一个非常方便的方法,但这应该(希望)能让你发现,发出了什么信号。看看这里可以看到可以处理的不同信号(注意:并非所有信号都可以在您自己的信号处理程序(!)中处理)。
您可能应该尝试设置用于捕获所有信号的信号处理程序,并将信号标志设置为SA_SIGINFO
像这个
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = <handler>;
sigaction(SIGFPE, &act, 0);
sigaction(SIGHUP, &act, 0);
sigaction(SIGABRT, &act, 0);
sigaction(SIGILL, &act, 0);
sigaction(SIGALRM, &act, 0);
sigaction(SIGALRM, &act, 0);
.
.
.
//and your handler looks like
void handle_sig (int sig, siginfo_t *info, void *ptr)
{
printf ("Signal is %dn",sig);
}
在主程序中重新注册处理程序,并忽略epoll中的EINTR。
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 被信号中断的系统调用仍然需要完成
- 如何中断epoll_pwait以捕获信号
- 在不中断 IO 的情况下处理信号
- Linux 中的信号处理和中断的函数调用
- C++当被ctrl-c中断时,在死亡之前调用带有参数(信号号除外)的函数
- 我想知道当系统调用()被中断时,哪个信号到达
- 尝试使用 pselect() 阻止竞争条件,但信号不会中断
- boost::mpi阻塞不被linux信号中断的IO
- 线程中断与插槽和信号
- 如何在Python中捕获阻塞boost c++方法中的中断信号?
- 在服务器应用程序中处理中断信号的最佳方式
- 如何在命令行界面中处理ctrl中断信号