( Https://stackoverflow.com/questions/13718394/what-should-interactive-shells-do-in-orphaned-process-groups में सुझाव के अनुसार यूनिक्स में पुनः पोस्टिंग )
संक्षिप्त प्रश्न यह है कि यदि अनाथ प्रक्रिया समूह में ऐसा कोई शेल है तो उसे क्या करना चाहिए? लेकिन मैं लंबे प्रश्न को पढ़ने की सलाह देता हूं क्योंकि यह मनोरंजक है।
अपने पसंदीदा शेल (जब तक कि आप उन अजीब योगों में से एक नहीं हैं) का उपयोग करके अपने लैपटॉप को पोर्टेबल स्पेस हीटर में बदलने का एक मजेदार और रोमांचक तरीका है:
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
यह सीपीयू को 100% कम करने के लिए बैश का कारण बनता है। zsh और मछली भी ऐसा ही करते हैं, जबकि ksh और tcsh नौकरी नियंत्रण के बारे में कुछ गुनगुनाते हैं और फिर उलटना करते हैं, जो थोड़ा बेहतर है, लेकिन ज्यादा नहीं। ओह, और यह एक प्लेटफ़ॉर्म अज्ञेयवादी अपराधी है: ओएस एक्स और लिनक्स दोनों प्रभावित हैं।
मेरी (संभावित रूप से गलत) व्याख्या इस प्रकार है: बच्चा खोल पता लगाता है कि यह अग्रभूमि में नहीं है tcgetpgrp(0) != getpgrp()
:। इसलिए यह खुद को रोकने की कोशिश करता है killpg(getpgrp(), SIGTTIN)
:। लेकिन इसका प्रोसेस ग्रुप अनाथ है, क्योंकि इसके पैरेंट (C प्रोग्राम) लीडर थे और मर गए, और SIGTTIN
अनाथ प्रोसेस ग्रुप में भेज दिया जाता है। इसलिए, बच्चे के खोल को रोका नहीं गया है, लेकिन यह अभी भी पृष्ठभूमि में है, इसलिए यह यह सब फिर से करता है, तुरंत। धोये और दोहराएं।
मेरा सवाल यह है कि कमांड लाइन शेल इस परिदृश्य का पता कैसे लगा सकता है, और इसके लिए क्या करना सही है? मेरे पास दो समाधान हैं, जिनमें से कोई भी आदर्श नहीं है:
- उस प्रक्रिया को इंगित करने का प्रयास करें जिसका पीआईडी हमारे समूह आईडी से मेल खाता है। अगर वह विफल रहता है
ESRCH
, तो इसका मतलब है कि हम शायद अनाथ हैं। - एक बाइट से एक गैर-अवरुद्ध पढ़ने की कोशिश करें
/dev/tty
। अगर वह विफल रहता हैEIO
, तो इसका मतलब है कि हम शायद अनाथ हैं।
(इस पर नज़र रखने वाला हमारा मुद्दा https://github.com/fish-shell/fish-shell/issues/422 है )
आपके विचारों के लिए धन्यवाद!