Prolem mit sigchld



  • Hallo!

    Mit fork erstellte Kinderprozesse sollten ja theoretisch beim terminieren das Signal SIGCHLD an den Vaterprozess senden.
    Das funktioniert aber nur beim ersten Child welches terminiert, alle anderen senden kein Signal an den Vaterprozess. Hier der (stark vereinfachte) code:

    int main(..) {
      pid_t pid;
      signal(SIGCHLD,func);
    
      while(1) {
       pid = fork();
    
       /*Kindprozess routine*/
       if(pid == 0) {
           ....
           exit(EXIT_SUCCESS);  
       }
    
      }
      return 0;
    }
    
    void func(int sig) {
       ...
    }
    

    Schreibe ich die funktion signal(SIGCHLD,func) innerhalb der while schleife, dann wird von jedem Kindprozess das Signal gesendet...

    In der Dokumentation hab ich nichts darüber gefundn das die Signalhandler nach dem ersten aufruf gelöscht werden (würde auch wenig sinn ergeben).
    In der handlerfunktion wird einfach nur der beendete Kindprozess aus der Processtabelle entfernt.
    Da aber wie gesagt der signalhandler nur für das erste kind aufgerufen wird, hab ich nach kurzer zeit einen haufen Zombies...

    Hoffe iregenjemand kann mir ein paar Tipps geben woran das liegen kann.



  • asfasfasdf schrieb:

    In der Dokumentation hab ich nichts darüber gefundn das die Signalhandler nach dem ersten aufruf gelöscht werden

    Dann hast du anscheinend den Portability-Teil der manpage nicht gelesen.
    Kurz gesagt: Manche Unix-Derivate machen's, manche nicht.



  • Hallo !

    Ja, den Teil hab ich erst zu spät bemerkt, trotzdem danke für den Hineweis!

    Falls es noch jemand interessiert: statt signal einfach sigaction verwenden.


Anmelden zum Antworten