2016-04-08 9 views
8
#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1; 
    fork(); 
    exit(0); 
} 

forkcout में स्ट्रीमिंग के बाद स्थित है, लेकिन इस कोड को प्रिंट 11. क्यों? और कोड केवल 1 प्रिंट क्यों करता है यदि std::endlcout में जोड़ा गया है?फोर्क() परिणाम डुप्लिकेट आउटपुट में क्यों होता है?

#include <iostream> 
#include <unistd.h> 
#include <stdlib.h> 

int main() { 
    std::cout << 1 << std::endl; 
    fork(); 
    exit(0); 
} 
+8

दो प्रक्रियाओं में बफर दो बार फंस जाते हैं। मैन, यह कष्टप्रद होना चाहिए। –

+1

दुर्भाग्यवश, सी ++ ऑब्जेक्ट फोर्किंग के साथ अच्छी तरह से नहीं खेलते हैं। असल में, ऑब्जेक्ट प्रभावी रूप से प्रतिलिपि बनाने के बिना प्रतिलिपि बनाई जाती है, और यह सी ++ द्वारा निर्मित बहुत सी सुरक्षा को रोकती है। – SergeyA

+0

मैं केवल कल्पना कर सकता हूं कि मानक कंटेनर पर 'फोर्क()' विलुप्त हो जाएगा। बस यह मत करो। –

उत्तर

12

यह स्ट्रीम बफरिंग के कारण होता है। धारा में std::endl डालने से इसे फ़्लश किया जा सकता है, इसलिए जब आप कांटा, स्ट्रीम बफर खाली होता है। जब आप std::endl नहीं डालते हैं, तब तक प्रोग्राम बाहर निकलने तक फ़्लश नहीं होता है। fork() आउटपुट स्ट्रीम को डुप्लिकेट करने का कारण बनता है, जिसमें अनुपयुक्त सामग्री शामिल है। fork() के बाद '1' युक्त अनलॉक आउटपुट बफर वाले 2 प्रक्रियाएं हैं। वे प्रत्येक बाहर निकलते हैं, अपने बफर फिसलते हैं और आप "11" देखते हैं।

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