मैं एक प्रोग्राम लिख रहा हूं जो कई बाल प्रक्रियाओं को फोर्क करता है और मैं इन सभी बच्चों की प्रक्रियाओं को STDERR
और STDOUT
पर लाइनों को लिखने में सक्षम होना चाहता हूं आउटपुट गड़बड़ हो रहा है। मैं कुछ भी फैंसी नहीं कर रहा हूं, बस एक नई लाइन के साथ समाप्त होने वाली लाइनों को उत्सर्जित करना (कि, कम से कम मेरी समझ में लिनक्स के लिए एक परमाणु ऑपरेशन होगा)। Perlfaq से यह कहता है:फोर्क() और एसटीडीओयूटी/एसटीडीईआरआर बाल प्रक्रियाओं से कंसोल पर
मुख्य प्रक्रिया और पृष्ठभूमि वाली एक ("बच्चा" प्रक्रिया दोनों एक ही एसटीडीआईएन, एसटीडीओयूटी और एसटीडीईआरआर फाइलहैंड साझा करते हैं। यदि दोनों एक बार में उन्हें एक्सेस करने का प्रयास करते हैं, तो अजीब चीजें हो सकती हैं। आप बच्चे के लिए इन्हें बंद या फिर से खोलना चाह सकते हैं। आप पाइप खोलने के साथ इसे प्राप्त कर सकते हैं (खुले देखें) लेकिन कुछ प्रणालियों पर इसका मतलब है कि बाल प्रक्रिया माता-पिता से बाहर नहीं जा सकती है।
यह कहता है कि मुझे बच्चे के लिए इन फाइलों को "बंद या फिर से खोलना" चाहिए। समापन सरल है, लेकिन इसका मतलब क्या है "फिर से खोलना"? मैं अपने बच्चे की प्रक्रिया के भीतर से कुछ इस तरह की कोशिश की है और यह काम नहीं करता (उत्पादन अभी भी ठीक से प्रदर्शित हो जाता है):
open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!";
close(STDERR);
# re-open STDERR
open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!";
तो, क्या मैं इस के साथ कुछ गलत कर रहा हूँ? पाइप उदाहरण क्या दिखता है? क्या एकाधिक प्रक्रियाओं से आउटपुट को कंसोल में समन्वयित करने का एक बेहतर तरीका है?
मैं पाइप और आईओ चयन के लिए आईओ :: पाइप और AnyEvent के साथ जा रहा था, लेकिन ऐसा लगता है कि यह काम करता है। धन्यवाद – mpeters