这是摘录自信号行动(2):
POSIX.1-1990 specified only SA_NOCLDSTOP. POSIX.1-2001 added SA_NOCLDSTOP, SA_NOCLDWAIT,
SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART, and SA_SIGINFO. Use of these latter values
in sa_flags may be less portable in applications intended for older UNIX implementations.
并从FEATURE_TEST_MACROS(7):
_POSIX_C_SOURCE
· (Since glibc 2.3.3) The value 200112L or greater additionally exposes definitions
corresponding to the POSIX.1-2001 base specification (excluding the XSI extension).
This value also causes C95 (since glibc 2.12) and C99 (since glibc 2.10) features to
be exposed (in other words, the equivalent of defining _ISOC99_SOURCE).
但实际上,2001 规范中添加的标志在200112L
使用该值时不会暴露。因此,以下代码无法编译。我尝试了 glibc 和 uclibc。
#define _POSIX_C_SOURCE 200112L
#include <string.h>
#include <signal.h>
#include <unistd.h>
static int ret = 1;
void handle_signal (const int s) {
ret = 0;
}
int main (const int argc, const char **args) {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_flags = SA_RESETHAND;
sa.sa_sigaction = handle_signal;
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
pause();
return ret;
}
我在这里缺少什么?这些标志不是 2001 年的基本规格吗?它们是扩展吗?或者这只是 Linux libc 实现中的一个错误?
答案1
在 GNU C 库中,SA_RESETHAND
由__USE_XOPEN_EXTENDED
或者__USE_XOPEN2K8
。因此,设置_POSIX_C_SOURCE
为 200112 是不够的;相反,你需要
#define _XOPEN_SOURCE 600
(这使得__USE_XOPEN_EXTENDED
)或
#define _POSIX_C_SOURCE 200809L
(这使得__USE_XOPEN2K8
)。
据我了解,这是符合 POSIX 标准的:在第 7期之前SA_RESETHAND
,、、、、、和SA_RESTART
SA_SIGINFO
SA_NOCLDWAIT
SA_NODEFER
的一部分。它们被移至 Base载于2008年第7期。
man 2 sigaction
来自Linux 手册页项目,不是来自 GNU C 库,因此确实会发生差异。