mirror of https://github.com/lukechilds/node.git
Browse Source
This commit allows child_process.fork() to pass stdio options to spawn(). This allows fork() to more easily take advantage of additional stdio channels. Refs: https://github.com/nodejs/node-v0.x-archive/issues/5727 PR-URL: https://github.com/nodejs/node/pull/7811 Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Minwoo Jung <jmwsoft@gmail.com> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>v7.x
3 changed files with 64 additions and 4 deletions
@ -0,0 +1,54 @@ |
|||||
|
'use strict'; |
||||
|
const common = require('../common'); |
||||
|
const assert = require('assert'); |
||||
|
const cp = require('child_process'); |
||||
|
const net = require('net'); |
||||
|
|
||||
|
if (process.argv[2] === 'child') { |
||||
|
process.stdout.write('this should be ignored'); |
||||
|
process.stderr.write('this should not be ignored'); |
||||
|
|
||||
|
const pipe = new net.Socket({ fd: 4 }); |
||||
|
|
||||
|
process.on('disconnect', () => { |
||||
|
pipe.unref(); |
||||
|
}); |
||||
|
|
||||
|
pipe.setEncoding('utf8'); |
||||
|
pipe.on('data', (data) => { |
||||
|
process.send(data); |
||||
|
}); |
||||
|
} else { |
||||
|
assert.throws(() => { |
||||
|
cp.fork(__filename, {stdio: ['pipe', 'pipe', 'pipe', 'pipe']}); |
||||
|
}, /Forked processes must have an IPC channel/); |
||||
|
|
||||
|
let ipc = ''; |
||||
|
let stderr = ''; |
||||
|
const buf = Buffer.from('data to send via pipe'); |
||||
|
const child = cp.fork(__filename, ['child'], { |
||||
|
stdio: [0, 'ignore', 'pipe', 'ipc', 'pipe'] |
||||
|
}); |
||||
|
|
||||
|
assert.strictEqual(child.stdout, null); |
||||
|
|
||||
|
child.on('message', (msg) => { |
||||
|
ipc += msg; |
||||
|
|
||||
|
if (ipc === buf.toString()) { |
||||
|
child.disconnect(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
child.stderr.on('data', (chunk) => { |
||||
|
stderr += chunk; |
||||
|
}); |
||||
|
|
||||
|
child.on('exit', common.mustCall((code, signal) => { |
||||
|
assert.strictEqual(code, 0); |
||||
|
assert.strictEqual(signal, null); |
||||
|
assert.strictEqual(stderr, 'this should not be ignored'); |
||||
|
})); |
||||
|
|
||||
|
child.stdio[4].write(buf); |
||||
|
} |
Loading…
Reference in new issue