2014-11-26 4 views
6

के बीच क्या अंतर है exit() और exit_group() के बीच क्या अंतर है। किसी भी प्रक्रिया जिसमें एकाधिक धागे हैं, बाहर निकलने के बजाय exit_group का उपयोग करना चाहिए?निकास() और exit_group()

why do you ask प्रश्न का उत्तर देने के लिए - हमारे पास एक प्रक्रिया है जिसमें लगभग चालीस धागे हैं। जब कोई थ्रेड लॉक हो जाता है, तो हम स्वचालित रूप से प्रक्रिया से बाहर निकलते हैं और फिर प्रक्रिया को पुनरारंभ करते हैं। और हम लॉक किए गए थ्रेड के बैकट्रैक को प्रिंट करते हैं। हम जानना चाहते थे कि इस मामले में बाहर निकलने का तरीका Exit_group से अलग है या नहीं।

From the docs: This system call is equivalent to exit(2) except that it terminates not only the calling thread, but all threads in the calling process's thread group - हालांकि, प्रक्रिया से बाहर निकलने और सभी धागे से बाहर निकलने के बीच क्या अंतर है। प्रक्रिया से बाहर नहीं निकल रहा है == सभी धागे से बाहर निकलना।

+1

दस्तावेज़ के अनुसार (और 'स्ट्रेस' के साथ प्रयोग करने के लिए), [निकास (3)] (http://man7.org/linux/man-pages/man3/exit.3.html) 'exit_group का उपयोग कर रहा है ' –

+0

बीटीडब्ल्यू, आप क्यों पूछते हैं? यह वास्तव में केवल 'libc' कार्यान्वयन करने वालों के लिए मायने रखता है। –

+0

सी लाइब्रेरी का 'निकास' 'exit_group' सिस्टम कॉल को कॉल करता है। 'निकास' सिस्टम कॉल केवल कॉलिंग प्रक्रिया से बाहर निकलता है (और एक प्रक्रिया कर्नेल बोलने में एक धागा है)। –

उत्तर

3

सभी धागा पुस्तकालयों मुझे पता है (उदाहरण के लिए हाल ही में glibc या musl-libc) उनके धागा कार्यान्वयन के लिए निम्न स्तर के clone(2)system call उपयोग कर रहे हैं (और कुछ सी पुस्तकालयों भी clonefork एक प्रक्रिया के लिए उपयोग कर रहे हैं)।

clone एक कठिन लिनक्स syscall है। जब तक आप थ्रेड लाइब्रेरी कार्यान्वयन नहीं करते हैं, तो आपको इसे सीधे का उपयोग नहीं करना चाहिए, बल्कि लाइब्रेरी फ़ंक्शंस के माध्यम से (जैसे pthread_create(3)); या तो धागे (एक मल्टी-थ्रेडेड प्रक्रिया में पता स्थान साझा करने) या प्रक्रियाओं: भी futex(7) देखें pthread_mutex* कार्यों

में इस्तेमाल clone syscall कार्य बनाने के लिए प्रयोग किया जाता है।

exit_group syscall इन कार्यों से बाहर निकलने से संबंधित है।

संक्षेप में, आप सीधेexit_group या clone का उपयोग कभी नहीं होगा। आपका libc आपके लिए ऐसा कर रहा है। तो exit_group या _Exit पर ध्यान न दें; आपको केवल मानक लाइब्रेरी फ़ंक्शन exit(3) का उपयोग करना चाहिए, जो विशेष रूप से atexit(3) & on_exit(3) पंजीकृत हैंडलर और फ्लश <stdio.h> बफर के साथ सौदा करता है। दुर्लभ मामलों में आप ऐसा नहीं करना चाहते हैं, _exit(2) का उपयोग करें (लेकिन आपको शायद इसकी आवश्यकता नहीं है)।

बेशक , अगर आप अपने खुद के libc खरोंच से reimplementing रहे हैं, आप के बारे में exit_group & clone देखभाल करने के लिए की जरूरत है; लेकिन अन्यथा आप उनके बारे में परवाह नहीं करते हैं।

यदि आप गोरी कार्यान्वयन के विवरण की परवाह करते हैं, तो अपने libc के स्रोत कोड में गोता लगाएँ। विवरण libc -version, कर्नेल -version, और संकलक विशिष्ट हो सकता है!

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