एक प्रक्रिया की मूल प्रक्रिया को बदलें?


14

क्या किसी प्रक्रिया की मूल प्रक्रिया को बदलना संभव है? यदि हाँ, तो कैसे?

उदाहरण के लिए,

  • कैसे screenएक screenसत्र और इसके अंदर चल रही प्रक्रियाओं को अलग-अलग शेल प्रक्रियाओं से जोड़ने का प्रबंधन करता है? क्या मूल प्रक्रिया में बदलाव हुआ है?

  • मुझे शेल प्रक्रिया के परिवर्तन के अन्य तरीकों के बारे में सुना है जिसमें एक कार्यक्रम चल रहा है, लेकिन मुझे याद नहीं है। क्या कार्यक्रम की मूल प्रक्रिया में भी बदलाव होता है?

  • मैंने सोचा था कि disownएक प्रक्रिया प्रक्रिया की मूल प्रक्रिया को बदल देती है, सिर्फ इसलिए कि नाम disownका अर्थ है कि। लेकिन मैंने पाया कि यह सच नहीं है।

  • Emacs क्लाइंट एक अलग टर्मिनल टैब पर Emacs सर्वर से जुड़ सकता है। क्या मूल प्रक्रिया में बदलाव हुआ है?


disownबस किसी बच्चे को किसी बच्चे की आंतरिक प्रक्रियाओं की सूची से हटा देता है। बच्चे का पीपीआईडी ​​खोल के बराबर रहता है। खोल भूल गया है कि यह कभी उस बच्चे को शुरू करता है, लेकिन कर्नेल याद रखता है।
वॉरेन यंग

क्या प्रक्रिया अपने माता-पिता को याद करती है?
टिम

यदि यह जानना चाहता है, यह कॉल करता है getppid(2), एक सिस्टम कॉल, और सिस्टम कॉल कर्नेल द्वारा नियंत्रित किया जाता है। किसी प्रोग्राम को उस कॉल को जारी करने, मूल्य को बचाने और उसके मूल्य में बदलाव के बाद उस मूल्य का उपयोग करके भ्रमित किया जा सकता है। यहां दौड़ की स्थिति होने की संभावना है।
वारेन यंग

एक दिलचस्प नई कर्नेल सुविधा की तरह लगता है।
च्च्कॉट्रिल

जवाबों:


14

किसी प्रक्रिया की मूल प्रक्रिया id (ppid) कर्नेल के बाहर नहीं बदली जा सकती; कोई सेटपिड सिस्टम कॉल नहीं है। माता-पिता की प्रक्रिया समाप्त होने के बाद कर्नेल केवल ppid को (pid) 1 में बदल देगा - यदि प्रक्रिया ने उस सिग्नल का जवाब नहीं दिया, जिससे माता-पिता समाप्त हो गए थे। ऐसा होने के लिए, प्रक्रिया को पहले से विभिन्न संकेतों ( SIGHUPऔर SIGTERM, आदि) को अनदेखा करना होगा ।

screen(1)कोचिंग और रिटेटिंग से निपटने का एक बहुत ही सुंदर साधन है। जब आप पहली बार शुरू screenकरते हैं, तो आप वास्तव में एक उपयोगकर्ता इंटरफ़ेस (यूआई) शुरू कर रहे हैं, जो डिफ़ॉल्ट रूप से एक डेमॉन (सत्र प्रबंधक) बनाएगा। इस डेमन के पास इससे जुड़ा कोई टर्मिनल नहीं है, एक नया प्रक्रिया समूह ( setpgrp(2)), एक नया सत्र आईडी ( setsid(2)) है। डेमन, जैसा कि चल रहा है SCREEN, तब छद्म टर्मिनलों ( pty) से जुड़े उपप्रकारों का निर्माण करेगा, फिर ptys और ui ( screen) से डेटा को मल्टीप्लेक्स करेगा । उपप्रजातियों को लगता है कि वे एक वास्तविक टर्मिनल के साथ बात कर रहे हैं।

यदि ui screenसमाप्त हो जाता है, तो डेमॉन SCREENअभी भी चल रहा होगा, डेटा को बफ़र कर रहा है, संकेतों को संभाल रहा है, एक नए यूआई का इंतजार कर रहा है, आदि क्योंकि यह एक अलग प्रक्रिया समूह है और अपने स्वयं के सत्र में है। जब आप एक नए यूआई के साथ screenफिर से जुड़ते हैं , तो डेमॉन मल्टीप्लेक्स जारी रखेगा जैसा कि पहले कर रहा था। जब तक सभी सबप्रोसेस खत्म नहीं हो जाते, तब तक डेमॉन चलती रहेगी, मार दी जाती है, एक घातक बग का सामना किया जाता है या मेजबान रिबूट होता है।


