2011-06-27 22 views
10

Aunque incluyo <signal.h> me sale un error al decir que struct sigaction es un tipo incompleto.estructura sigaction error incompleto

No tengo ni idea de qué hacer con él.

Por favor, ayuda

#include <signal.h> 
struct sigaction act; 

int main(int argc, char** argv) 
{ 
    int depth; 

    /* validate arguments number*/ 
    if(argc < 2) 
    { 
     printf("fatal error: please use arguments <MaxChild> <MaxDepth>\n"); 
     exit(1); 
    } 

    /* register the realtime signal handler for sigchld*/ 

/*173*/ 
    memset(&act,0,sizeof(act)); 
    act.sa_handler = sigproc; 
    sigaction(SIGCHLD, /* signal number whose action will be changed */ 
      &act,  /* new action to do when SIGCHLD arrives*/ 
      NULL);  /* old action - not stored */ 


    srand(time(NULL)); 
    depth = rand() % atoi(argv[2]); /* [0 maxDepth]*/ 

    RecursiveFunc(atoi(argv[1]), depth); 

    return 0; 
} 

Los mensajes de error:

proc.c: In function ‘main’: 
proc.c:173:22: error: invalid application of ‘sizeof’ to incomplete type ‘struct sigaction’ 
proc.c:174:2: error: invalid use of undefined type ‘struct sigaction’ 
cc1: warnings being treated as errors 
proc.c:175:2: error: implicit declaration of function ‘sigaction’ 
+0

Este código se compila en mi máquina. ¿Cuál es tu compilador? libc? opciones de compilación? – mripard

Respuesta

12

Sólo

#define _XOPEN_SOURCE 

antes de que cualquier otra línea en su código, o compilar con la opción -D para definir el preprocesador símbolo

gcc ... -D_XOPEN_SOURCE ... 
+0

esto funciona, pero ¿puede explicar por qué es necesario? – lkanab

+1

@lkanab: de acuerdo con 'man 7 feature_test_macros', esta macro (u otras) se puede usar para" evitar que se expongan definiciones no estándar "o" exponer definiciones no estándar que no están expuestas por defecto ". [El Apéndice B de la documentación POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html#tag_22_02_02) habla un poco al respecto – pmg

+0

¡Esto no funcionó! Estoy usando Android Studio 2.1 con el pluper experimental 0.7.2. ¿Alguna idea de por qué? – kristoffz

1

Resolví esto cambiando el estándar C que estaba usando con gcc.

me cambió: gcc -std=c99 ...

a esto: gcc -std=gnu99 ...

Cuestiones relacionadas