सी मानक आईओ सुविधा का उपयोग करना जटिलता की एक नई परत से परिचित करवाता है फाइल को पूरी तरह से write(2)
के माध्यम से संशोधित किया जाता है - सिस्टम कॉल (या मेमोरी मैपिंग्स) का फ़ामली, लेकिन इस मामले में इसका उपयोग नहीं किया जाता है) - सी मानक आईओ रैपर थोड़ी देर के लिए फ़ाइल में लिखना स्थगित कर सकता है और एक सिस्टम में पूर्ण अनुरोध सबमिट नहीं कर सकता है कहते हैं।
write(2)
कॉल ही अच्छी तरह से व्यवहार करना चाहिए:
[...] If the file was
open(2)ed with O_APPEND, the file offset is first set to the
end of the file before writing. The adjustment of the file
offset and the write operation are performed as an atomic
step.
POSIX requires that a read(2) which can be proved to occur
after a write() has returned returns the new data. Note that
not all file systems are POSIX conforming.
इस प्रकार आपके मौलिक write(2)
कॉल ठीक से व्यवहार करेंगे।
उच्च स्तरीय सी मानक आईओ धाराओं के लिए, आपको बफरिंग का भी ख्याल रखना होगा। setvbuf(3)
फ़ंक्शन का उपयोग अप्रयुक्त आउटपुट, लाइन-बफर आउटपुट, या ब्लॉक-बफर आउटपुट का अनुरोध करने के लिए किया जा सकता है। डिफ़ॉल्ट व्यवहार धारा से स्ट्रीम में बदल जाता है - यदि मानक आउटपुट और मानक त्रुटि टर्मिनल पर लिख रही है, तो वे डिफ़ॉल्ट रूप से लाइन-buffered और unbuffered हैं। अन्यथा, ब्लॉक-बफरिंग डिफ़ॉल्ट है।
इंटरलीव किए गए डेटा को रोकने के लिए, यदि आपका डेटा स्वाभाविक रूप से रेखा-उन्मुख है, तो आप लाइन-बफर किए गए मैन्युअल रूप से चुन सकते हैं।यदि आपका डेटा लाइन उन्मुख नहीं है, तो आप un-buffered का उपयोग करना चाहेंगे या इसे ब्लॉक-buffered छोड़ सकते हैं, लेकिन जब भी आप आउटपुट की एक "इकाई" जमा करते हैं तो डेटा को मैन्युअल रूप से फ़्लश करें।
यदि आप एक समय में BUFSIZ
बाइट्स से अधिक लिख रहे हैं, तो आपके लेखन अंतःस्थापित हो सकते हैं। setvbuf(3)
फ़ंक्शन इंटरलिविंग को रोकने में मदद कर सकता है।
प्रदर्शन के बारे में बात करने में समय हो सकता है, लेकिन ब्लॉक बफरिंग ब्लॉक बफरिंग से धीमी हो रही है। यदि आप डिस्क की गति के करीब लॉगिंग कर रहे हैं, तो आप यह सुनिश्चित करने के लिए पूरी तरह से एक और दृष्टिकोण लेना चाहेंगे कि आपके लेखन इंटरलीव नहीं हैं।
संभावित (बेहतर) डुप्लिकेट [दो प्रक्रियाओं को दोहराएं] (http://stackoverflow.com/questions/1842909/fopen-two-processes)। – blahdiblah
यह भी देखें [क्या एकाधिक प्रक्रियाएं किसी भी समवर्ती समस्याओं के बिना फॉपेन का उपयोग करके फ़ाइल में संलग्न हो सकती हैं?] (Http://stackoverflow.com/questions/7552451/can-multiple-processes-append-to-a-file-using-fopen- बिना-किसी भी-संगामिति-समस्या)। – blahdiblah
मुझे आपके लॉग के उपयोग के संदर्भ को नहीं पता है, लेकिन मैं 'syslog' पर एक नज़र डालने की सलाह दूंगा। शायद यह आपको उपयुक्त बनाता है। इसके साथ काम करना वास्तव में सरल है। http://www.gnu.org/software/libc/manual/html_node/Submitting-Syslog-Messages.html –