1

我正在做简单的 sigaction 示例来练习 C,但是当我尝试编译我的代码时,它声称struct sigaction不存在 [1]。

当我检查我生成的一些旧代码时,我看到我在文件的最顶部添加了一些 POSIX 字符串 [2]。但是,当我阅读 sigaction 手册(man 2 sigaction)时,其中没有任何关于 _POSIX_SOURCE 的内容,最接近的是 _POSIX_C_SOURCE 不起作用。我如何以及何时知道要使用哪个 POSIX?当我尝试其他人建议的简单代码时,没有 _POSIX_SOURCE 它不起作用。

[1]

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void sa_handler(int signum)
{
    printf("The signal has been replaced with this useless 
string!\n");
    exit(0);
}

int main(void)
{
    struct sigaction sa = {.sa_handler = sa_handler};
    int sigret = sigaction(SIGINT, &sa, NULL);
    while(1);

    return 0;
}

[2]

#define _POSIX_SOURCE
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void sa_handler(int signum)
{
    printf("The signal has been replaced with this useless 
string!\n");
    exit(0);
}

int main(void)
{
    struct sigaction sa = {.sa_handler = sa_handler};
    int sigret = sigaction(SIGINT, &sa, NULL);
    while(1);

    return 0;
}

当我编译第一个示例时,结果是这些错误消息。

sigaction.c: In function ‘main’:
sigaction.c:13:12: error: variable ‘sa’ has initializer but 
incomplete type
     struct sigaction sa = {.sa_handler = sa_handler};
            ^~~~~~~~~
sigaction.c:13:29: error: ‘struct sigaction’ has no member named 
‘sa_handler’
     struct sigaction sa = {.sa_handler = sa_handler};
                             ^~~~~~~~~~
sigaction.c:13:42: warning: excess elements in struct initializer
     struct sigaction sa = {.sa_handler = sa_handler};
                                          ^~~~~~~~~~
sigaction.c:13:42: note: (near initialization for ‘sa’)
sigaction.c:13:22: error: storage size of ‘sa’ isn’t known
     struct sigaction sa = {.sa_handler = sa_handler};
                      ^~
sigaction.c:14:18: warning: implicit declaration of function 
‘sigaction’ [-Wimplicit-function-declaration]
     int sigret = sigaction(SIGINT, &sa, NULL);
                  ^~~~~~~~~
4

2 回答 2

1

您需要为 定义一个正整数_POSIX_C_SOURCE。对于sigaction,它至少需要:

#define _POSIX_C_SOURCE 199309L

查看要使用哪个 POSIX 版本的文档

于 2019-02-16T00:37:48.823 回答
0

当我阅读 sigaction 手册(man 2 sigaction)时,里面没有关于 _POSIX_SOURCE 的内容

来自人的签名:L

glibc 的功能测试宏要求(参见 feature_test_macros(7)):

future_test_macros(7)

_POSIX_SOURCE
用任何值定义这个过时的宏等同于
用值 1 定义 _POSIX_C_SOURCE。


由于此宏已过时,因此在手册页中讨论功能测试宏要求时,通常不会记录其用法。

所以_POSIX_SOURCE等同于_POSIX_C_SOURCE 1并且已经过时了。

我如何以及何时知道要使用哪个 POSIX?

来自man future_test_macros

手册页中功能测试宏要求的规范
当一个功能需要定义一个功能测试宏时,
手册页 SYNOPSIS 通常包含一个注释 [....]

因此,您应该查看您感兴趣的功能/特性手册页中的 SYNOPSIS 部分。例如对于man sigaction

sigaction(): _POSIX_C_SOURCE
siginfo_t: _POSIX_C_SOURCE >= 199309L

因此,您需要定义_POSIX_C_SOURCEforsigaction()_POSIX_C_SOURCE大于或等于199309for的值siginfo_t

于 2019-02-16T00:38:03.753 回答