मैं जंग में एक छोटा ncurses आवेदन कर रहा हूँ जिसे एक बच्चे की प्रक्रिया के साथ संवाद करने की जरूरत है। मेरे पास पहले से ही आम लिस्प में लिखा प्रोटोटाइप है; gif here उम्मीदपूर्वक दिखाएगा कि मैं क्या करना चाहता हूं। मैं इसे फिर से लिखने की कोशिश कर रहा हूं क्योंकि सीएल ऐसे छोटे उपकरण के लिए बड़ी मात्रा में स्मृति का उपयोग करता है।जंग में अवरुद्ध किए बिना मैं बाल प्रक्रिया के आउटपुट को कैसे पढ़ूं?
मैंने जंग (या अन्य निम्न स्तर की भाषाओं) से पहले जंग का उपयोग नहीं किया है, और मुझे उप-प्रक्रिया के साथ बातचीत करने के तरीके को समझने में कुछ परेशानी हो रही है।
let mut program = match Command::new(command)
.args(arguments)
.stdin(Stdio::piped())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn() {
Ok(child) => child,
Err(_) => {
println!("Cannot run program '{}'.", command);
return;
},
};
एक अनंत (उपयोगकर्ता बाहर निकलता है जब तक) पाश के पास यह है, जो पढ़ता है और इनपुट के प्रबंधन:
प्रक्रिया बनाएं:
क्या मैं वर्तमान में कर रहा हूँ मोटे तौर पर यह है और इस तरह के आउटपुट के लिए सुनता है (और इसे स्क्रीन पर लिखता है):
fn listen_for_output(program: &mut Child, output_viewer: &TextViewer) { match program.stdout { Some(ref mut out) => { let mut buf_string = String::new(); match out.read_to_string(&mut buf_string) { Ok(_) => output_viewer.append_string(buf_string), Err(_) => return, }; }, None => return, }; }
read_to_string
पर कॉल हालांकि प्रक्रिया समाप्त होने तक प्रोग्राम को अवरुद्ध करता है। मैं देख सकता हूं कि read_to_end
और read
भी ब्लॉक करना प्रतीत होता है। अगर मैं ls
जैसे कुछ चलाने की कोशिश करता हूं जो तुरंत बाहर निकलता है, तो यह काम करता है, लेकिन कुछ ऐसा जो python
या sbcl
से बाहर नहीं निकलता है, यह केवल तब ही जारी रहता है जब मैं सबप्रोसेस मैन्युअल रूप से मारता हूं।
संपादित करें:
fn listen_for_output(program: &mut Child,
output_viewer: &TextViewer) {
match program.stdout.as_mut() {
Some(out) => {
let buf_reader = BufReader::new(out);
for line in buf_reader.lines() {
match line {
Ok(l) => {
output_viewer.append_string(l);
},
Err(_) => return,
};
}
},
None => return,
}
}
हालांकि समस्या अभी भी एक ही रहता है:
पर this answer आधार पर, मैं BufReader
उपयोग करने के लिए कोड बदल दिया है। यह उपलब्ध सभी लाइनें पढ़ेगा, और फिर ब्लॉक करें। चूंकि टूल को किसी भी प्रोग्राम के साथ काम करना है, इसलिए पढ़ने का प्रयास करने से पहले उत्पादन समाप्त होने पर अनुमान लगाने का कोई तरीका नहीं है। BufReader
के लिए टाइमआउट सेट करने का कोई तरीका प्रतीत नहीं होता है।
उपयोगी स्पष्टीकरण के लिए धन्यवाद। मैं एमआईओ में देखूंगा, और यदि यह काम नहीं करता है, तो मैं अलग थ्रेड का उपयोग करूंगा। – jkiiski