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 라이브러리가 아니므로 차이가 발생합니다.

관련 정보