sigaction() sa_flags および POSIX.1-2001 基本仕様

sigaction() sa_flags および POSIX.1-2001 基本仕様

これはから抜粋したものです。信号動作(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_RESTARTSA_SIGINFOSA_NOCLDWAITSA_NODEFER秋の一部でした。ベースに移動します2008年7号に掲載

man 2 sigaction~からLinuxのマニュアルページプロジェクトはGNU Cライブラリではないため、違いが発生します。

おすすめ記事