2014-06-30 15 views
7

मैं दो लंबे समय तक प्रक्रियाओं को संवाद करने की कोशिश कर रहा हूं - माता-पिता और बच्चे - पाइप और नोड के मॉड्यूल का उपयोग करके। मैं चाहता हूं कि बच्चा माता-पिता को डेटा को असीमित रूप से वापस भेजने में सक्षम हो, और मैं ऐसा करने के लिए का उपयोग करने की उम्मीद कर रहा था।Node.js बाल प्रक्रियाओं और पाइप - ओएसएक्स बनाम उबंटू

यहाँ मेरी कोड का एक सरलीकृत संस्करण है:

जनक:

cp = require('child_process') 
es = require('event-stream') 

child = cp.spawn('coffee', ['child.coffee'], {stdio: [null, null, null, 'pipe']}) 

so = child.stdout.pipe(es.split()) 
p3 = child.stdio[3].pipe(es.split()) 

so.on 'data', (data) -> 
    console.log('stdout: ' + data) 

child.stderr.on 'data', (data) -> 
    console.log('stderr: ' + data); 

p3.on 'data', (data) -> 
    console.log('stdio3: ' + data); 

child.on 'close', (code) -> 
    console.log('child process exited with code ' + code) 

child.stdin.write "a message from your parent", "utf8" 

बाल:

fs = require('fs') 

p3 = fs.createWriteStream('/dev/fd/3', {encoding: 'utf8'}) 

process.stdin.on 'data', (data) -> 
    p3.write "hello #{process.pid} - #{data}\n", 'utf8' 
    process.stdout.write "world #{process.pid} - #{data}\n", 'utf8' 
    p3.end() 
    process.exit(0) 

process.stdin.on 'end', (data) -> 
    console.log "end of stdin" 
    p3.end() 
    process.exit(0) 

process.stdin.setEncoding('utf8') 
process.stdin.resume() 

कोड पर OSX 10.9 काम करता है, लेकिन एक Ubuntu बॉक्स पर चलाने के लिए विफल रहता है। मैंने इसे उबंटू 12.04 और 14.04 दोनों के तहत चलाने की कोशिश की है। मैं नोड 10.2x चला रहा हूँ।

/dev/fd/ उबंटू के तहत प्रतीकात्मक रूप से /proc/self/fd/ से जुड़ा हुआ है, इसलिए मेरा मानना ​​है कि मेरी बाल प्रक्रिया सही फ़ाइल खोल रही है।

Ubuntu पर माता पिता के चलने से उत्पादन इस प्रकार है:

$ coffee parent.coffee 
stderr: 

stderr: events.js:72 

stderr:   throw er; // Unhandled 'error' event 

stderr: 
stderr: 
stderr: 
stderr: 
stderr:   ^

stderr: Error: UNKNOWN, open '/dev/fd/3' 




events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: read ECONNRESET 
    at errnoException (net.js:901:11) 
    at Pipe.onread (net.js:556:19) 

मैं देखना (और एक OSX बॉक्स पर करते हैं) उम्मीद करेंगे:

$ coffee parent.coffee 
stdio3: hello 21101 - a message from your parent 
stdout: world 21101 - a message from your parent 
stdio3: 
stdout: 
child process exited with code 0 

यह के साथ संवाद करने के लिए संभव है बच्चा उबंटू पर भी कमांड लाइन का उपयोग कर रहा है, इसलिए बच्चे की प्रक्रिया को जन्म देने पर माता-पिता में समस्या होने की संभावना है:

$ echo foo | coffee child.coffee 3>&1 
hello 3077 - foo 

world 3077 - foo 

मैंने कर्नेल कॉल की जांच करने का प्रयास किया है जो नोड का उपयोग करता है, लेकिन आउटपुट की अधिक समझ नहीं ले सका।

+0

'ps aux का आउटपुट क्या है। grep node' जब दोनों प्रक्रियाएं चल रही हैं? – ctlacko

+0

@ChrisLacko आदेश 'कॉफी parent.coffee' तुरंत दुर्घटनाग्रस्त हो जाता है। ओएसएक्स पर यह प्रिंट करता है कि इसे क्या माना जाता है और फिर बाहर निकलता है। जब मैं इसे पोस्ट पर चलाता हूं तो मैं उन त्रुटियों को जोड़ सकता हूं जो मैं देखता हूं। – Jacob

उत्तर

4

मैंने इसे स्वयं समझ लिया। त्रुटि बच्चे में थी।

p3 = fs.createWriteStream('/dev/fd/3', {encoding: 'utf8'}) 

एक त्रुटि फेंक दिया गया था: उबंटू लिनक्स अधिक सख्त जब यह, फ़ाइलों कि पहले से ही खुले हैं खोलने लाइन करने के लिए आता है। फ़ाइल वर्णनकर्ता 3 जब बच्चे चलाता है पहले से ही खुला है, इसलिए कोड के रूप में देखना चाहिए इस प्रकार है:

बाल:

fs = require('fs') 

# parent opens the file descriptor 3 when spawning the child (and closes it when the child returns) 
fd3write = (s) -> 
    b = new Buffer(s) 
    fs.writeSync(3,b,0,b.length) 

process.stdin.on 'data', (data) -> 
    fd3write "p3 #{process.pid} - #{data}\n" 
    process.stdout.write "so #{process.pid} - #{data}\n", 'utf8' 
    process.exit(0) 

process.stdin.on 'end', (data) -> 
    console.log "end of stdin" 
    process.exit(0) 

process.stdin.setEncoding('utf8') 
process.stdin.resume() 

मुझे आशा है कि इस मदद की किसी और को किया जाएगा।

माता-पिता से बच्चे को संदेश भेजने के लिए stdin के बजाय एक पाइप का उपयोग करने के लिए यह लिंक उपयोग किया जा सकता है: child-process-multiple-file-descriptors

+0

आप अपने स्वयं के उत्तरों को स्वीकृत के रूप में भी चिह्नित कर सकते हैं। :) – jgillich

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