मेरे पास गो में एक एप्लिकेशन है जो एसटीडीआईएन और बाइनरी के STDOUT को दोहराता है और फिर उन्हें चलाता है। संक्षेप में मैं कर रहा हूँ:गोलांग: बाल प्रक्रियाएं लाश बन जाती हैं
- create command object with the binary path (lets call the object command A) - create command object with the binary path (calling it command B) - set the stdout of command B to the stdin of Command A - start command A - start command B
मैंने देखा जब भी आदेश बी बाहर निकलता है के लिए प्रक्रिया है, जबकि आदेश एक चल रहा है, यह प्रक्रिया तालिका में एक ज़ोंबी प्रक्रिया हो जाता है।
commandA := exec.Command("samplebin")
commandB := exec.Command("sample2bin")
cmdAStdin := commandA.StdinPipe()
commandB.Stdout = cmdAStdin
commandA.Start()
commandB.Start()
commandB एक ज़ोंबी बन क्यों अगर यह बाहर निकल जाता है, जबकि Commanda अभी भी चल रहा है:
यहाँ एक उदाहरण है? मैं उबंटू 14 पर गो 1.5 चला रहा हूं।
तो, सिग्चेड को लाश बनने से ठीक पहले बच्चों की प्रक्रियाओं द्वारा भेजा जाता है? फिर सिग्चाल्ड को "अनदेखा" कैसे करता है? सिग्नल पकड़कर और कुछ नहीं कर कर? – AJPennster
SIGCHLD कर्नेल द्वारा भेजा जाता है जब एक बच्चा इसे ज़ोंबी बनाने के हिस्से के रूप में करता है। यदि आप इसके बजाय SIG_IGN से SIGCHLD अनदेखी करने के लिए और अभी भी लाश मिलता है, SIG_DFL (डिफ़ॉल्ट) को SIGCHLD कार्रवाई सेट चाहते हैं - डिफ़ॉल्ट कार्रवाई कुछ भी नहीं करना है, लेकिन अभी भी लाश मिलता है। –
मुझे लाश नहीं चाहिए, मैं बाहरी प्रक्रियाओं को साफ करना चाहता हूं। मैंने SIGCHLD को अनदेखा करने के लिए मुख्य एप्लिकेशन में सिग्नल सेट अप करने का प्रयास किया और अभी भी ज़ोंबी बनाये ताकि मैं प्रतीक्षा() को कॉल कर सकूं। – AJPennster