sigaction benutzen geht nicht
-
Hallo,
ich versuche mich gerade am kompilieren folgenden Codes:#include <signal.h> (...) struct sigaction sigAct; <- ERROR! memset(&sigAct, 0, sizeof(sigAct)); (...) sigAct.sa_handler = sighandler; // Funktion sighandler ist separat implementiert sigaction(SIGCHLD, &sigAct, NULL); (...)
Irgendwie geht das nicht, ich bekomme per gcc immer denselben Fehler angezeigt:
error: storage size of 'sigAct' isn't known
warning: unused variable sigAct;Eigentlich scheint "sigaction" dem System (Debian/Linux 2.6/ komplett unbekannt zu sein, woran liegt das? Ich habe auch schon erfolglos <linux/signal.h> included. Woran kann das liegen, bzw wie verwendet man/kompiliert man den Code auf Linux?
Der Code meines Programmes ist eig fast identisch mit folgendem Beispiel und hat auch dieselben "includes" wie der "inetd-server" von http://www.zotteljedi.de/doc/socket-tipps/
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <signal.h> #include <sys/wait.h> #include <errno.h> #define PORT 1234 void handler(int sig) { int stat; pid_t pid; pid = wait(&stat); printf("Child %i exited.\n", pid); } void start_app(int sock) { close(0); /* stdin schliessen */ close(1); /* stdout schliessen */ close(2); /* stderr schliessen */ dup(sock); /* sock wird 0 -> stdin */ dup(sock); /* sock wird 1 -> stdout */ dup(sock); /* sock wird 2 -> stderr */ /* man haette hier auch dup2() verwenden koennen */ close(sock);/* sock schliessen */ setsid(); /* neue Prozessgruppe */ execl("/bin/sh", "sh", NULL); /* execl kehrt nie zurueck, wenn erfolgreich */ perror("execl() failed"); exit(1); } int main(void) { int s, c; struct sockaddr_in addr; struct sigaction sa; pid_t pid; /* wichtig: sonst sind "komische" Flags gesetzt */ memset(&sa, 0, sizeof(sa)); s = socket(PF_INET, SOCK_STREAM, 0); if (s < 0) { perror("socket() failed"); return 1; } addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = htons(PORT); if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind() failed"); return 2; } if (listen(s, 3) < 0) { perror("listen() failed"); return 3; } /* fuer Demonstrationszwecke wird der Prozess nicht als * Daemon detached, sondern bleibt an der Konsole kleben. */ sa.sa_handler = handler; sigaction(SIGCHLD, &sa, NULL); for(;;) { c = accept(s, NULL, 0); if (c < 0) { if (errno != EINTR) perror("argh, dead client? accept() failed"); continue; } switch((pid = fork())) { case -1: perror("fork() failed"); break; case 0: start_app(c); /* kommt niemals zurueck */ break; default: printf("Child: %i\n", pid); break; } } }
-
Hallo,
ich weiss zwar immer noch nicht warum sigaction bei mir nicht funktioniert (hab es mittlerweile in anderen Programmen auch ausprobiert, aber werde wohl mal ein Signal Tutorial lesen muessen.Mittlerweile habe ich folgenden Ansatz der zu funktionieren scheint:
vor dem for( ; ; ) [bei mir while(1)] habe ich folgende Zeilen eingefuegt und obigen Code der mit sigaction zu tun hat geloescht, die handler() ist unveraendert.// ... if(SIG_ERR == (signal(SIGCHLD, handler)){ perror("signal failed"); exit(1) } for(;;){ // ...
Seltsam, aber damit kompiliert der Code.