【问题标题】:unknown type name 'siginfo_t' with Clang using _POSIX_C_SOURCE 2, why?使用_POSIX_C_SOURCE 2的Clang未知类型名称'siginfo_t',为什么?
【发布时间】:2025-12-10 17:35:01
【问题描述】:

更新原来我的讲师会接受按照 GNU99 标准编写的代码,因此,正如 User1 所指出的,我在程序开始时使用了_GNU_SOURCE。 (请参阅man feature_test_macros 了解更多信息。)感谢您帮助我理解!

在带有 Clang 3.4、GCC 4.8.1 的 Ubuntu 13.10 上,我正在执行一项要求我使用 C99 标准的作业。 (我也从 SVN 安装了 GNUstep)

WRT GCC,我想我在这些文件夹中安装了 4 个版本:

/usr/lib/gcc/x86_64-linux-gnu/4.7
/usr/lib/gcc/x86_64-linux-gnu/4.7.3
/usr/lib/gcc/x86_64-linux-gnu/4.8
/usr/lib/gcc/x86_64-linux-gnu/4.8.1

gcc --version 报告 4.8.1,clang --version 报告 3.4。 ld -v 报告 2.23.52.20130913

我正在编写一个信号处理程序,当我在函数头中使用 siginfo_t 时,出现编译器错误:unknown type name 'siginfo_t' 我正在使用 sigaction() 来安装处理程序。

在研究需要做什么以及如何做时,我能够编译一个简单的演示,它也使用相同的函数头定义,并且它可以工作。但是它不限于 C99。

这些是我的包含(其中 signal.h 是其中之一):

#define _POSIX_C_SOURCE 2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <math.h>
#include <ctype.h>
#include <libgen.h>
#include <signal.h>

这是我的信号处理函数(仅用于调试目的):

static void sigSIGCHLDhandler(int sigNum, siginfo_t *siginfo, void *context) {

        printf("PID = %ld",(long) siginfo->si_pid);

}

我现在使用-Wall-std=c99clang 一起编译-std=gnu99options。

我已经尝试过locate signal.h,我在/usr/include 中有它。我尝试添加 #include &lt;bits/siginfo.h&gt; 并允许我编译,但二进制文件无法正常工作。
(我的系统上有一堆 signal.hsiginfo.h 文件。)

另一位学生建议我的设置有问题。所以我重新安装了 Clang。以下是我认为可能相关的一些环境变量(如有任何遗漏或错误,请通知我

LD_LIBRARY_PATH=/home/user/ros_catkin_ws/install_isolated/lib:/home/user/GNUstep/Library/Libraries:/usr/local/lib
CPATH=/home/user/ros_catkin_ws/install_isolated/include
PATH=/home/user/ros_catkin_ws/install_isolated/bin:/home/user/GNUstep/Tools:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/user/bin:/usr/local/java/jdk1.7.0_51/bin
CLASSPATH=/home/user/GNUstep/Library/Libraries/Java:/usr/local/lib/GNUstep/Libraries/Java
LIBRARY_COMBO=gnu-gnu-gnu
INFOPATH=/usr/local/share/info::/home/user/GNUstep/Library/Documentation/info:
GNUSTEP_IS_FLATTENED=yes
GNUSTEP_LOCAL_ROOT=/usr/local/Local
GNUSTEP_HOST=x86_64-unknown-linux-gnu
GUILE_LOAD_PATH=/home/user/GNUstep/Library/Libraries/Guile:/usr/local/lib/GNUstep/Libraries/Guile
GNUSTEP_MAKEFILES=/usr/local/share/GNUstep/Makefiles
GNUSTEP_NETWORK_ROOT=/usr/local/Network
GNUSTEP_FLATTENED=yes
GNUSTEP_HOST_OS=linux-gnu
GNUSTEP_HOST_VENDOR=unknown
GNUSTEP_HOST_CPU=x86_64
GNUSTEP_USER_ROOT=/home/user/GNUstep
GNUSTEP_SYSTEM_ROOT=/usr/local/System
GNUSTEP_PATHLIST=/usr/local/System:/usr/local/Network:/usr/local/Local:/home/user/GNUstep
GNUSTEP_SYSTEM_ROOT=/usr/local/System
GNUSTEP_PATHLIST=/usr/local/System:/usr/local/Network:/usr/local/Local:/home/nap/GNUstep

我花了几个小时寻找修复程序,但找不到任何东西,而且我没有想法。 什么坏了?

【问题讨论】:

  • C 标准中没有称为 siginfo 或 signinfo_t 的内容。因此,您的问题与 C99 本身无关。我对这些库知之甚少,但似乎 siginfo.h 是一些非标准库。
  • 好的。在手册页中,功能测试宏是:sigaction(): _POSIX_C_SOURCE &gt;= 1 || _XOPEN_SOURCE || _POSIX_SOURCEsiginfo_t: _POSIX_C_SOURCE &gt;= 199309L。那么,您的意思是,尽管 C99 标准出现在这两者之后,但它不包括 POSIX?我目前正在阅读 Wiki,以了解不同标准之间的关系,并希望对此有更多了解。 (这已经让我发疯了一段时间了。)
  • C 标准确实不知道/不关心 POSIX。 C 甚至不需要操作系统。
  • 我遇到了类似的问题,将 -std=c99 更改为 -std=gnu99 修复了一些问题。谢谢。

标签: c clang c99


【解决方案1】:

如果您查看 sigaction(2) 的手册页,您会发现以下内容:

siginfo_t: _POSIX_C_SOURCE >= 199309L

尝试添加编译器选项:-D_POSIX_C_SOURCE=199309L

它将所需的 posix 版本告诉您的 c-lib (glibc)。

编辑:

查看来自POSIX wiki page 的更多信息。

featuers.h 详细介绍了 glibc 如何使用定义:

   _POSIX_C_SOURCE  
          If ==1, like _POSIX_SOURCE; 
          if >=2 add IEEE Std 1003.2;
          if >=199309L, add IEEE Std 1003.1b-1993;
          if >=199506L, add IEEE Std 1003.1c-1995;
          if >=200112L, all of IEEE 1003.1-2004

手册页中也有类似信息:feature_test_macros(7)

所以:_POSIX_C_SOURCE=2 没有提供最新的 POSIX 功能,因为 1003.2 (posix 2) 不是最新的。为了获得更多可用功能,您需要定义更高版本。

不要混淆:POSIX.2 并不比 POSIX.1c 新。

【讨论】:

  • 我会试试的,但你能解释一下为什么我的 _POSIX_C_SOURCE 2 还没有涵盖这个吗?对于我的任务,我必须生成符合 C99 的代码,我的讲师在 OSX 10.9.2 上对其进行测试。 (这意味着我什至不能使用 BSD_SOURCE 选项。)
  • 原来我们的讲师会接受按照 gnu99 标准编写的代码。所以我在程序开始时使用了 _GNU_SOURCE。
最近更新 更多