【发布时间】:2017-05-05 16:09:53
【问题描述】:
我在一个有多个线程的应用程序上工作。其中之一用于 epoll。这个应用程序还捕获SIGINT 信号并执行一些终结。在我设置_GNU_SOURCE 宏之前,一切都很理想。这使得程序卡在了线上:
int n = epoll_wait(epfd, events, N, -1);
因此,设置_GNU_SOURCE 可以防止所有(recv)等待呼叫在SIGINT 上中断。为什么会这样?什么是解决方法?
我特别想使用sched_setaffinity。这需要CPU_SET,它仅适用于_GNU_SOURCE。
更新
我如何捕捉SIGINT:
static volatile int running = 1;
static void int_handler(int i) {
running = 0;
}
然后在main:
signal(SIGINT, int_handler);
【问题讨论】:
-
如何“捕捉到
SIGINT信号”? -
@KerrekSB ,我已经更新了问题
-
如果您使用
sigaction(sa_flags清零)而不是signal,是否有效? -
@MarkPlotnick,是的,这有帮助!你能解释一下区别吗?
-
我会写一个答案。简短版本:_GNU_SOURCE 为您提供许多 BSD 版本,如果您使用
signal,则包括 BSD“安全信号”。sigaction,OTOH,允许您使用标志指定是否重新启动系统调用。
标签: c pthreads signals posix epoll