Как мне использовать sigaction ()?структура sigaction не определена - PullRequest
0 голосов
/ 16 февраля 2019

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

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

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

From man sigaction : L

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

С future_test_macros (7) :

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

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

Итак, _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_SOURCE для sigaction() и _POSIX_C_SOURCE больше или равно значению 199309 для siginfo_t.

0 голосов
/ 16 февраля 2019

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

#define _POSIX_C_SOURCE 199309L

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

...