我在一个有多个线程的应用上工作。其中一个用于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
答案 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
具有未指定的行为。