Подтвердить что ты не робот

Компилировать ошибки с помощью signal.h в Linux

Я пишу программу оболочки, которая должна обрабатывать сигналы. Мой соответствующий код обработки сигналов выглядит следующим образом:

#include <signal.h>
...
#include <sys/types.h>
...
void installSigactions( int, struct sigaction* );

void handler_function( int signal_id );
...
/*define signal table*/
struct sigaction signal_action;

/*insert handler function*/
signal_action.sa_handler = handler_function;

/*init the flags field*/
 signal_action.sa_flags = 0;

/*are no masked interrupts*/
sigemptyset( &signal_action.sa_mask );

/*install the signal_actions*/
sigaction( SIGINT, &signal_action, NULL );

Компиляция дает мне следующие предупреждения и ошибки:

gcc -Wall -ggdb -ansi -static -pedantic -o os1shell2 os1shell2.c
os1shell2.c:35: warning: 'struct sigaction' declared inside parameter list
os1shell2.c:35: warning: its scope is only this definition or declaration, 
which is probably not what you want
os1shell2.c: In function 'main':
os1shell2.c:66: error: storage size of 'signal_action' isn't known
os1shell2.c:75: warning: implicit declaration of function 'sigemptyset'
os1shell2.c:78: warning: implicit declaration of function 'sigaction'

Может ли кто-нибудь сказать мне, почему я получаю эти предупреждения и ошибки?

4b9b3361

Ответ 1

Он будет работать, если вы удалите -ansi из своей строки компиляции. Я подозреваю, что проблема заключается в том, что позиции posix в библиотеке сигналов не включаются, когда вы указываете -ansi.

Если вы действительно не хотите отключать -ansi, вы также можете добавить -D_POSIX_C_SOURCE в параметры компилятора.

Ниже приведено краткое описание тестов ANSI и макросов функции gcc.

Ответ 2

Попробуйте переместить "sys/types.h" перед "signal.h".

Если это не сработает, попробуйте добавить это:

#include <bits/sigaction.h>

Если он все еще не работает, укажите:

1) Ваша ОС и версия

2) Ваша версия gcc