मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या मैं सिग्नल प्राप्त कर सकता हूं जिसने एक कस्टम SIGCHLD हैंडलर का उपयोग करके एक बच्चे की प्रक्रिया को समाप्त कर दिया है, जो कि SA_SIGINFO पर ध्वज सेट के साथ एक सिगेक्शन में पारित हो गया है। जो मुझे समझ में आया उससे si_status को si_code मान के आधार पर एक निकास मान या सिग्नल मान की रिपोर्ट करनी चाहिए।

यह SIGCHLD हैंडलर के लिए कोड है:

static void sigchdl (int sig, siginfo_t *siginfo, void *context)
{

  int code = siginfo -> si_code, status = siginfo -> si_status;

      if(code == CLD_EXITED) 
      if(WIFEXITED(status)) printf("the background command with PID: %ld                               has been successfull\n,(long)siginfo>si_pid);

      else if(code == CLD_KILLED) {

       //2 = SIGINT, 9 = SIGKILL, 15 = SIGTERM (man signal)

      if(WTERMSIG(status) == 2 || WTERMSIG(status) == 9 || WTERMSIG(status) == 15)

      printf("Il comando in background con PID: %ld e' stato terminato dal segnale %d, chiamato           da: %d\n", (long)siginfo->si_pid, siginfo -> si_status, getpid());

      else

       perror("Command terminated abnormally\n"); 
       
      } 
   
}

अब मेरा सवाल है, पहला: क्या ऐसा करना संभव है?

दूसरा: यदि हाँ, तो क्या मैं इसे si_status और si_code का उपयोग करके कर सकता हूँ?

0
Edoardo Rosso 8 सितंबर 2020, 12:33

1 उत्तर

सबसे बढ़िया उत्तर

प्रश्न हल हो गया।

नया स्निपेट:

static void sigchdl (int sig, siginfo_t *siginfo, void *context)
{


  int code = siginfo -> si_code, status = siginfo -> si_status;

      printf("si_code: %d\n", code);
      printf("si_status: %d\n", status);


      if(code == CLD_EXITED) { if(WIFEXITED(status)) printf("Il comando in background con PID: %ld e' terminato normalmente\n",
            (long)siginfo->si_pid); }

      else if(code == CLD_KILLED) {

       //2 = SIGINT, 9 = SIGKILL, 15 = SIGTERM

      if(status == 2 || status == 9 || status == 15)

      printf("Il comando in background con PID: %ld e' stato terminato dal segnale %d, chiamato da: %d\n",
            (long)siginfo->si_pid, siginfo -> si_status, getpid());


      }

      else if(code == CLD_DUMPED) perror("il comando è terminato in modo anormale \n"); 

}

समस्या WTERMSIG के साथ थी जो प्रतियोगिता में बेकार हो गई। स्थिति पहले से ही सिग्नल स्थिर मान रखती है। "सिग्नल द्वारा समाप्त" मामले को पहचानने के लिए si_code जांच अभी भी आवश्यक है।

एक प्रक्रिया के असामान्य व्यवधान को पहचानने के लिए CLD_DUMPED कोड भी जोड़ा गया।

0
Edoardo Rosso 8 सितंबर 2020, 09:57