Auf SIGTERM reagieren...



  • Hi

    ich hab ein Programm dem ich mit kill(pid, SIGTERM) aus einem anderen Programm sagen möchte, dass es sich beenden soll.

    Prinzipell funktioniert das auch, ABER ich hab in dem sigterm_handler im empfangenden Programm log-nachrichten drin und je nach Ausführungsversuch kommt die Ausführung des sigterm_handler unterschiedlich weit.

    Ich verstehe nicht so recht wo das Problem liegt, das empfangende Programm scheint den SIGTERM zu empfangen und dann aber vorzeitig zu terminieren, bevor die ganze Funktion abgearbeitet ist.

    //auf sigterm reagieren
     if(signal(SIGTERM, sigterm_handler) < 0){ log_message(LOG_ERROR, "Could not set SIGTERM"); clean_up(); exit(1); }
      log_message(LOG_SUCCESS, "Set SIGTERM");
    
    //Die Funktion
    void sigterm_handler(int sig)
    {
      log_message(LOG_INFO, "SIGTERM received");
    
      clean_up();
      exit(0);
    }
    
    void clean_up()
    {
      log_message(LOG_INFO, "Start clean up.....");
    
      if (shmdt(currentUserCount) < 0) //Detach shared memory segment
      {log_message(LOG_ERROR,"Could not detach shared memory segment which holds current user count");} //mal kommt er bis hier
      log_message(LOG_SUCCESS,"Shared memory segment detachted");
      if (shmctl(shrdMem_id, IPC_RMID, NULL) < 0) //Delete shared memory segment
      {log_message(LOG_ERROR,"Could not delete shared memory segment which holds current user count");}
      log_message(LOG_SUCCESS,"Shared memory segment deleted");
      if (semctl(sem_id, 0, IPC_RMID, 0) < 0) //Delete semaphore
      {log_message(LOG_ERROR,"Could not delete semaphore");}
      log_message(LOG_SUCCESS,"Semaphore deleted"); //mal bis hier....
      if (unlink(sem_path) < 0) //Remove semaphore file
      {log_message(LOG_ERROR,"Could not delete semaphore in file system");} 
      log_message(LOG_SUCCESS,"Removed Semaphore from file system");
    
      close(fd_Listener);
      log_message(LOG_INFO, "Closed UDP file descriptor");
      deleteList();
      log_message(LOG_INFO, "Deleted linked list");
    
      log_message(LOG_INFO, "Clean up done.....shutting down");
      log_message(LOG_INFO, "::::ENDofLOG::::");
      close_log_file();
      exit(0); 
    }
    


  • in man 7 signal sind die funktionen aufgelistet die du nach posix in einem signalhandler aufrufen darfst. exit() und besonders der semaphoren-kram gehört schonmal nicht dazu.



  • Wäre also SIGUSR1 die bessere Wahl? Wenn ih mir eine eigenes Signal definiere? Ich versteh niht ganz was das Problem ist?



  • "Wäre also SIGUSR1 die bessere Wahl?"

    nein, du darfst in dem signal handler einfach nicht soviel machen.

    Das signal kommt asynchron, im main thread rein,
    vergleichbar mit einem interrupt.
    Merke dir im signal handler (z.B. in einem bool),
    daß du dich beenden sollst. Wegen meiner logge noch das Signal.
    Dann musst du den signal handler (die Funktion) beenden indem du returnst.

    Dein Programm muss das bool abfragen und sich dann beenden.
    Hier sind dann auch alle cleanups möglich.
    Hierzu kommen dann sofort sämtliche blockieren und wartenden Funktionen read, wait, select, ... mit Fehlercode zurück, typischerweise EINTR.

    Dein Programm sollte sich am Ende der main Funktion mit einem return code beenden. exit solltest du erstmal nicht verwenden.
    Wenn du das schaffst, hast du verstanden wie man Signale verarbeitet.

    Viel Erfolg, Gruß Frank


Anmelden zum Antworten