2011-06-27 24 views
10

Mimo że w tym <signal.h> pojawia się błąd informujący, że struct sigaction jest niekompletnym typem.Nieznany błąd struktury sigaction

Nie mam pojęcia, co z tym zrobić.

Proszę o pomoc

#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; 
} 

komunikatów o błędach:

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

Ten kod kompiluje się na moim komputerze. Jaki jest twój kompilator? libc? opcje kompilacji? – mripard

Odpowiedz

12

Wystarczy

#define _XOPEN_SOURCE 

przed każdym innym linii w kodzie, lub skompilować z opcją -D zdefiniowania preprocesora symbol

gcc ... -D_XOPEN_SOURCE ... 
+0

to działa, ale czy możesz wyjaśnić, dlaczego to konieczne? – lkanab

+1

@lkanab: zgodnie z 'man 7 feature_test_macros' to makro (lub kilka innych) może być użyte, aby" zapobiec ujawnianiu niestandardowych definicji "lub" ujawniać niestandardowe definicje, które nie są domyślnie ujawnione ". [Dodatek B dokumentacji POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap02.html#tag_22_02_02) trochę o tym mówi – pmg

+0

To nie zadziałało! Korzystam z Androida Studio 2.1 z eksperymentalną wtyczką gradown 0.7.2. Każdy pomysł, dlaczego? – kristoffz

1

Rozwiązałem to, zmieniając standard C, którego używałem z gcc.

zmieniłem: gcc -std=c99 ...

do tego: gcc -std=gnu99 ...

Powiązane problemy