2010-11-22 9 views
51

अगर मैं शास्त्रीय बैश को forkbomb चलाएँ:क्यों सी-फोर्कबॉम्ब बैश वाले की तरह काम नहीं करते हैं?

:(){ :&:&};: 

अपने सिस्टम रुक जाता है कुछ सेकंड के बाद।

मैं सी में एक को forkbomb लिखने का प्रयास किया है, यहाँ कोड है:

#include <unistd.h> 

int main() 
{ 
    while(1) { 
     fork(); 
    } 
    return 0; 
} 

जब मैं इसे चलाने प्रणाली कम जिम्मेदार हो जाता है, लेकिन मुझे लगता है कि इस प्रक्रिया को मार सकता है (मिनट के बाद भी) सिर्फ ^C दबाने।


ऊपर कोड मूल बैश को forkbomb मैं पोस्ट से अलग है: इसे और अधिक की तरह कुछ है:

:() 
{ 
    while true 
    do 
     : 
    done 
} 

(मैं यह परीक्षण नहीं किया था, यदि यह लटका चाहते पता नहीं है सिस्टम)।

इसलिए मैंने मूल संस्करण को लागू करने का भी प्रयास किया; यहां कोड:

#include <unistd.h> 

inline void colon(const char *path) 
{ 
    pid_t pid = fork(); 
    if(pid == 0) { 
     execl(path, path, 0); 
    } 
} 

int main(int argc, char **argv) 
{ 
    colon(argv[0]); 
    colon(argv[0]); 
    return 0; 
} 

लेकिन अभी भी कुछ नहीं: मैं इसे चला सकता हूं और फिर इसे आसानी से मार सकता हूं। यह लटका नहीं है मेरी प्रणाली।


क्यों?

बैश फोर्कबॉम्ब के बारे में इतना खास क्या है? क्या ऐसा इसलिए है क्योंकि बैश बहुत अधिक मेमोरी/सीपीयू का उपयोग करता है? चूंकि बैश प्रक्रियाएं मेरी तुलना में बहुत अधिक सिस्टम कॉल (उदाहरण के लिए, फाइल सिस्टम तक पहुंचने के लिए) कहती हैं?

+0

जैसा कह रहा है, वैज्ञानिक सफलता शायद ही कभी "यूरेका!" के साथ होती है, आमतौर पर "हम्म, यह अजीब है।" –

उत्तर

44

वह सी प्रोग्राम छोटा है, गंभीरता से छोटा है। इसके अलावा, इस तरह के एक कार्यक्रम में कांटा() 'बहुत ही कुशल है। हालांकि, बैश जैसे एक दुभाषिया, राम उपयोग के मामले में अधिक महंगा है, और हर समय डिस्क तक पहुंचने की आवश्यकता है।

इसे अधिक लंबे समय तक चलाने का प्रयास करें। :)

+26

इसके अलावा, आधुनिक यूनिक्स वर्चुअल मेमोरी के लिए कॉपी-ऑन-राइट का उपयोग करते हैं। जब तक कि प्रत्येक प्रक्रिया वास्तव में स्मृति स्थान पर नहीं लिखती, तब तक वे सभी 'निष्पादन' के बाद भी एक ही भौतिक पृष्ठ का उपयोग नहीं करेंगे। कुछ यादृच्छिक mallocs रखो और malloced स्मृति को लिखना। मुझे लगता है कि मशीन को मार डालेगा। – JeremyP

+0

हां, मैंने पहले से ही इन चीजों का हवाला दिया है, लेकिन उनमें से कौन सा सिस्टम लटका है और क्यों? यदि किसी भी प्रक्रिया के लिए मैं उगता हूं, तो मैं ढेर/ढेर पर 1 एमबी मेमोरी आवंटित करता हूं, क्या यह मेरे सिस्टम को लटकाएगा? या यदि कोई प्रक्रिया गहन गणना के 1 सेकंड करता है? या अगर कोई प्रक्रिया कुछ सिस्टम कॉल कहती है? – peoro

+3

@peoro: तकनीकी रूप से आपने नहीं किया। मेरा मुद्दा यह नहीं था कि प्रत्येक नई प्रक्रिया कम स्मृति का उपयोग करती है लेकिन यह वास्तव में कोई अतिरिक्त स्मृति (कर्नेल संरचनाओं के अलावा) का उपयोग नहीं करती है। जब आप एक कांटा करते हैं, तो बाल प्रक्रिया माता-पिता के समान भौतिक पृष्ठों का उपयोग तब तक करती है जब तक कि यह स्मृति में कुछ लिखती न हो। निष्पादन के साथ भी, निष्पादन योग्य छवि साझा की जाती है। एक नया स्टैक पेज बनाया जाएगा, लेकिन बड़ा प्रदर्शन हत्यारा स्वैपिंग कर रहा है और यह तब तक नहीं होने वाला है जब तक आप कुछ लिखते नहीं हैं। – JeremyP

3

अपने बैश फोर्कबॉम्ब में, आप नई पृष्ठभूमि प्रक्रिया समूहों में नई प्रक्रियाएं डाल रहे हैं, इसलिए आप उन्हें ^C करने में सक्षम नहीं होंगे।

0

मूल रूप से आकार के कारण होता है। जब आप बैश कांटा बम चला रहे हैं तो यह बड़े राक्षस कार्यक्रमों को स्मृति में लोड करता है (आपके सी प्रोग्राम के संबंध में) उनमें से प्रत्येक आपके सीपीयू संसाधनों पर होगिंग शुरू कर देता है। निश्चित रूप से जब बड़े राक्षस परेशानी को पुन: उत्पन्न करना शुरू करते हैं तो मधुमक्खियों से अधिक तेज़ी से शुरू होता है वही। तो कंप्यूटर तुरंत लटकता है। हालांकि यदि आप अपने सी निष्पादन योग्य लंबे समय तक चलते रहते हैं तो यह सिस्टम को भी लटका देगा। बस इतना समय होगा। यदि आप सी प्रोग्राम के आकार के साथ बैश के आकार की तुलना करना चाहते हैं तो चेक/proc // स्थिति देखें। बैश के किसी भी चल रहा है उदाहरण के पीआईडी ​​के साथ पहली बार, और फिर एक सी कार्यक्रम

3
इस के लिए

असली कारण के किसी भी चल रहा है उदाहरण के पीआईडी ​​के साथ कि मार में प्रक्रिया आपके द्वारा बनाए गए माता-पिता से अलग किया जाता है। यदि माता-पिता की प्रक्रिया (जिसे आपने शुरू में शुरू किया था) मारे गए हैं, बाकी की प्रक्रियाएं चल रही हैं।लेकिन सी कार्यान्वयन में आपने सूचीबद्ध किया है कि माता-पिता की हत्या होने पर बच्चे की प्रक्रिया मर जाती है, इसलिए शुरुआती प्रक्रिया को नीचे लाने के लिए पर्याप्त है जो आपने पूरे कभी-कभी-कभी प्रक्रियाओं के पेड़ को नीचे लाने के लिए शुरू किया है।

मैंने अभी तक एक सी फोर्कबॉम्ब कार्यान्वयन नहीं किया है जो बाल प्रक्रियाओं को अलग करता है ताकि माता-पिता मर जाए तो वे मारे नहीं जाएंगे। इस तरह के कार्यान्वयन के लिए लिंक की सराहना की जाएगी।