问题
I'm writing a shell program that must handle signals. My relevant signal handling related code is as follows:
#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 );
Compiling gives me the following warnings and errors:
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'
Can anyone tell me why I'm getting these warnings and errors?
回答1:
It will work if you remove -ansi
from your compile line. I suspect the problem is that the posix parts of the signal library aren't included when you specify -ansi
.
If you really don't want to disable -ansi, you can also add -D_POSIX_C_SOURCE
to the compiler options.
Here is a short discussion of ANSI and the gcc feature test macros.
回答2:
Please try moving "sys/types.h" before "signal.h".
If that doesn't work, try adding this:
#include <bits/sigaction.h>
If it still doesn't work, please specify:
1) Your OS and version
2) Your gcc version
来源:https://stackoverflow.com/questions/8846047/compile-errors-using-signal-h-in-linux