2010-08-23 11 views
7

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

while (true) 
{ 
//get the most up-to-date info from the other processes 
pFile = fopen(paramsFileName, "r"); 

// Do a bunch of stuff with pFile 

Sleep(100); 
} 

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

क्या आपको लगता है कि के बारे में सोच सकते हैं कि इस का कारण होता है?

+0

अधिकांश ऑपरेटिंग सिस्टम की एक सीमा है कि एक समय में कितनी फाइलें खोली जा सकती हैं। यह किस ओएस पर चल रहा है? –

+1

http://www.word-detective.com/2009/01/16/intensive-purposes/ –

+2

विंडोज 7. यह देखने के लिए अब जांच कर रहा है कि fclose() मेरी समस्या हल करता है या नहीं। मुझे अन्य लोगों के कोड को ठीक करने से नफरत है ..... – Paul

उत्तर

13

आप अपने ओएस के लिए खुली हुई फ़ाइल/फ़ाइल वर्णनकर्ता सीमा तक पहुंच गए हैं। यदि आप अपने लूप में fclose (pFile) करते हैं तो इसे हमेशा के लिए चलाना चाहिए।

+0

fclose() समस्या से छुटकारा नहीं प्रतीत होता है: < – Paul

+3

आप फ्लेक्ज़ कहां डाल रहे हैं? कृपया अधिक कोड दिखाएं। और क्या आपने विफलता से पहले सफल होने की संख्या की गणना की है? यदि वह संख्या सुसंगत है, तो यह फ़ाइल डिस्क्रिप्टर सीमा की सबसे अधिक संभावना है। –

+0

एचएमएम ऐसा प्रतीत होता है कि मैं मूर्ख हूं और जब भी मैं फ़ंक्शन छोड़ देता हूं, तो इसके अंत में नहीं। यह तय है! – Paul

0

पहले यह विफल रहता है कितनी बार फ़ाइल खोल दिया गया है की गिनती करके देखें।

साथ ही, यह ओएस एक स्कैन, जो ब्लॉक fopen समारोह के लिए फ़ाइल खोल रहा है, अशक्त लौटने के बाद से यह फ़ाइल खोलने में असफल रहा था संभव है।

+0

मैंने सोचा कि यह हो सकता है (या इसे दूसरी प्रक्रिया लिखना), लेकिन थोड़ी देर में डालना (पीएफआईएल == न्यूल) {नींद (100); पीएफआईएल = फॉपेन (..); } इसे हल नहीं किया। – Paul

+0

क्यों कोशिश नहीं करें: pFile = null; जबकि (pFile == null) { pFile = fopen (paramsFileName, "r"); } – VerticalEvent

+0

यह वही प्रभाव है, नींद बस देरी करने और अन्य प्रक्रियाओं को समाप्त करने के लिए समय दे रही थी। भले ही काम न करें। – Paul

2

आप ऐसा क्यों कर रहे हैं? इस

while (true) 
{ 
//get the most up-to-date info from the other processes 
pFile = fopen(paramsFileName, "r"); 

// Do a bunch of stuff with pFile 

fclose(pFile); 

// 
Sleep(100); 
} 

से निपटने के लिए याfopen कॉल लगातार बुला fopen द्वारा खुले फ़ाइलों की संख्या पर है कि आप ओएस सीमा तक नहीं पहुंच पाश

//get the most up-to-date info from the other processes 
    pFile = fopen(paramsFileName, "r"); 
    while (true) 
    { 
    // Do a bunch of stuff with pFile 

    Sleep(100); 
    } 
    fclose(pFile); 

आश्चर्य की बात नहीं की बाहर में ले जाएँ दो तरीके आपके मामले में ...

+0

मैं सिस्टम को जानकारी साझा करने के तरीके को पुन: कार्य नहीं कर सकता, इसलिए सिस्टम को क्या कर रहा है, इसके बारे में अद्यतन जानकारी प्राप्त करने के लिए मुझे पास की गई फ़ाइल को खोलना होगा। मुझे पता है कि यह करने के लिए यह एक भयानक/धीमा तरीका है, लेकिन मैं इसे फिर से लिख नहीं सकता। – Paul

5

आप वास्तव में अपनी वापसी कोड की जांच करना चाहते। मुझे संदेह है कि सही त्रुटि के साथ पेरर/स्ट्रेरर रिपोर्ट करेगा कि आपने अपनी फ़ाइल डिस्क्रिप्टर सीमा को समाप्त कर दिया है। यदि आप एक अच्छा त्रुटि संदेश मिलता है इस तरह

कोशिश कुछ और देखते हैं।

FILE* f = fopen(filename); 
if (NULL == f) { 
    fprintf(stderr, 
      "Could not open: %s. %s\n", 
      filename, 
      strerror(errno); 
} 
+0

क्या वह PHP कोड है? –

+1

@Lasse: मूल प्रश्न सी कोड दिखाया; प्रश्न सी ++ के रूप में टैग किया गया है और यह उत्तर सी कोड दिखाता है। PHP कहाँ से आया था? –

+0

त्रुटि मुद्रण कोड के लिए धन्यवाद! यह वास्तव में मदद की! – Paul

0

मैं एक धागा अनुमान लगा रहा है कि पाश में शुरू कर दिया है, और pFile कि सूत्र को भेजा, कि धागा करने के लिए इसे छोड़ने फ़ाइल बंद हुआ।

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

बस डालने के लिए, आपको यह सुनिश्चित करने की ज़रूरत है कि पीएफआईएल कॉल पर पॉइंटर को भी उस पर फ्लेक्स कॉल करें (मुख्य थ्रेड से उस पर फ्लेक्स न करें, अगर किसी अन्य थ्रेड पर काम करने की ज़रूरत है)।

उम्मीद है कि इससे मदद मिलती है।

बीटीडब्ल्यू, 'FILE में, मुझे बताता है कि यह सी ++ कोड है (जावा के पास इसके प्रकार के आगे' * 'नहीं है)।