如何使用sigaction()?未定义struct sigaction

时间:2019-02-16 00:28:12

标签: c posix sigaction

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

当我签出一些旧代码时,我发现我已经在文件的最顶部添加了一些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);
                  ^~~~~~~~~

2 个答案:

答案 0 :(得分:0)

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

#define _POSIX_C_SOURCE 199309L

查找要使用的POSIX版本的documentation

答案 1 :(得分:0)

  

当我阅读sigaction手册(man 2 sigaction)时,其中没有关于_POSIX_SOURCE的信息

来自man sigaction:L

  

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

来自future_test_macros(7)

  

_POSIX_SOURCE
   用任何值定义该过时的宏等效于
   用值1定义_POSIX_C_SOURCE。

     

由于此宏已过时,因此其用法通常不是doc‐
  在
中讨论功能测试宏要求时被提及   手册页。

因此_POSIX_SOURCE等效于_POSIX_C_SOURCE 1,并且已过时。

  

如何以及何时知道使用哪种POSIX?

来自man future_test_macros

  

在手册页中指定功能测试宏要求
  当函数需要定义功能测试宏时,
  手册页摘要通常包含注释[....]

因此,您应该在感兴趣的功能/功能的手册页中查看“摘要”部分。例如,man sigaction

  

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

因此,您需要为_POSIX_C_SOURCE定义sigaction(),并为_POSIX_C_SOURCE定义199309的值等于或等于siginfo_t的{​​{1}}。