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因此,设置_POSIX_C_SOURCE为 200112 是不够的;相反,你需要

#define _XOPEN_SOURCE 600

(这使得__USE_XOPEN_EXTENDED)或

#define _POSIX_C_SOURCE 200809L

(这使得__USE_XOPEN2K8)。

据我了解,这是符合 POSIX 标准的:在第 7期之前SA_RESETHAND,、、、、、和SA_RESTARTSA_SIGINFOSA_NOCLDWAITSA_NODEFER的一部分。它们被移至 Base载于2008年第7期

man 2 sigaction来自Linux 手册页项目,不是来自 GNU C 库,因此确实会发生差异。

相关内容