Signals

sigaction() sa_flags 和 POSIX.1-2001 基本規範

  • October 9, 2020

**這是SIGACTION(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).

但實際上,在200112L使用該值時,2001 規範中添加的標誌並未暴露。因此,以下程式碼無法編譯。我試過 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 實現中的一個錯誤?

在 GNU C 庫中,SA_RESETHAND__USE_XOPEN_EXTENDEDor__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是 XSI 選項的一部分。它們在第 7 期 (2008) 中被移至基地。

man 2 sigaction來自Linux 手冊頁項目,而不是來自 GNU C 庫,因此確實會發生差異。

引用自:https://unix.stackexchange.com/questions/613139