Как мне использовать 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)):
_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 с последним значением для целей совместимости.