2011-09-29 12 views
14

अरे अगर मैं तुच्छ सवाल पूछ रहा हूँ मन कृपया नहीं है, लेकिन, किसी ने मुझसे इस के साथ मदद कर सकते हैं कृपया ..fwrite और freadite पर fwrite और pread के फायदे क्या हैं?

+0

संभावित डुप्लिकेट [यूनिक्स में पढ़ने और प्रीड के बीच क्या अंतर है?] (Https://stackoverflow.com/questions/1687275/what-is-the-difference-between-read-and-pread-in- यूनिक्स) –

उत्तर

11

जब आप यादृच्छिक पढ़ने/लिखते हैं तो यह उपयोगी होता है। स्क्लाइट के लिए एक विकल्प भी है जो seek() + read() और seek() + write()pread()/pwrite() के साथ प्रतिस्थापित करता है। यह उपयोगी क्यों है? seek() + read() और seek() + write() दोनों सिस-कॉल की एक जोड़ी है, जबकि pread() और pwrite() एकल सिस-कॉल कर रहे हैं। कम sys-call - अधिक दक्षता।

+0

अरे, लेकिन मैं फ़ाइल डिस्क्रिप्टर कैसे प्राप्त करूं .... जब मैं इसे फॉपेन करता हूं तो यह मुझे एक फ़ाइल सूचक देता है, तो मैं एक int फ़ाइल डिस्क्रिप्टर कैसे प्राप्त कर सकता हूं ??? – Invictus

+0

प्रीड/प्राइट पॉज़िक्स सिस्टम कॉल (जैसे लिनक्स, फ्रीबीएसडी ...) हैं। वे यूनिक्स फ़ाइल वर्णनकर्ताओं के साथ काम कर रहे हैं जो चींटियां हैं। आप ओपन() syscall (फ़ंक्शन) का उपयोग कर एक प्राप्त कर सकते हैं। http://linux.die.net/man/2/pwrite – GreenScape

+0

@Invictus: 'FILE *' को ''fileno (3)'] के साथ कच्चे 'int'' fd' में परिवर्तित किया जा सकता है (https://linux.die.net/man/3/fileno) यदि आप 'fopen' का उपयोग करना चाहते हैं लेकिन कभी-कभी निम्न स्तर की सिस्टम कॉल के साथ अंतर्निहित 'fd' का उपयोग करते हैं। ध्यान दें कि निम्न स्तर की सिस्टम कॉल में 'stdio' 'FILE *' ऑब्जेक्ट्स के उपयोगकर्ता स्पेस बफरिंग को नहीं देखा जाता है, इसलिए यदि उपयोगकर्ता स्पेस बफर एक चीज़ कहता है तो आपको समस्या हो सकती है, और आप इसे सीधे' लिखने '/ ' pwrite'/'read' /' pread' कॉल। – ShadowRanger

28

वहाँ दो भागों हैं:

  1. अंतर pread के बीच/pwrite और read/write:

    वे दोनों एक ही स्तर पर हैं, अर्थात् सिस्टम कॉल। दो मतभेद हैं:

    1. "पी" वेरिएंट पढ़ने के लिए ऑफसेट लेते हैं, इसलिए वे वर्तमान फ़ाइल सूचक से स्वतंत्र हैं। इससे कई धागे से समवर्ती रूप से पढ़ने/लिखना आसान हो जाता है।
    2. "पी" वेरिएंट केवल तलाश करने योग्य फाइलों पर काम करते हैं (यानी असली फाइलें, पाइप, सॉकेट या डिवाइस नहीं)।
  2. read/pread/write/pwrite और fread/fwrite के बीच अंतर:

    "f" वेरिएंट पूर्व के मानक क्रम रैपर (बुनियादी वेरिएंट का उपयोग) कर रहे हैं। वे इन-प्रोसेस बफरिंग का समर्थन करते हैं। यह सरल कोड के लिए प्रदर्शन में काफी सुधार कर सकता है, लेकिन यह प्रणाली-कॉल स्तर अव्यवहारिक की अन्य विशेषताओं का उपयोग करता है।

केवल यादृच्छिक ऑफसेट पर पढ़ने (परहेज करना चाहता है और एक फाइल संभाल के माध्यम से समवर्ती पहुंच की अनुमति देते) है, जो अक्सर डेटाबेस फ़ाइलों को किसी तरह का साथ मामला (के लिए रिकार्ड "पी" वेरिएंट का उपयोग आप अच्छा उपयोग हो, तो ज्ञात ऑफसेट पर रिकॉर्ड के साथ उन्मुख) और शायद ही कभी अन्य अनुप्रयोगों में।

+0

हू? मुझे pread()/pwrite() में स्कैटर-इकट्ठा करने के लिए कोई समर्थन नहीं दिख रहा है। शायद आप readv()/writev() मतलब था? लिनक्स और कुछ बीएसडी वेरिएंट जैसे कुछ सिस्टम "संयोजन" syscalls preadv()/pwritev() हैं लेकिन यह अभी तक पॉज़िक्स का हिस्सा नहीं है। – janneb

+0

@janneb: एचएम, दाएं। मैंने कुछ गलत समझा और वास्तव में मैन पेज को पढ़ा नहीं, हालांकि मैंने इसे खोल दिया था। –

+0

अरे, लेकिन मैं फ़ाइल डिस्क्रिप्टर कैसे प्राप्त करूं .... जब मैं इसे फॉपेन करता हूं तो यह मुझे एक फ़ाइल सूचक देता है, तो मैं एक int फ़ाइल डिस्क्रिप्टर कैसे प्राप्त कर सकता हूं ??? – Invictus

2

वर्तमान फ़ाइल स्थिति pread/pwrite पर कॉल के बाद परिवर्तित नहीं होती है।

इसके अलावा आपको वर्तमान फ़ाइल स्थिति pread/pwrite बदलने के लिए lseek पर कॉल करने की आवश्यकता नहीं है, जब कई धागे शामिल होते हैं तो संभावित दौड़ स्थितियों से बचें।

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