diff --git a/lib/child_process.js b/lib/child_process.js index 1a445054e1..b2ad2b619f 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -86,7 +86,7 @@ exports.execFile = function (file, args /*, options, callback */) { function ChildProcess () { - process.EventEmitter.call(this); + EventEmitter.call(this); var self = this; @@ -99,11 +99,14 @@ function ChildProcess () { var stdout = this.stdout = new Stream(); var stderr = this.stderr = new Stream(); - stderr.onend = stdout.onend = function () { + function onClose () { if (gotCHLD && !stdout.readable && !stderr.readable) { self.emit('exit', exitCode, termSignal); } - }; + } + + stderr.addListener('close', onClose); + stdout.addListener('close', onClose); internal.onexit = function (code, signal) { gotCHLD = true; diff --git a/test/simple/test-child-process-exit-code.js b/test/simple/test-child-process-exit-code.js index 3a33dd461b..5b14cfd6bd 100644 --- a/test/simple/test-child-process-exit-code.js +++ b/test/simple/test-child-process-exit-code.js @@ -1,11 +1,30 @@ require("../common"); -var spawn = require('child_process').spawn - , path = require('path') - , sub = path.join(fixturesDir, 'exit.js') - , child = spawn(process.argv[0], [sub, 23]) - ; +spawn = require('child_process').spawn, +path = require('path'); -child.addListener('exit', function(code, signal) { +exits = 0; + +exitScript = path.join(fixturesDir, 'exit.js') +exitChild = spawn(process.argv[0], [exitScript, 23]); +exitChild.addListener('exit', function(code, signal) { assert.strictEqual(code, 23); assert.strictEqual(signal, null); -}); \ No newline at end of file + + exits++; +}); + + + +errorScript = path.join(fixturesDir, 'child_process_should_emit_error.js') +errorChild = spawn(process.argv[0], [errorScript]); +errorChild.addListener('exit', function(code, signal) { + assert.ok(code !== 0); + assert.strictEqual(signal, null); + + exits++; +}); + + +process.addListener('exit', function () { + assert.equal(2, exits); +});