[英]I want to know which a signal is arrived when system call() is interrupted
我的應用程序有兩個線程。 每個線程通過每個套接字從服務器獲取一些數據。 線程等待返回epoll_wait()。 有時epoll_wait()返回-1,而errno是EINTR。 EINTR表示系統調用()被信號中斷。 我添加了處理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工具中很好地再現了。 我需要幫助...。
您可以嘗試實現自己的信號處理程序。 如果您的應用程序再次被信號中斷,則將調用您自己的信號處理程序,您將看到產生了哪種信號。
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
}
這不是一個非常方便的方法,但是(希望)這可以使您找出發出了什么信號。 在這里看看可以處理的不同信號(注意:並非所有信號都可以在您自己的signal-handler(!)中處理)。
可能是您應該嘗試設置信號處理程序以捕獲所有信號並將信號標志設置為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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.