2013-11-03 4 views
5

बनने के मैनुअल में नहीं मिला, यह उल्लेख किया:क्यों SIGHUP संकेत जब <a href="http://www.gnu.org/software/libc/manual/html_node/Orphaned-Process-Groups.html" rel="nofollow">orphaned process groups</a> के बारे में libc जीएनयू के लिए एक लंबे समय से अनुत्तरित प्रक्रिया समूह

“process groups that continue running even after the session leader 
has terminated are marked as orphaned process groups. 

When a process group becomes an orphan, its processes are sent a SIGHUP 
signal. Ordinarily, this causes the processes to terminate. However, 
if a program ignores this signal or establishes a handler for it 
(see Signal Handling), it can continue running as in the orphan process 
group even after its controlling process terminates; but it still 
cannot access the terminal any more. ” 

मैं एक परीक्षण प्रोग्राम लिखने, लेकिन जब प्रक्रिया समूह एक अनाथ हो जाता है, इसकी प्रक्रिया SIGHUP संकेत प्राप्त नहीं किया था। मैं सोच रहा हूँ क्यों?

#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 


static void 
sig_hup(int signo) //**never get called ???** 
{ 
    printf("SIGHUP received, pid = %ld\n", (long)getpid()); 
} 

static void 
pr_ids(char *name) 
{ 
    printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n", 
     name, (long)getpid(), (long)getppid(), (long)getpgrp(), 
     (long)tcgetpgrp(STDIN_FILENO)); 
    fflush(stdout); 
} 

int 
main(void) 
{ 
    char c; 
    pid_t pid; 

    pr_ids("parent"); 
    pid = fork(); 
    if (pid > 0) {  // parent 
     sleep(5); 
     exit(0);   // parent exit; 
    } else { 
     pr_ids("child"); 
     setsid();  //create new session, and "child" becomes the session leader 
     pid = fork(); 
     if(pid>0) { 
      sleep(20); 
      exit(0);  // "child" exit 
         // so the process group become an orphan process group 
     } 
     else{ 
      pr_ids("grandson"); 
      signal(SIGHUP, sig_hup); // establish signal handler 
      sleep(60);     // now becoming orphan process group 
      printf("end\n"); 
     } 
    } 
    exit(0); 
} 

उत्तर

0

उस दस्तावेज़ में अनुभाग एक प्रक्रिया है कि एक मॉडेम hangup, या आभासी समकक्ष (एक ssh सत्र समाप्त, आदि) द्वारा था एक आम तौर पर की एक को नियंत्रित करने के लिए टर्मिनल के नुकसान के बारे में विशेष रूप में बात कर रहा है। (मुझे लगता है कि दस्तावेज़ में phrasing यहां सुधार किया जा सकता है)। जब आप setsid() का उपयोग करते हैं, तो आप setsid() रिटर्न के समय नियंत्रण टर्मिनल तक पहुंच छोड़ देते हैं, इसलिए आगे से खोने के लिए कोई नियंत्रित टर्मिनल नहीं है।

आप कर सकते थे open() एक tty डिवाइस (जैसे कि एक प्राइवेट दास के रूप में) एक नियंत्रित टर्मिनल हासिल करने के लिए (ध्यान दें कि आप कुछ अतिरिक्त आपरेशन करने के लिए के रूप में अच्छी तरह से FreeBSD एक TIOCSCTTY ioctl की आवश्यकता हो सकती है), तो इसे फिर से खो देते हैं, और फिर आपको SIGHUP सिग्नल प्राप्त करना चाहिए।

1

अनाथ प्रक्रिया समूह SIGHUP के बाद SIGCONT प्राप्त करते हैं यदि वे अनाथ बनने पर रोक दिए जाते हैं।

नींद पर्याप्त नहीं है, आप की जरूरत:

kill(getpid(), SIGSTOP); 

इसके अलावा, POSIX की आवश्यकता नहीं है अगर orphaning या setprgrp()setsid() के कारण हुई थी क्योंकि तब यह नहीं था कि SIGHUP और SIGCONT भेजा जाना एक बाहरी प्रक्रिया के कारण निर्दोष रूप से नौकरी नियंत्रण से अनजान (http://pubs.opengroup.org/onlinepubs/9699919799/functions/_exit.html देखें)।

हालांकि, बच्चे में sleep(60) के बजाय kill(getpid(), SIGSTOP) के साथ, यदि आप setsid() पर कॉल नहीं करते हैं तो भी आपको अपने प्रोग्राम के साथ अनाथ अनाथ मिलेगा।

#define _GNU_SOURCE 
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <signal.h> 

static void 
sig_hup(int signo) //**never get called ???** 
{ 
    printf("SIGHUP received, pid = %ld\n", (long)getpid()); 
} 

static void 
pr_ids(char *name) 
{ 
    printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n", 
     name, (long)getpid(), (long)getppid(), (long)getpgrp(), 
     (long)tcgetpgrp(STDIN_FILENO)); 
    fflush(stdout); 
} 

int 
main(void) 
{ 
    pid_t pid; 

    pr_ids("parent"); 
    pid = fork(); 
    if (pid > 0) {  // parent 
     sleep(5); 
     _exit(0);   // parent exit; 
    } else { 
     pr_ids("child"); 

     /*setsid();  //create new session, and "child" becomes the session leader*/ 

     pid = fork(); 
     if(pid>0) { 
      sleep(2); 
      exit(0);  // "child" exit 
         // so the process group become an orphan process group 
     } 
     else{ 
      pr_ids("grandson"); 
      signal(SIGHUP, sig_hup); // establish signal handler 
      kill(getpid(), SIGSTOP); 
      printf("end\n"); 
     } 
    } 
    exit(0); 
} 

माता-पिता के मरने के बाद बच्चे में आपको एक SIGHUP मिलना चाहिए (5 एस)।

संबंधित मुद्दे