2010-02-08 14 views
10

एक साधारण प्रश्न:fwrite परमाणु है?

मुझे अपने कार्यक्रम में कुछ लॉगिंग जोड़ने की आवश्यकता है।

यदि दो प्रक्रियाएं एक ही फ़ाइल पर "fwrite" का उपयोग करती हैं लेकिन एक ही फाइल डिस्क्रिप्टर नहीं लिखित लॉग संदेश परमाणु या मिश्रित होंगे। क्या लंबाई सीमा है?

क्या यह एएनएसआई-सी व्यवहार या कार्यान्वयन परिभाषित किया गया है? यदि बाद में मैकॉक्स, लिनक्स और विंडोज एमएसवीसी पर क्या है?

+0

अनुभव से है, उच्च प्राथमिकता कार्य/धागा एक निम्न प्राथमिकता धागे के पाठ में कहीं उनके टेक्स्ट रखने का विकल्प होगा। इसे कतार से एक कार्य आउटपुट और कतार में जोड़ने के लिए एक और कार्य करके हल किया जा सकता है। –

उत्तर

3

इसे मिश्रित किया जा सकता है।

यदि आपके पास एक ही फ़ाइल में एक से अधिक धागे/प्रक्रिया लेखन हैं, तो आपको लॉकिंग का उपयोग करने की आवश्यकता है।

एक वैकल्पिक सेवा/थ्रेड पर लॉग संदेश भेजने का विकल्प है। गोद लेने के लिए एक उत्कृष्ट उपकरण syslog है, जो निश्चित रूप से सभी यूनिक्स पर स्थापित है और Windows पर चलाया जा सकता है।

14

कुछ शोध करने के बाद और मैंने पाया इस link में निम्नलिखित:

POSIX मानक की आवश्यकता है कि सी stdio फ़ाइल * संचालन परमाणु कर रहे हैं। पॉज़िक्स-अनुरूप सी पुस्तकालय (उदाहरण के लिए, सोलारिस और जीएनयू/लिनक्स) में आंतरिक म्यूटेक्स है जो FILE * s पर ऑपरेशन को क्रमबद्ध करने के लिए है।

ऐसा लगता है कि कॉल परमाणु होना चाहिए, लेकिन यह आपके प्लेटफ़ॉर्म पर निर्भर करता है। एक ही लिंक में, वहाँ भी है एक और पैरा आपको लगता है कि प्रोग्रामर ध्यान रखना चाहिए देता है कि:

तो, 3.0 के लिए, का सवाल "आई/ओ के लिए बहु सूत्रण सुरक्षित है" साथ उत्तर दिया जाना चाहिए, "क्या आपके प्लेटफ़ॉर्म का सी लाइब्रेरी थ्रेडसेफ I/O के लिए है?" कुछ डिफ़ॉल्ट रूप से हैं, कुछ नहीं हैं; कई लाइब्रेरी के कई कार्यान्वयन थ्रेड्सफ्टी और दक्षता के विभिन्न व्यापारिकताओं के साथ प्रदान करते हैं। आप, प्रोग्रामर, हमेशा के लिए आवश्यक हैं एकाधिक थ्रेड के साथ देखभाल करते हैं।

इसके अलावा, जैसा कि आपके पास दो अलग-अलग प्रक्रियाओं में दो अलग FILE* हैं, मुझे लगता है कि आपके पास कोई विकल्प नहीं है।

+0

लेकिन प्रत्येक प्रक्रिया की अपनी फाइल है? – Will

+0

@Will: आपका अधिकार। अपडेट किया गया, धन्यवाद! – yeyeyerman

+1

विंडोज़ पर भी, 'fwrite' परमाणु है।[स्रोत] (https://msdn.microsoft.com/en-us/library/h9t88zwz.aspx?f=255&MSPPError=-2147217396): * चूंकि यह फ़ंक्शन कॉलिंग थ्रेड को लॉक करता है, यह थ्रेड-सुरक्षित है। गैर-लॉकिंग संस्करण के लिए, _fwrite_nolock देखें। * – rustyx

1

डेबियन लेनी पर "मैन फ्लॉकफाइल" से, stdio फ़ंक्शन थ्रेड-सुरक्षित हैं।

अधिक जानकारी के लिए थ्रेड-असुरक्षित stdio फ़ंक्शन, "man unlocked_stdio" हैं।

आप मैन पेज से अधिक जानकारी प्राप्त कर सकते हैं। दृश्य स्टूडियो के लिए

-1

fwrite बुला धागा ताले और इसलिए धागा सुरक्षित

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