कांटा बम कैसे काम करता है?


22
  • उत्पादन मशीन पर दौड़ने के लिए चेतावनी नहीं है

विषय पर विकिपीडिया पृष्ठ को पढ़ने में मैं आमतौर पर निम्नलिखित कोड के साथ क्या चल रहा है:

:(){ :|:& };:

वर्णन का अंश

2002 में निम्नलिखित कांटा बम को कला के रूप में प्रस्तुत किया गया था;56 इसकी सटीक उत्पत्ति अज्ञात है, लेकिन यह 2002 से पहले यूज़नेट पर मौजूद थी। बम को निम्नलिखित 13 वर्णों को UNIX शेल जैसे बैश या zsh में चिपकाकर निष्पादित किया गया है । यह ':' नामक एक फ़ंक्शन को परिभाषित करके संचालित होता है, जो दो बार कॉल करता है, एक बार अग्रभूमि में और एक बार पृष्ठभूमि में।

हालांकि अंतिम बिट मेरे लिए पूरी तरह से स्पष्ट नहीं है। मैं फ़ंक्शन परिभाषा देखता हूं:

:(){ ... }

लेकिन और क्या चल रहा है? इसके अलावा इस तरह के रूप में अन्य गोले करना ksh, cshऔर tcshभी कुछ इसी तरह का निर्माण करने में सक्षम होने का यही हश्र पीड़ित?


2
यह एक स्टैक एक्सचेंज पर काफी बार पॉप अप करता है, एक अच्छा जवाब यहाँ है: stackoverflow.com/questions/991142/…
Drav Sloan

@DravSloan - मैं उस सामग्री में से कुछ को यहाँ बनाने का प्रयास कर रहा था, मेरा प्रश्न उस तरह से थोड़ा सा भरा हुआ है 8-)।
slm

आप अनिवार्य जोड़ना चाहते हैं "ईश्वर के प्रेम के लिए यह एक उत्पादन मशीन पर नहीं चलता है, या यदि आप उस मशीन का उपयोग जारी रखना चाहते हैं जो आप इसे चलाते हैं !!" संदेश :)
द्रविण स्लोअन

1
@ MartinSchröder - आप समझते हैं कि यह सवाल उस सवाल का नेतृत्व करने के लिए क्या था? 8-)। मैंने इसे एक फ्राइडे की रात को पूछा कि कुछ हो रहा है और फिर एक या दो घंटे बाद दूसरा सवाल आया।
slm

1
@ MartinSchröder - शायद उन्हें अलग छोड़ना सबसे अच्छा है, वे थोड़े अलग हैं। यह पूरे विस्तृत दृष्टिकोण के लिए पूछ रहा है कि कांटा बम कैसे काम करता है, कि अन्य एक तंत्र के बारे में बारीकियों के बारे में पूछ रहा था कि सिस्टम कांटा बम के भीतर कैसे चल रहा है। मुझे पता है कि यह भ्रमित करने वाला लग सकता है b / c वे संबंधित हैं लेकिन वे अलग हैं (IMO - जाहिर है)। मैंने अन्य प्रश्न का भी उत्तर दिया और हुड के नीचे तंत्र को दिखाने की कोशिश की, जो फोर्किंग को चला रहा है, और मैंने इसे डुबकी के रूप में नहीं झंडी दी।
slm

जवाबों:


23

यह फोर्क बम हमेशा मुझे एक एआई प्रोग्रामिंग शिक्षक द्वारा कहे गए कुछ पाठों की याद दिलाता है, जिसमें मैंने पहले पाठ में कहा था "पुनरावृत्ति को समझने के लिए, पहले आपको पुनरावृत्ति को समझना चाहिए"।

इसके मूल में, यह बम एक पुनरावर्ती कार्य है। संक्षेप में, आप एक फ़ंक्शन बनाते हैं, जो स्वयं कॉल करता है, जो स्वयं कॉल करता है, जो स्वयं कॉल करता है .... जब तक कि सिस्टम संसाधनों का उपभोग नहीं किया जाता है। इस विशिष्ट उदाहरण में, फ़ंक्शन को पाइपिंग के उपयोग और इसे बैकग्राउंड करके पुनरावृत्ति को बढ़ाया जाता है।

