मैं एक प्रोग्राम लिख रहा हूं जो बाह्य उप प्रक्रिया को अंतःक्रियात्मक रूप से चलाता है और मुझे आउटपुट हैंडल की सामग्री को जल्द से जल्द उपलब्ध होने के लिए आउटपुट होने की आवश्यकता होती है । मैं कुछ इस तरह की कोशिश की है:हास्केल: वास्तविक समय में एक हैंडल की सामग्री को दूसरे में कैसे पाइप करें
main = do processInfo <- createProcess (proc "ghci" []){std_out = CreatePipe,
std_in = CreatePipe }
case processInfo of
(Just hIn, Just hOut, _, _) -> do mainloop hIn hOut
hClose hIn
hClose hOut
_ -> do error "Unable to start process"
mainloop :: Handle -> Handle -> IO()
mainloop inh outh =
do ineof <- hIsEOF outh
if ineof
then return()
else do inpStr <- hGetLine outh
putStrLn inpStr
mainloop inh outh
लेकिन यह काम नहीं करता है, क्योंकि यह केवल लाइन द्वारा उत्पादन लाइन को पहचानता है, ताकि एक नई पंक्ति द्वारा समाप्त नहीं किया गया है प्रक्रियाओं उत्पादन संभाल पर किसी भी उत्पादन नहीं दिखाई देता है । मैंने hGetContents के साथ एक ही चीज़ की कोशिश की है लेकिन यह एक ही परिणाम उत्पन्न करता है। मैंने सिस्टम.प्रोसेस और सिस्टम.आईओ दोनों के दस्तावेज के माध्यम से पढ़ा है और वास्तव में कुछ भी निर्णायक नहीं मिला है।
धन्यवाद, मैं भी stdin/stdout पर बफरिंग प्रकार के परिवर्तन से नहीं सोचा था। – drt
यह ध्यान देने योग्य है कि विंडोज़ पर डिफ़ॉल्ट लिनक्स पर डिफ़ॉल्ट से अलग है, इसलिए लगातार व्यवहार प्राप्त करने के लिए बफरिंग प्रकार को सेट करना उचित है। – porges