_GNU_SOURCE宏和epoll_wait行为

时间:2017-05-05 16:09:53

标签: c pthreads signals posix epoll

我在一个有多个线程的应用上工作。其中一个用于epoll。此应用程序还捕获Route::get('profile', function () { // Only authenticated users may enter... })->middleware('auth'); 信号并执行一些最终确定。理想情况下,一切都有效,直到我设置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

1 个答案:

答案 0 :(得分:0)

在GNU / Linux上,/usr/include中的大多数非内核头文件都是由提供glibc的相同软件包提供的。当glibc提供函数的多个实现时,您可以使用feature_test_macros(例如_GNU_SOURCE)在各种实现中进行选择。

定义_GNU_SOURCE时,它还会定义_BSD_SOURCE,并且在较新版本的glibc中定义_DEFAULT_SOURCE。定义这些宏后,头文件将安排为您提供某些功能的BSD版本。 signal是其中一项功能。

在各种版本的UNIX下,signal做的事情略有不同。你遇到的不同之处:某些事情会发生什么变化"慢"当信号发送时它们被中断时系统调用。在V7和System III(以及System V)上,处理程序返回后,系统调用将返回EINTR错误。在4.2BSD上,系统调用将重新启动。

如果您使用POSIX标准sigaction而不是signal,则可以通过设置或清除SA_RESTART中的struct sigaction标记来选择系统调用是否可重新启动#39; s sa_flags

在glibc 2.19中,signal的System V版本最终使用标记sigaction调用SA_RESTORER|SA_INTERRUPT|SA_NODEFER|SA_RESETHAND,而BSD版本使用标记sigaction调用SA_RESTORER|SA_RESTART

使用sigaction的另一个原因:正如@KerrekSB指出的那样,在多线程应用程序中使用signal具有未指定的行为。