2011-09-26 8 views
13

मेरे पास एपेंड मोड में एक फ़ाइल खोलने की प्रक्रिया है। इस मामले में यह एक लॉग फ़ाइल है। नमूना कोड:क्या एकाधिक प्रक्रियाएं किसी भी समवर्ती समस्याओं के बिना फॉपेन का उपयोग करके फ़ाइल में संलग्न हो सकती हैं?

int main(int argc, char **argv) { 
    FILE *f; 
    f = fopen("log.txt", "a"); 
    fprintf(f, "log entry line"); 
    fclose(f); 
} 

दो सवाल:

  1. अगर मैं एक ही फाइल को जोड़कर कई प्रक्रियाओं, प्रत्येक लॉग लाइन साफ़ तौर पर दिखाई देगा या वे प्रक्रियाओं संदर्भ स्विच के रूप में interlaced जा सकता है?
  2. क्या यह लिखना ब्लॉक होगा यदि बहुत सी प्रक्रियाओं को फ़ाइल तक पहुंच की आवश्यकता होती है, इसलिए समवर्ती समस्याएं होती हैं?

मैं इसे अपने सरल अवतार में या ज़ीरोमक का उपयोग करके एक लॉग कलेक्टर को पाइप पर लॉग प्रविष्टियों को पंप करने पर विचार कर रहा हूं।

मैंने syslog पर विचार किया लेकिन मुझे वास्तव में सॉफ्टवेयर पर कोई प्लेटफ़ॉर्म निर्भरता नहीं चाहिए।

डिफ़ॉल्ट प्लेटफ़ॉर्म इस बीटीडब्ल्यू के लिए लिनक्स है।

उत्तर

5

आपके पास निश्चित रूप से प्लेटफ़ॉर्म निर्भरताएं होंगी क्योंकि विंडोज एक ही फ़ाइल में संलग्न कई प्रक्रियाओं को संभाल नहीं सकता है।

सिंक्रनाइज़ेशन समस्याओं के बारे में, मुझे लगता है कि लाइन-बफर्ड आउटपुट/आपको अधिकांश समय बचाया जाना चाहिए, यानी 99.99% से कम शॉर्ट लॉग लाइनों को मेरे शॉर्ट शैल-आधारित परीक्षण के अनुसार बरकरार रखना चाहिए, लेकिन हर बार नहीं । स्पष्ट अर्थशास्त्र निश्चित रूप से बेहतर हैं, और चूंकि आप इस हैक सिस्टम को लिखने में सक्षम नहीं होंगे-स्वतंत्र रूप से, मैं एक syslog दृष्टिकोण की सिफारिश करता हूं।

+0

धन्यवाद - यही वही है जो मैं जानना चाहता था। विंडोज़ एकाधिक संलग्न है जो मैं थोड़ा चिंतित था। – Deleted

3

जब अपनी प्रक्रियाओं की तरह कुछ लिखने के लिए जा रहे हैं:

"Hehere's process #2re's process #1" 

आप उन्हें सिंक्रनाइज़ करना होगा:

"Here's process #1" 
"Here's process #2" 

आप शायद की तरह कुछ मिल जाएगा।

1

जब तक आप कुछ प्रकार के सिंक्रनाइज़ेशन नहीं करते हैं तो लॉग लाइन ओवरलैप हो सकती है। तो नंबर दो का जवाब देने के लिए, यह इस बात पर निर्भर करता है कि आप लॉकिंग और लॉगिंग कोड को कैसे कार्यान्वित करते हैं। यदि आप बस लॉक करते हैं, तो फ़ाइल और अनलॉक पर लिखें, इससे समस्याएं हो सकती हैं यदि आपके पास एक ही समय में फ़ाइल तक पहुंचने का प्रयास करने वाली कई प्रक्रियाएं हैं।

8

मैं के बारे में fopen और fprintf लेकिन आप O_APPEND का उपयोग कर फ़ाइल open सकता है पता नहीं है। फिर प्रत्येक write बिना किसी हिच के फ़ाइल के अंत में जाएगा (बिना किसी अन्य लेखन के मिश्रित किए)।

असल standard में देख:

खोला धारा के साथ जुड़े फ़ाइल वर्णनकर्ता आवंटित किया जाएगा और के रूप में यदि खोला कॉल द्वारा() खोलने के लिए निम्नलिखित झंडे के साथ:

a or ab   O_WRONLY|O_CREAT|O_APPEND 

तो मुझे लगता है कि a के साथ फ़ाइल खोले जाने तक यह कई प्रक्रियाओं से fprintf तक सुरक्षित है।

