2008-11-20 18 views
10

का उपयोग करने के बीच अंतर बाइनरी निष्पादित करने और फोर्क/execvp के संयोजन का उपयोग करने के लिए सिस्टम() का उपयोग करने के बीच क्या अंतर है।फोर्क/execvp और सिस्टम कॉल

क्या कोई सुरक्षा/पोर्टेबिलिटी/प्रदर्शन अंतर है।

उत्तर

12

सिस्टम fork/exec ... संयोजन का भी उपयोग करता है। यदि आप fork/exec स्वयं करते हैं तो आप अपनी चल रही प्रक्रिया के समानांतर निष्पादित कर सकते हैं, जबकि system अवरुद्ध है (wait भी शामिल है)। भी system कमांड को सीधे नहीं निष्पादित करता है, लेकिन एक खोल के माध्यम से (जो सेटयूड बिट के साथ समस्याएं बनाता है) और system ब्लॉक/कुछ संकेतों को अनदेखा करता है (सिगिनट, सिग्चिल, सिगक्विट)।

6

हां, system() एक खोल के माध्यम से आदेश चलाता है, जबकि exec() सीधे आदेश चलाता है। बेशक, एक खोल शुरू करना बग और शोषण के लिए खुलता है।

संपादित करें: ज़ाहिर है, the man page अधिक जानकारी प्रदान करता है।

+0

"को मिला एक खोल कीड़े और कारनामों के लिए खुल जाता है" के रूप में भारी है - केवल अगर आप एक व्यक्ति आदेशों टाइप करने के लिए अनुमति देते हैं। यदि आपका एप्लिकेशन शेल कमांड के पाठ को उत्पन्न करता है, तो शोषण की कोई संभावना नहीं है। –

+0

एक संभावना यह है कि यदि उपयोगकर्ता आपके कोड को निष्पादित करने से पहले कुछ शैल चर बदलता है। शोषण की संभावना है, लेकिन यह सुनिश्चित नहीं है कि यह कितना सामान्य है। – foo

+0

आपके पास पथ/लिंकर चाल भी हैं। [लिंक तोड़ना: लिंकर का विस्फोट] (http://www.nth-dimension.org.uk/pub/BTL.pdf)। – jww

3

सिस्टम() विंडोज पर काम करता है लेकिन कांटा() नहीं करता है।

जब तक आप सिग्विन जैसी संगतता परत का उपयोग नहीं करते हैं, तब भी एक कांटा बहुत महंगा हो सकता है।

+0

प्रश्न लिनक्स/यूनिक्स टैग किया गया है, इसलिए एक विंडोज़ उत्तर उपयोगी नहीं है ... –

+1

@ नाथन, सवाल पोर्टेबिलिटी मतभेदों का उल्लेख करता है, जो यह है। – finnw

+0

मेरे पास व्यय के मुद्दे पर एक प्रश्न है, फोर्क सिस्टम की तुलना में अधिक महंगा है। सिस्टम भी एक प्रक्रिया को फोर्क करता है, इसके बजाय यह दो प्रक्रियाओं को फोर्क करता है। – foo

2

वहाँ भी popen है() है, जो) प्रणाली (तरह है, लेकिन बच्चे के उत्पादन

5

system() होगा fork()/exec() खोल पढ़ सकते हैं और इनपुट प्रदान करने की अनुमति देता है, और उसके बाद शैल fork()/exec() कार्यक्रम आप करना चाहते हैं प्रक्षेपण।

तो system() दो बार के रूप fork()/exec()

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