2012-01-13 8 views
13

Estoy escribiendo un programa shell que debe manejar señales. Mi código relacionado con el manejo de señales relevante es la siguiente:compila errores usando signal.h en 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); 

Compilación me da los siguientes avisos y errores:

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' 

Puede alguien decirme por qué estoy recibiendo estos avisos y errores?

Respuesta

12

Funcionará si elimina -ansi de su línea de compilación. Sospecho que el problema es que las partes posix de la biblioteca de señales no están incluidas cuando especifica -ansi.

Si realmente no desea deshabilitar -ansi, también puede agregar -D_POSIX_C_SOURCE a las opciones del compilador.

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

+0

eliminando '-ansi' me deja con: ' /tmp/ccl4HmT7.o: En la función main': ' '/home/stu1/s11/gaw9451/Cursos/OS_3/os1shell2.c: 68: undefined' 'referencia a handler_function'' ' collect2: ld devuelto 1 estado de salida' Añadiendo el '-D_POSIX_C_SOURCE' hace lo mismo. Alguna idea sobre esto ?? – Ataraxia

+0

¿Tiene 'handler_function' definido en alguna parte? Está declarado en su pregunta, pero no hay un código para eso. Tuve que agregar 'void handler_function (int signal_id) {}', y luego su código compilado bien. –

0

Intente mover "sys/types.h" antes de "signal.h".

Si eso no funciona, trate de añadir esto:

#include <bits/sigaction.h> 

Si todavía no funciona, por favor especifique:

1) Su sistema operativo y la versión

2) Su versión de gcc

+0

no ayudó ... pero esa fue una buena sugerencia – Ataraxia

+2

Nunca incluya '' directamente. Incluso hay un '# error' en la parte superior del archivo que te impide hacer esto. – Celada

+0

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

Cuestiones relacionadas