Как мне использовать sigaction()? структура sigaction не определена

Я делаю простой пример 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);
                  ^~~~~~~~~

3 ответа

Решение

когда я читаю руководство по sigaction (man 2 sigaction), в нем нет ничего о _POSIX_SOURCE

От возмущения:L

Требования к макросу тестирования возможностей для glibc (см. Feature_test_macros(7)):

Из future_test_macros (7):

_POSIX_SOURCE
Определение этого устаревшего макроса с любым значением эквивалентно
определяя _POSIX_C_SOURCE со значением 1.

Поскольку этот макрос устарел, его использование обычно не документировано.
обсуждается при обсуждении требований макроса функционального теста в
страницы руководства.

Так _POSIX_SOURCE эквивалентно _POSIX_C_SOURCE 1 и устарел.

Как и когда я знаю, какой POSIX будет использоваться?

От человека future_test_macros:

Спецификация требований макроса тестирования функций на страницах справочника
Когда функция требует, чтобы был определен макрос тестирования функции,
страница справочника ОПИСАНИЕ обычно включает примечание [....]

Таким образом, вы должны проверить раздел SYNOPSIS на странице руководства интересующей вас функции / функции. Например, для man sigaction:

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

Так что вам нужно определить _POSIX_C_SOURCE за sigaction() а также _POSIX_C_SOURCE больше или равно значению 199309 за siginfo_t,

Вам нужно определить положительное целое число для _POSIX_C_SOURCE, За sigaction, это должно быть по крайней мере:

#define _POSIX_C_SOURCE 199309L

Посмотрите документацию, какую версию POSIX использовать.

Вам нужно добавить <features.h> перед <signals.>, так как feature.h содержит #define _POST_C_SOURCE с последним значением для целей совместимости.

Другие вопросы по тегам