मैंने इसे StackOverflow पर उत्तर दिया है , और मुझे लगता है कि वहां दिया गया उदाहरण इसे सबसे अच्छा दिखाता है, सिर्फ इसलिए कि यह देखना आसान है कि यह एक नज़र में क्या करता है (ऊपर दिए गए लिंक से चुराया गया है ...)

☃(){ ☃|☃& };☃

बग फ़ंक्शन को परिभाषित करें ☃() { ... }, जिसका शरीर खुद को (बग फ़ंक्शन) कहता है, आउटपुट को स्वयं (बग फ़ंक्शन) को पाइप करता है ☃|☃, और परिणाम को पृष्ठभूमि देता है &। फिर, फ़ंक्शन परिभाषित होने के बाद, वास्तव में बग फ़ंक्शन को कॉल करें ; ☃

मैं ध्यान देता हूं कि कम से कम मेरे आर्क वीएम पर, प्रक्रिया को पृष्ठभूमि देने की आवश्यकता नहीं है, सभी अंतिम प्रक्रिया स्थान का उपभोग करने और मेजबान b0rked को प्रस्तुत करने के लिए एक ही अंतिम परिणाम होने की आवश्यकता नहीं है। दरअसल अब मैंने कहा है कि ऐसा लगता है कि कभी-कभी रन-वे की प्रक्रिया को समाप्त कर दिया जाता है और एक स्क्रीनफुल होने के बाद -bash: fork: Resource temporarily unavailableयह एक Terminated(और journalctlबैश कोर डंपिंग दिखाता है) के साथ बंद हो जाएगा ।

Csh / tsh के बारे में आपके प्रश्न का उत्तर देने के लिए, उनमें से कोई भी शेल फ़ंक्शन का समर्थन नहीं करता है, आप केवल उर्फ ​​कर सकते हैं। तो उन गोले के लिए आपको एक शेल स्क्रिप्ट लिखनी होगी, जो खुद को पुनरावर्ती कहता है।

zsh को समान भाग्य (समान कोड के साथ) का नुकसान लगता है, कोर डंप नहीं करता है और आर्क को देने का कारण बनता है Out of memory: Kill process 216 (zsh) score 0 or sacrifice child., लेकिन यह अभी भी कांटा बना हुआ है। थोड़ी देर बाद यह कहा जाता है Killed process 162 (systemd-logind) ...(और अभी भी एक कांटेदार ज़ीश जारी है)।

आर्क pacmanको ksh का संस्करण नहीं लगता है , इसलिए मुझे इसके बजाय डेबियन पर प्रयास करना पड़ा। ksh ऑब्जेक्ट्स को :एक फ़ंक्शन नाम के रूप में, लेकिन कुछ का उपयोग करके - b()इसके बजाय वांछित परिणाम लगता है।


वे पात्र कौन से हैं? मुझे पता है कि वे कीड़े हैं लेकिन आपने उन्हें कैसे बनाया?
slm

10
जबकि एक छोटे से फ़ॉन्ट आकार में यह बग जैसा दिखता है, आप पाएंगे कि यह वास्तव में एक स्नोमैन है। यह यूनिकोड वर्ण U + 2603 होगा जो HTML में रिक्त स्थान के बिना & # x 2603 दर्ज करके प्रदर्शित किया जा सकता है।
सांभर

2
जाहिर है लिनक्स के तहत Gnome संबंधित एप्लिकेशन और फ़ायरफ़ॉक्स की एक उचित संख्या है Ctrl+Shift+u+<hex>जहाँ हेक्स यूनिकोड वर्ण का हेक्स कोड है जिसे आप प्रदर्शित करना चाहते हैं। देखने योग्य यूनिकोड की एक सूची यहां देखी जा सकती है: fileformat.info/info/unicode/utf8test.htm (अधिकांश विषम "अनुभाग" में हैं)। विंडोज को सुपरयूज़र. com / questions / 47420 /… चेकआउट करना चाहिए , और मैं व्यक्तिगत रूप से लिंक में वर्णित टूल का उपयोग करता हूं unicodeinput.exeया अपने ब्राउज़र के माध्यम से कट और पेस्ट करता हूं। आप हमेशा HTML क्रम का उपयोग कर सकते हैं जैसा कि सांभर द्वारा सुझाया गया है।
द्रव्य स्लोन

1
विकी के पास यूनिकोड वर्णों की सूची भी है: en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

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