これはから抜粋したものです。信号動作(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
。だから、200112に設定する_POSIX_C_SOURCE
だけでは不十分です。
#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
秋の一部でした。ベースに移動します2008年7号に掲載。
man 2 sigaction
~からLinuxのマニュアルページプロジェクトはGNU Cライブラリではないため、違いが発生します。