我想知道当系统调用()被中断时,哪个信号到达

I want to know which a signal is arrived when system call() is interrupted

本文关键字:信号 中断 想知道 系统调用      更新时间:2023-10-16

我的应用程序有两个线程。每个线程通过每个套接字从服务器接收一些数据。线程等待返回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。