मैं उलझन में हूं कि कैसे popen() यूनिक्स में बाल प्रक्रिया के stdin, stdout और stderr को पुनर्निर्देशित करता है। पॉपन() पर मैन पेज इस संबंध में बहुत स्पष्ट नहीं है। कॉलpopen stdin, stdout, stderr redirection को नियंत्रित करने के लिए कैसे?
FILE *p = popen("/usr/bin/foo", "w");
कांटे एक बच्चे की प्रक्रिया और तर्क के साथ एक खोल "-c" "/ usr/bin/foo", और इस खोल के stdin (जो foo की stdin रीडायरेक्ट किया जाता है) पुनर्निर्देश कार्यान्वित करता है, करने के लिए stdout पी। लेकिन stderr के साथ क्या होता है? इसके पीछे सामान्य सिद्धांत क्या है?
मैंने देखा कि, अगर मैं foo (fopen, सॉकेट, स्वीकृति इत्यादि का उपयोग करके) में एक फ़ाइल खोलता हूं, और मूल प्रक्रिया में कोई स्टडआउट नहीं होता है, तो यह अगले उपलब्ध फ़ाइल नंबर को सौंपा जाता है, जो 1 और इसी तरह से होता है। यह fprintf (stderr, ...) जैसे कॉल से अप्रत्याशित परिणाम प्रदान करता है।
यह
FILE *p = popen("/usr/bin/foo 2>/dev/null", "w");
माता पिता कार्यक्रम में
लेखन से बचा जा सकता है, लेकिन उनके लिए बेहतर तरीके हैं?
: कभी ऐसा मत करो । यूनिक्स पर सी प्रोग्राम 0,1,2 समझदार फ़ाइल वर्णनकर्ता हैं, और कुछ भी किसी बिंदु पर सी को आमंत्रित करता है। सामान्य नियम: * हमेशा * stdio के रूप में उपयोग के लिए आरक्षित 0,1,2। यदि आप उनमें से किसी एक को बंद करना चाहते हैं, तो इसे '/ dev/null' पर रीडायरेक्ट करें ताकि एफडी अभी भी लिया जा सके और कुछ भी इसे सौंपा गया न हो। –