2010-03-07 29 views
6

मैंने कांटा के बारे में पढ़ा है और जो मैं समझता हूं, प्रक्रिया को क्लोन किया गया है लेकिन कौन सी प्रक्रिया है? स्क्रिप्ट स्वयं या प्रक्रिया जिसने स्क्रिप्ट लॉन्च की थी?क्या होता है जब प्रक्रिया को फोर्क किया जाता है?

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

मैं अपने मशीन पर rTorrent चल रहा हूँ और जब एक धार पूरा करता है, मैं एक स्क्रिप्ट इसके खिलाफ चल चुके हैं। यह स्क्रिप्ट वेब से डेटा प्राप्त करती है, इसलिए इसे पूरा होने में कुछ सेकंड लगते हैं। इस समय के दौरान, मेरी rtorrent प्रक्रिया जमे हुए है। इसलिए मैं अगर मैं CLI से इस स्क्रिप्ट को चलाने निम्नलिखित

my $pid = fork(); 
if ($pid == 0) { blah blah blah; exit 0; } 

का उपयोग कर स्क्रिप्ट कांटा बना दिया, यह जबकि यह पृष्ठभूमि में चलता है, बिल्कुल के रूप में मैं इरादा एक दूसरे के अंदर वापस खोल करने के लिए आता है। हालांकि, जब मैं इसे rTorrent से चलाता हूं, तो यह पहले से भी धीमा लगता है। तो वास्तव में क्या फोर्क किया गया था? क्या rtorrent प्रक्रिया क्लोन खुद और मेरी लिपि उस में भाग गया था, या मेरी लिपि क्लोन खुद ही किया? मुझे लगता है कि इसका मतलब बनता है।

+1

एक काम पर्ल टुकड़ा पोस्ट करके प्रारंभ करें। –

+2

स्ट्रिंग में rTorrent चलाने का प्रयास करें और देखें कि आपकी स्क्रिप्ट चलने पर यह क्या अवरुद्ध हो रहा है। यह एक सुराग दे सकता है। मैं सोच रहा था कि यह पोते की प्रक्रिया पर इंतजार कर रहा था (लेकिन ऐसा लगता है कि पारंपरिक प्रणाली कॉल का उपयोग कर व्यवहार वास्तव में संभव नहीं है। – jdizzle

उत्तर

2

नाममात्र सवाल का जवाब करने के लिए, जब से तुम ने टिप्पणी की कि स्वीकार किए जाते हैं जवाब ऐसा करने के लिए विफल रहता है, fork प्रक्रिया है जिसमें यह कहा जाता है को प्रभावित करता है।rTorrent एक पर्ल प्रक्रिया है जो तब fork कॉल को उत्पन्न करने के अपने उदाहरण में, यह पर्ल प्रक्रिया है जो, दोहराया गया है के बाद से यह पर्ल प्रक्रिया है जिसके fork कहा जाता था।

सामान्य स्थिति में, वहाँ fork किसी भी खुद के अलावा किसी अन्य प्रक्रिया के लिए एक प्रक्रिया के लिए कोई रास्ता नहीं है। यदि यह संभव थे एक और मनमाने ढंग से प्रक्रिया बताने के लिए fork ही जाना है, जो सुरक्षा और प्रदर्शन के मुद्दों की कोई अंत नहीं खुल जाएगा।

+2

बहुत सारे चुटकुले की संभावना को खोलने के अलावा: "अरे तुम! अपने आप को फोर्क जाओ!" "नहीं, आप कांटा!" – Ether

6

fork() फ़ंक्शन TWICE लौटाता है! एक बार माता-पिता की प्रक्रिया में, और एक बार बाल प्रक्रिया में। आम तौर पर, दोनों प्रक्रियाएं हर तरह से पहचान योग्य होती हैं, जैसे कि प्रत्येक व्यक्ति fork() से वापस लौटा था। केवल अंतर यह है कि एक में, fork() से वापसी मूल्य 0 है, और दूसरे में यह गैर-शून्य (बाल प्रक्रिया का पीआईडी) है।

तो जो भी प्रक्रिया आपकी पर्ल स्क्रिप्ट चल रही थी (यदि यह आरटीओआरेंट के अंदर एक एम्बेडेड पर्ल दुभाषिया है तो आरटीओआरेंट प्रक्रिया होगी) fork() हुआ बिल्कुल ठीक उसी बिंदु पर डुप्लीकेट किया जाएगा।

+0

मुझे नहीं लगता कि यह वास्तव में अपने प्रश्न ... – jdizzle

+2

@jdizzle संबोधित कर रहा है है - शायद क्योंकि सवाल ज्यादा मतलब नहीं है, क्योंकि 'somebody' प्रक्रिया और forking विचारों को नहीं समझता। कुछ तथ्यों को समझाते हुए मदद कर सकते हैं :) – viraptor

+1

@viraptor - मुझे लगता है कि किसी के पास कांटा() आईएनजी की पर्याप्त समझ है। प्रश्न वास्तव में rTorrent के कार्यान्वयन के बारे में है। – jdizzle

3