+2

से निहितार्थ से तुम अब भी नहीं या लाइन के लिए बफरिंग स्विच करने के लिए किया है। पूर्ण बफरिंग के साथ यह प्रवेश के बीच में बफर से बाहर हो सकता है और इसके साथ कॉल लिख सकता है। –

+0

@ जन हूडेक यह सही है। फिर भी 'लिखने (2)' का उपयोग करने का एक अन्य कारण। – cnicutar

6

standard (खुला/लिखने के लिए, fopen नहीं/fwrite) कहा गया है कि

फ़ाइल स्थिति झंडे के O_APPEND ध्वज सेट है, तो ऑफसेट फ़ाइल फ़ाइल पहले के अंत तक स्थापित किया जाएगा फ़ाइल लिखने और लिखने के संचालन को बदलने के बीच प्रत्येक लिखने के लिए और कोई हस्तक्षेप फ़ाइल संशोधन ऑपरेशन नहीं होगा।

fprintf() का उपयोग करने के लिए, आपको फ़ाइल पर बफरिंग अक्षम करना होगा।

+0

** महत्वपूर्ण **: यह 'खुला'/'लिखने 'के लिए है, * नहीं * fopen/fwrite। –

+0

सही, लेकिन 'लिखना() '" "fwrite()' और' fprintf() 'के अंतर्गत है, यानी उनके द्वारा उपयोग किया जाता है। यदि बफरिंग अक्षम है, तो इसका उपयोग 1: 1 भी किया जाता है। (लेकिन इसके बारे में बेहतर स्पष्ट हो, तो आप सही हैं।) – glglgl

+0

काम करने के लिए बफरिंग को अक्षम करने की कोई आवश्यकता नहीं है। दरअसल लाइन बफरिंग यह सुनिश्चित करने में मदद करती है कि पूरे लाइन –

2

संपादित आपके प्रश्नों का स्पष्ट रूप से जवाब देने के लिए:

  1. अगर मैं एक ही फाइल को जोड़कर कई प्रक्रियाओं, प्रत्येक लॉग लाइन साफ़ तौर पर दिखाई देगा या वे प्रक्रियाओं संदर्भ स्विच के रूप में interlaced जा सकता है?

हां, प्रत्येक लॉग लाइन क्योंकि msdn/vs2010:

"के अनुसार इस समारोह [कि है, fwrite()] बुला धागा ताले और इसलिए धागा सुरक्षित है बरकरार दिखाई देगा। एक गैर के लिए संस्करण -locking, _fwrite_nolock देख "

ही the GNU manpage:

पर निहित है" - फंक्शन:। size_t fwrite (स्थिरांक शून्य * डेटा, size_t आकार , Size_t गिनती, फ़ाइल * धारा)

This function writes up to count objects of size size from the array data, to the stream stream. The return value is normally count, if the call succeeds. Any other value indicates some sort of error, such as running out of space. 

- फंक्शन: size_t fwrite_unlocked (स्थिरांक शून्य * डेटा, size_t आकार, size_t गिनती, फ़ाइल * धारा)

The fwrite_unlocked function is equivalent to the fwrite function except that it does not implicitly lock the stream. 

This function [i.e., fwrite_unlocked()] is a GNU extension. " 
  1. क्या यह लिखने ब्लॉक करता है, तो कई प्रक्रियाओं को फ़ाइल तक पहुंच की आवश्यकता होती है, इसलिए समवर्ती समस्याएं होती हैं?

हाँ, सवाल 1.

+0

उत्तर के लिए धन्यवाद।मेरे पास संभावित समस्या समेकन है इसलिए लॉकिंग से समस्याएं पैदा हो जाएंगी। मैंने उपयोग किया है क्योंकि उपयोग केस अभी भी मान्य और वर्णनात्मक है। एक बार फिर धन्यवाद! – Deleted

+0

ओह, मैं अंततः इसे प्राप्त करता हूं। "समरूपता समस्या" से आप डरते हैं कि प्रक्रिया 2 ब्लॉक होगी जबकि प्रक्रिया 1 लॉग फ़ाइल में लिखने की कोशिश कर रहा है। मैंने दोनों सवालों को स्पष्ट रूप से दोनों सवालों के समाधान के लिए संपादित किया। –

+0

यह एक है :) - वैसे भी आपके उत्तर के लिए धन्यवाद। मैं कम संक्षेपण आवश्यकताओं पर इसका उपयोग करूंगा। – Deleted

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

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