2012-01-13 20 views
13

Piszę program powłoki, który musi obsługiwać sygnały. Moja odpowiedni kod obsługa sygnał związany jest następujący:błędy kompilacji przy użyciu signal.h w systemie 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); 

Kompilacja daje mi następujące ostrzeżenia i błędy:

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' 

Czy ktoś może mi powiedzieć, dlaczego ja dostaję te ostrzeżenia i błędy?

Odpowiedz

12

Będzie działać, jeśli usuniesz -ansi z linii kompilacji. Podejrzewam, że problem polega na tym, że części posix biblioteki sygnału nie są uwzględniane, gdy podasz -ansi.

Jeśli naprawdę nie chcesz wyłączyć -ansi, możesz również dodać -D_POSIX_C_SOURCE do opcji kompilatora.

Here is a short discussion of ANSI and the gcc feature test macros.

+0

usuwanie '-ansi' opuszcza mnie: ' /tmp/ccl4HmT7.o: W funkcji głównej': ' '/home/stu1/s11/gaw9451/Courses/OS_3/os1shell2.c: 68: undefined' 'odniesienie do funkcji handler'a' ' ' collect2: ld zwrócił 1 status wyjścia' Dodanie '-D_POSIX_C_SOURCE' robi to samo. Jakieś pomysły na ten temat? – Ataraxia

+0

Czy masz zdefiniowane 'handler_function'? Zostało to zadeklarowane w twoim pytaniu, ale nie ma na to kodu. Musiałem dodać 'void handler_function (int signal_id) {}', a następnie twój kod skompilowany dobrze. –

0

Spróbuj przenieść "sys/types.h" przed "signal.h".

Jeśli to nie zadziała, spróbuj dodać to:

#include <bits/sigaction.h> 

Jeśli nadal nie działa, proszę podać:

1) Twój system operacyjny i wersję

2) Twoja wersja gcc

+0

nie pomogło ... ale to była dobra sugestia. – Ataraxia

+2

Nigdy nie dołączaj '' bezpośrednio. Na górze pliku znajduje się nawet en "# error", który uniemożliwia zrobienie tego. – Celada

+0

'uname -a' 'Linux massachusetts 2.6.32-37-generiC# 81-Ubuntu SMP Fri 2 grudnia 20:35:14 UTC 2011 i686 GNU/Linux' 'gcc --version' 'gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 ' – Ataraxia

Powiązane problemy