दुभाषिया कांटे वाली पूरी प्रक्रिया। सौभाग्य से स्मृति कॉपी-ऑन-राइट है इसलिए इसे फोर्क के लिए सभी प्रक्रिया मेमोरी की प्रतिलिपि बनाने की आवश्यकता नहीं है। हालांकि, फाइल डिस्क्रिप्टर जैसी चीजें खुली रहती हैं। यह बाल प्रक्रियाओं को उन्हें संभालने की अनुमति देता है, लेकिन अगर वे उचित रूप से बंद नहीं होते हैं तो समस्याएं हो सकती हैं। आम तौर पर, fork() को चरम दुविधा के अलावा एक एम्बेडेड दुभाषिया में उपयोग नहीं किया जाना चाहिए।

+0

मेह। ऐसा नहीं है कि अंत में उपयोगकर्ता की मशीन पर पेर्ल में फोर्क() को दुनिया का अंत है। मैं मानता हूं कि अक्सर उपयोग करने के लिए शायद यह खराब अभ्यास है (क्योंकि यह एक बाधा के लिए एक परिपक्व बिंदु है)। – jdizzle

+0

यदि यह एक बुरा अभ्यास है, तो अवरोध रोकने के लिए कोई वैकल्पिक तरीका है? – somebody

2

मेरी सलाह "ऐसा मत करें" होगी।

यदि पर्ल दुभाषिया rtorrent प्रक्रिया के भीतर एम्बेडेड है, तो आप लगभग पूरी तरह से एक पूरी rtorrent प्रक्रिया फोर्क किया है, जिसके प्रभाव शायद सबसे खराब रूप से खराब परिभाषित हैं। भाषा के बावजूद एक एम्बेडेड दुभाषिया में प्रक्रिया-स्तर की सामग्री के साथ खेलना आम तौर पर एक बुरा विचार है।

एक शानदार मौका है कि कुछ प्रकार के लॉक को ठीक से जारी नहीं किया जा रहा है, या प्रक्रियाओं के भीतर धागे अनपेक्षित और संभवतः प्रतिस्पर्धी तरीकों से आगे बढ़ रहे हैं।

+0

वास्तव में पर्ल दुभाषिया के खिलाफ वास्तव में लिंक करना कितना आम है? क्या यह सिस्टम()) के लिए इस तरह की कॉल के लिए अधिक व्यावहारिक (और सुरक्षित) नहीं होगा? – jdizzle

+0

सच है कि बहु-थ्रेडेड प्रोग्राम में 'फोर्क() 'को कॉल करना परेशानी मांग रहा है। यदि आप बच्चे की प्रक्रिया में क्या होता है, तो यह इतना बुरा नहीं है। उदाहरण के लिए, कुछ भी कॉल न करें जिसे उपयोगकर्ता-मोड लॉक प्राप्त करने की आवश्यकता है। लेकिन 'dup2()', 'close()', 'execve()' आदि के साथ निम्नलिखित 'कांटा() 'का सामान्य उपयोग सुरक्षित होना चाहिए। – asveikau

+0

@jdizzle: बाहरी दुभाषिया, पर्ल या अन्यथा के खिलाफ लिंक करना बहुत आम है, लेकिन यह इस सवाल से पूरी तरह स्पष्ट नहीं है कि यह मामला है या नहीं। हालांकि फिर से पढ़ने पर, आप सही हो सकते हैं कि सिस्टम() का उपयोग किया जा रहा है। –

4

मेरा मानना ​​है कि मुझे rTorrent के स्रोत को देखकर समस्या मिली। कुछ प्रक्रियाओं के लिए, यह जारी रखने से पहले stdout को भेजे गए सभी आउटपुट को पढ़ेगा। यदि यह आपकी प्रक्रिया में हो रहा है, तो जब तक आप stdout प्रक्रिया को बंद नहीं करते हैं तब तक RTorrent अवरुद्ध हो जाएगा। क्योंकि आप फोर्किंग कर रहे हैं, आपके बच्चे की प्रक्रिया माता-पिता के समान स्टडआउट साझा करती है। आपकी मूल प्रक्रिया बाहर निकल जाएगी, लेकिन पाइप खुला रहता है (क्योंकि आपकी बाल प्रक्रिया अभी भी चल रही है)। यदि आपने rTorrent की एक कलाई की है, तो मैं शर्त लगाता हूं कि यह आपके आदेश को निष्पादित करते समय इस read() कॉल पर अवरुद्ध होगा।

fork() से पहले अपनी पर्ल स्क्रिप्ट में stdout को बंद/पुनर्निर्देशित करने का प्रयास करें।

+0

समस्या हल करता है, लेकिन नाममात्र प्रश्न का उत्तर नहीं देता है। मैं वह पसंद करूँगा। – darch

+0

@darch - प्रश्न का शीर्षक वास्तव में – jdizzle

+0

को हल करने की कोशिश करने की समस्या के लिए प्रासंगिक है, मुझे यह बहुत उपयोगी लगता है, इसलिए इसे "नाममात्र प्रश्न का उत्तर नहीं दिया", @jdizzle :) –

1

जब हम कांटा का उपयोग कर प्रक्रिया बनाते हैं तो बच्चे की प्रक्रिया में पता स्थान की प्रतिलिपि होगी। इसलिए बच्चा भी पता स्थान का उपयोग कर सकता है। और यह माता-पिता द्वारा खोले गए फ़ाइलों तक भी पहुंच सकता है। हम कर सकते हैं बच्चे पर नियंत्रण। बच्चे की पूरी स्थिति पाने के लिए हम प्रतीक्षा का उपयोग कर सकते हैं।

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