2011-06-04 21 views
5

मैं सी के लिए बहुत नया हूं इसलिए कृपया मेरे साथ भालू। मैं वास्तव में लंबे समय से इसके साथ संघर्ष कर रहा हूं और मुझे त्रुटि के कारण को कम करने में कठिन समय था।सी अजीब विसंगति, फ़ाइल में लिखते समय (आमतौर पर stdout पर लिखते समय काम करता है)

मैंने देखा कि जब फ़ाइल को फोर्किंग प्रक्रिया और लिखना (केवल मूल प्रक्रिया फ़ाइल को लिखती है तो एक अजीब चीज होती है, आउटपुट को फोर्क की संख्या से गुणा किया जाता है, समझाने में कठोर, इस प्रकार मैंने एक छोटा परीक्षण किया कोड आप file=stdout के साथ चलाने जहां सकता है और यह समस्या का पुनर्निर्माण करने

#include <stdio.h> 
#include <stdlib.h> 


void foo() 
{ 
    FILE* file = fopen("test", "w"); 
    int i=3; 
    int pid; 
    while (i>0) 
    { 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("Child\n"); 
     exit(0); 
    } 
    else if(pid > 0) 
    { 
     fputs("test\n", file); 
     i=i-1; 
    } 
} 

} 

int main() 
{ 
    foo(); 
    exit(EXIT_SUCCESS); 
} 

संकलित करें और जिस तरह से यह है एक बार यह चलाने के लिए और एक बार जब stdout के लिए लिख उत्पादन होता है:।।

 
test 
test 
test 

लेकिन जब लेखन एफ के लिए इले उत्पादन होता है:

 
test 
test 
test 
test 
test 
test 

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

अच्छी तरह से कहा गया कि मुझे नहीं पता कि यह क्यों हो सकता है, न ही इसे कैसे ठीक किया जाए। लेकिन मैं सी में कुल नौसिखिया हूं इसलिए यह सब के लिए एक सामान्य तार्किक स्पष्टीकरण हो सकता है =)।

आपके सभी समय और उत्तरों के लिए धन्यवाद।

उत्तर

8

stdout आमतौर पर unbuffered या लाइन buffered है; अन्य फाइलें आम तौर पर ब्लॉक buffered हैं। fork() से पहले आपको fflush() की आवश्यकता है, या प्रत्येक बच्चा बफर की अपनी प्रतिलिपि फ्लश करेगा, जिससे यह गुणा बढ़ जाएगा।

+0

आपके त्वरित उत्तर के लिए बहुत बहुत धन्यवाद। मैं वास्तव में सभी कोडों की जांच करने में काफी समय बिताता हूं और यहां तक ​​कि जब मैंने यह देखा तो मुझे अभी भी पता नहीं था कि यह क्या है। अब मैं थोड़ा बेवकूफ महसूस करता हूं, लेकिन हे, हर किसी को सीखने की जरूरत है। एक बार फिर धन्यवाद। – Ben

+1

पीओएसईक्स में प्रासंगिक पाठ यहां है: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05_01 –

+0

'printf ("child \ n") नहीं होना चाहिए;' mutex लॉक होना चाहिए? – farhanhubble

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