2015-08-13 13 views
5

मेरा मानना ​​है कि मैं समझता हूँ, सामान्य रूप में, ऐसा करने का एक ही रास्ता है:आप प्रक्रिया से आउटपुट कैसे स्ट्रीम करेंगे?

  • उत्पादन की एक नई जोड़ी धाराओं
  • कॉन्फ़िगर command.stdout() बनाने के लिए एक Command
  • उपयोग Stdio::piped() बनाएँ, और command.stderr()
  • स्पोन प्रक्रिया
  • एक नया धागा बनाएं और इसे stderr और stdout पास करें < - ???
  • रिमोट थ्रेड में, लगातार इनपुट के लिए मतदान करें और इसे आउटपुट स्ट्रीम में लिखें।
  • मुख्य धागे में, प्रक्रिया समाप्त होने की प्रतीक्षा करें।

क्या यह सही लगता है?

मेरे दो वास्तविक सवाल:

  1. वहाँ एक आसान तरीका है कि एक 'पढ़ने के धागे' प्रक्रिया के अनुसार को शामिल नहीं करता है?

  2. यदि कोई आसान तरीका नहीं है, Read::read()&mut self की आवश्यकता है; आप इसे रिमोट थ्रेड में कैसे पास करते हैं?

विशिष्ट उदाहरण है कि कैसे वास्तव में उत्पादन, नहीं यह कैसे करना है के बारे में सिर्फ सामान्य सलाह स्ट्रीम करने के लिए की प्रदान करें ...

अधिक विशिष्ट होना करने के लिए, यहाँ the default example of using spawn है:

use std::process::Command; 

let mut child = Command::new("/bin/cat") 
         .arg("file.txt") 
         .spawn() 
         .expect("failed to execute child"); 

let ecode = child.wait() 
       .expect("failed to wait on child"); 

assert!(ecode.success()); 

उपरोक्त उदाहरण को निकास कोड की प्रतीक्षा करने के बजाय, बच्चे के कंसोल में आउटपुट स्ट्रीम करने के लिए कैसे बदला जा सकता है?

+2

अतः एक ट्यूटोरियल जनरेटर नहीं है। क्या आपके पास ** विशिष्ट समस्या ** है? –

+1

सामान्य रूप से एसओ पर, वार्तालाप के लिए शुरुआती बिंदु देने के लिए, ओपी (आप) के लिए यह बेहतर है कि इस मुद्दे को प्रदर्शित करने वाले कोड कोड के रूप में न्यूनतम प्रदान किया जाए, और फिर पूछें कि समस्या को हल करने के तरीके के बारे में पूछें। उदाहरण के लिए, आप शायद कोड कोड में अपना "ऐसा करने का एक तरीका" स्विच कर सकते हैं। –

+0

मैं किसी भी तरह से, लंबे समय तक चलने वाली प्रक्रिया और कंसोल पर आउटपुट स्ट्रीमिंग के किसी भी उदाहरण को खुशी से स्वीकार करूंगा। – Doug

उत्तर

5

मैं किसी भी तरह से लंबे समय तक चलने वाली प्रक्रिया और कंसोल पर आउटपुट स्ट्रीमिंग के किसी भी उदाहरण को खुशी से स्वीकार करूंगा।

ऐसा लगता है कि आप Stdio::inherit हैं:

use std::process::{Command, Stdio}; 

fn main() { 
    let mut cmd = 
     Command::new("cat") 
     .args(&["/usr/share/dict/web2"]) 
     .stdout(Stdio::inherit()) 
     .stderr(Stdio::inherit()) 
     .spawn() 
     .unwrap(); 

    // It's streaming here 

    let status = cmd.wait(); 
    println!("Exited with status {:?}", status); 
} 
+0

क्या यह वास्तव में डिफ़ॉल्ट व्यवहार से अलग है? – msgmaxim

+0

@msgmaxim आप देख सकते हैं कि [कमांड :: नया'] के लिए प्रलेखन (https://doc.rust-lang.org/std/process/struct.Command.html#method.new) यह देखने के लिए कि डिफ़ॉल्ट क्या हैं : * 'Spawn' या' status' के लिए stdin/stdout/stderr को एथिरिट करें, लेकिन 'output' * के लिए पाइप बनाएं। टीएल; डीआर: नहीं, मुझे ऐसा नहीं लगता है। कभी-कभी ओपी को वापस पढ़ने के लिए अत्यधिक स्पष्ट या दस्तावेज होने पर यह सब कुछ होता है। एमसीवी के लिए पूछे जाने वाले मूल प्रश्न पर टिप्पणियों पर ध्यान दें, समस्या को और समझाने के लिए ओपी प्राप्त करने की कोशिश कर रहा है। ¯ \\ _ (ツ) _/¯ – Shepmaster

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