2012-09-21 53 views
6

लिखने सिस्टम कॉल प्रोटोटाइप है:सिस्टम कॉल लिखें, बाइट्स सीमा की संख्या क्या है?

ssize_t write(int fd, const void *buf, size_t count); 

गिनती पैरामीटर अहस्ताक्षरित है, और बदले मूल्य पर हस्ताक्षर किए है।

मदद पृष्ठ का कहना है:

सफलता पर, लिखा दिया जाता है बाइट की संख्या (शून्य इंगित करता है कुछ भी नहीं लिखा गया था)। त्रुटि पर, -1 वापस आ गया है, और errno उचित रूप से सेट है।

हालांकि, यह नहीं कहता कि गिनती पैरामीटर की सीमा क्या है। गिनती SSIZE_MAX से अधिक होने पर यह व्यवहार तब भी नहीं कहता है।

लिखने पर विचार करना एक सिस्टम कॉल है जिसका उपयोग सामान्य उपकरणों/फ़ाइलों/जो कुछ भी हो सकता है, यदि डिवाइस एसएसआईजेडएमएएमएक्स से बड़ा लिखने के संचालन का समर्थन करता है, तो लौटने वाला प्रकार बाइट्स लिखित वास्तविक संख्या को संभाल नहीं सकता है।

मुझे कोई संकेत नहीं है कि बाइट्स की एक हस्ताक्षरित संख्या उत्तीर्ण करने में सक्षम हो और परिणामस्वरूप बाइट्स की एक हस्ताक्षरित संख्या वापस प्राप्त करें। क्यों न सिर्फ एक हस्ताक्षरित नंबर पास?

यह त्रुटि प्रवण की तरह लिखने के कार्य के प्रोटोटाइप की तरह लगता है, या कम से कम यह पथ में एक संभावित छेद छोड़ देता है।

क्या कोई इसके बारे में विवरण जानता है या मुझे यह जानकारी कहां मिल सकती है?

+0

मैं इसे अपने आप को पता नहीं है, लेकिन मेरा मानना ​​है कि सीमा आकार अहस्ताक्षरित पूर्णांक की है। जिसका मतलब है, आप एक बार में 42 9 4 9 672 9 6 बाइट लिखने में सक्षम होना चाहिए। इस मामले में वापसी मूल्य -1 होगा (और आपको यह सुनिश्चित करने के लिए त्रुटि की जांच करनी होगी कि यह वास्तव में एक त्रुटि है) – ATaylor

+8

[POSIX कहता है] (http://pubs.opengroup.org/onlinepubs/007904875/functions/ write.html) "यदि nbyte का मान {SSIZE_MAX} से बड़ा है, तो परिणाम कार्यान्वयन-परिभाषित है", इसलिए लिनक्स मैनपेज की कमी है - इसे इसका वर्णन करना चाहिए। –

+4

छोटे-छोटे हिस्सों के साथ लिखना() लिखना प्रथागत है। मुझे ऐसी परिस्थिति की कल्पना करने में कठिनाई हो रही है जहां एक सिस्कोल के साथ गीगाबाइट लिखना एक अच्छा विचार होगा। – willglynn

उत्तर

0

मुझे लगता है कि सिस्टम फ़ंक्शन को आपके द्वारा दिए गए बाइट्स की संख्या आवंटित करता है। लेकिन मुझे यकीन नहीं। हो सकता है कि आप size_t और ssize_t मैन पेज आज़माएं।

+0

मुझे इसके लिए कोई भी मैन पेज नहीं मिला। – Marcus

+0

मैंने गलती की है, इसमें फ़ोल्डर शामिल है, लेकिन मुझे नहीं पता कि यह किस में है = एस मुझे आशा है कि आपको यह मिल जाएगा! –

+0

चिंता मत करो! आपकी सहायता के लिए धन्यवाद. : डी – Marcus

2

मुझे नहीं लगता कि वहां एक कठिन सीमा है, यह fd अंक पर निर्भर करता है। यदि यह उदाहरण के लिए फाइल सिस्टम पर एक फ़ाइल है, तो फ़ाइल सिस्टम ड्राइवर यदि आप "अधिकतम फ़ाइल आकार की सीमा" से अधिक गला घोंटना होगा, EFBIG त्रुटि लौटने:

EFBIG का प्रयास एक फ़ाइल है कि अधिक है लिखने के लिए बनाया गया था कार्यान्वयन- परिभाषित अधिकतम फ़ाइल आकार या प्रक्रिया फ़ाइल आकार सीमा।

+0

ठीक है, वह पैरामीटर बस डिवाइस-विशिष्ट कार्यान्वयन के माध्यम से पारित हो जाता है। –

+0

यदि 'fd' सॉकेट को संदर्भित करता है (आमतौर पर एक गैर-अवरुद्ध व्यक्ति) तो उसे 'ENOMEM' मिल सकता है। – alk

+0

मैं सॉकेट मामले के बारे में बिल्कुल चिंतित नहीं हूं। मुख्य बिंदु यह है: यदि डिवाइस SSIZE_MAX से बड़ा लिखने के संचालन का समर्थन करता है, तो लौटने वाला प्रकार बाइट्स लिखित वास्तविक संख्या को संभाल नहीं सकता है। यह त्रुटि प्रवण की तरह लिखने के कार्य के प्रोटोटाइप की तरह लगता है, या कम से कम यह पथ में एक संभावित छेद छोड़ देता है। – Marcus

1

यह Google पर:

तो nbyte का मूल्य से अधिक {SSIZE_MAX} है, परिणाम कार्यान्वयन परिभाषित किया गया है।

स्रोत: http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html

+0

मुझे पता है कि कार्यान्वयन परिभाषित किया गया है (जैसा उपर्युक्त पदों में बताया गया है)। हालांकि मुझे एक ऐसा स्थान नहीं मिला जहां उस व्यवहार को किसी विशेष कार्यान्वयन के लिए समझाया गया हो। मेरा मानना ​​है कि "कार्यान्वयन" का मतलब एक उपकरण/फाइल सिस्टम/जो भी कार्यान्वयन है। क्या आप कुछ जगह जानते हैं जहां यह स्थिति देखी जाती है? – Marcus

+0

कार्यान्वयन का अर्थ है कि जो भी उस समारोह को लिखा है। आपके कंपाइलर प्रदाता या ओएस प्रदाता की संभावना है। कंपाइलर या ओएस के दस्तावेज़ों के साथ जांचें। चूंकि आपने लिनक्स टैग किया है, यह शायद जीएनयू सी लाइब्रेरी के साथ जीसीसी है। दुर्भाग्यवश इसके लिए दस्तावेज़ http://www.gnu.org/software/libc/manual/html_node/I_002fO-Primitives.html#I_002fO- प्राइमेटिव्स कार्यान्वयन परिभाषित व्यवहार निर्दिष्ट नहीं करते हैं (दस्तावेज़ पर बग रिपोर्ट दर्ज करना चाहते हैं)। जब तक आप (कई) विश्वास नहीं करते हैं "कोड दस्तावेज है", इस मामले में बस कोड को देखें (जो ओपन सोर्स का पूरा बिंदु है)। –

+0

शायद मैं एक बग रिपोर्ट रखूंगा। धन्यवाद। – Marcus

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