1

我的应用程序有两个线程。每个线程通过每个套接字从服务器接收一些数据。线程等待返回 epoll_wait()。有时 epoll_wait() 返回 -1 而 errno 是 EINTR。EINTR 表示系统 call() 被信号中断。我添加到处理 EINTR。但是我不知道什么信号到达以及为什么信号到达。我想知道。

方法一。

我创建了一个线程。

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() 被中断时,我无法捕捉到信号。

方法二

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

我的问题在 GDB 工具中重现得很好。我需要帮助......

4

2 回答 2

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
}

不是一个非常方便的方法,但这应该(希望)使您能够找出发出了什么信号。在这里查看可以处理的不同信号(注意:并非所有信号都可以在您自己的信号处理程序(!)中处理)。

于 2013-08-26T08:57:42.890 回答
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。

于 2013-08-26T09:13:14.070 回答