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

时间:2013-08-26 07:06:32

标签: c++ c multithreading signals eintr

我的应用程序有两个主题。每个线程通过每个套接字从服务器接收一些数据。线程等待返回epoll_wait()。有时epoll_wait()返回-1而errno是EINTR。 EINTR表示系统call()被信号中断。我添加了处理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 caught\n", sArrivedSignal, strsignal(sArrivedSignal));
}                                                                                        

当epoll_wait()被中断时,我无法捕获信号。

方法2

当我在strace工具中执行我的应用程序时,epoll_wait()永远不会被中断。

我的问题在GDB工具中很好地再现了。我需要帮助......

2 个答案:

答案 0 :(得分:1)

您可以尝试实现自己的信号处理程序。如果应用程序再次被信号中断,将调用您自己的信号处理程序,您可以看到,已经引发了什么样的信号。

void
signal_callback_handler(int signum)
{
  printf("Caught signal %d\n",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
}

不是一个非常方便的方法,但这应该(希望)能够让你找出已经提出的信号。 Take a look here查看可以处理的不同信号(注意:并非所有信号都可以在您自己的信号处理程序(!)中处理)。

答案 1 :(得分:0)

可能你应该尝试设置信号处理程序来捕获所有信号并将信号标志设置为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 %d\n",sig);
}

在主程序中重新启动处理程序并忽略epoll中的EINTR。