धन्यवाद। मैंने कहा "Emacs क्लाइंट एक अलग टर्मिनल टैब पर emacs सर्वर से जुड़ सकता है। क्या माता-पिता की प्रक्रिया में कोई बदलाव आया है?"
टिम

1
प्रत्येक प्रक्रिया में केवल एक माता-पिता होते हैं, जब तक कि या तो माता-पिता की मृत्यु हो जाती है या वह मर जाता है। यदि यह मर जाता है, तो बिंदु मूक है। यदि माता-पिता की मृत्यु हो जाती है, तो पीपीआईडी ​​1 हो जाता है, initप्रक्रिया। यह एकमात्र समय होता है जब मूल प्रक्रिया बदल जाती है - जब मूल प्रक्रिया समाप्त हो जाती है। इंटरप्रोसेस संचार (पाइप, सॉकेट्स आदि) के माध्यम से कनेक्ट होने से पीपीआईडी ​​पर कोई प्रभाव नहीं पड़ता है।
Arcege

Emacs एक क्लाइंट को विभिन्न टर्मिनल टैब में सर्वर से कैसे जोड़ता है?
टिम

सर्वर एक सॉकेट (आमतौर पर एक UNIX डोमेन सॉकेट फ़ाइल) कनेक्शनों के लिए इंतजार कर रहा है। क्लाइंट (s) उस सॉकेट पर एक कनेक्शन खोलेगा। टैब क्लाइंट और सर्वर के बीच संचार के लिए अप्रासंगिक हैं, यह अलग-अलग टैब, अलग-अलग मंदिरों का अनुकरण (xterm बनाम rxvt बनाम टर्मिनल) हो सकता है, या xemacs हो सकता है। प्रत्येक क्लाइंट जानता है कि कहां कनेक्ट करना है, इसलिए यह कहीं से भी हो सकता है।
Arcege

1
मूल प्रक्रिया आईडी हमेशा नहीं बनती है। यह प्राप्त ज्ञान निरपेक्षता 3 साल से अधिक समय से गलत है।
JdeBP

-2

मै समझता हुँ। ऐसा करने के लिए आपको कुछ मॉड्यूल लिखने के लिए कर्नेल को बदलना होगा! मुझे लगता है कि यह कुछ मामलों में उपयोगी होगा। उदाहरण के लिए, आप कुछ लंबे समय तक कड़ी मेहनत करते हैं वे एक घंटे के लिए कई संसाधन लेते हैं ... और जब सिस्टम प्रतिक्रिया नहीं देता (हमेशा की तरह इस मामले में) आप कुछ अप्रत्याशित कार्य करते हैं (क्योंकि आपको करने की आवश्यकता है और आपको यकीन नहीं है कि आप क्लिक करें सही जगह पर एक माउस इसलिए कि सिस्टम लंबे समय तक प्रतिक्रिया नहीं करता है) और गलती से मूल प्रक्रिया को मार देता है। सिस्टम आमतौर पर सभी बच्चों को मारता है! लेकिन अगर चाइल्ड प्रोसेस रूट है और पेरेंट केवल ऑर्डिनल यूजर है और एक्शन भी ऑर्डिनल यूजर करता है तो यह प्रक्रिया किसी भी हाल में मारी नहीं जाती है! और उनके माता-पिता पीआईडी ​​1 के साथ इनिट होंगे। और अंतिम प्रतिक्रिया पर सिस्टम के बाद आप पदानुक्रम को पुनर्स्थापित करना चाहते हैं। लेकिन आप नहीं कर सकते !!! मानक आप सु के साथ साधारण उपयोगकर्ता के रूप में टर्मिनल से रूट के रूप में उन्नयन प्रणाली शुरू करते हैं। क्यों? तो कंसोल पर सभी गलतियों और चेतावनियों को प्राप्त करने के लिए। विशेष रूप से उन्नयन की उपयोगिता GUI है। उन्हें यह जानकारी कुछ भी नहीं मिलती ... मुझे याद है विंडोज़ ओएस में यह किया जा सकता है। विशेष WinAPI फ़ंक्शन हैं। लिनक्स में ऐसा क्यों नहीं किया जा सकता है? यह स्पष्ट नहीं है ... इसकी सरल बात !!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.