ruby - Where goes signal sent to process which called system? -


बहुत सरल रूबी स्क्रिप्ट को देखते हुए:

  child = fork do system 'sleep 10000' अंत में 5.टाइम्स करते हैं 1 सोता है "# {बच्चे} को मार डालो" प्रक्रिया। किल ("क्यूआईटी", बाल) एंड  

क्विट सिग्नल बस खो गया है वह कहाँ गया? डिफ़ॉल्ट हेन्डलर वाला कोई चीज़ जो इसे अनदेखा करता है?

उस फोर्क द्वारा बनाए गए सभी प्रक्रियाओं को सिग्नल कैसे भेजा जाए? क्या यह संभव है कि सभी बाल प्रक्रियाओं के लिए खोज न करें?

समस्या यह है कि सिस्टम कॉल अब एक अन्य बाल प्रक्रिया को एक सबशेल्ड में दिए गए कमांड को चलाता है, इसलिए आपके उदाहरण में वास्तव में तीन प्रक्रियाएं चल रही हैं। इसके अतिरिक्त, रूबी कर्नेल # सिस्टम कमांड को मानक सी फ़ंक्शन के माध्यम से कार्यान्वित किया जाता है, जो कि फोर्क और exec कॉल को नई प्रक्रिया बनाने और (पर सबसे सिस्टम) SIGINT और SIGQUIT को अनदेखा करता है, और ब्लॉक SIGCHLD।

यदि आप बस नींद (10000) के बजाय सिस्टम ("sleep 10000") तो आपको उम्मीद है कि काम करना चाहिए। आप इसे संभालकर संभाल करने के लिए बच्चे में SIGQUIT जाल कर सकते हैं:

  child = fork do Signal.trap ("QUIT") {डालता है "बच्चे: ठीक है, समय छोड़ना!"; यदि आप वास्तव में बाल प्रक्रिया से "सिस्टम" कॉल का उपयोग करने की आवश्यकता है, तो आप एक स्पष्ट fork / exec युगल का उपयोग कर बेहतर हो सकते हैं (इसके बजाय  सिस्टम  कॉल में अंतर्निहित हैं), ताकि आप तीसरा फोर्केड बच्चे में अपना संकेत संभाल कर सकें। 


Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -