子进程有三个相关的流 child.stdin,child.stdout, 和 child.stderr。他们可能和会父进程的 stdiostreams 共享, 也可作为独立的对象。 不能直接调用 ChildProcess 类,使用spawn(), exec(), execFile(), 或 fork() 方法来创建子进程的实例。 事件: 'error'发生于: - 无法创建进程。
- 无法杀死进程。
- 无论什么原因导致给子进程发送消息失败。
注意,exit 事件有可能在错误发生后调用,也可能不调用,所以如果你监听这两个事件来触发函数,记得预防函数会被调用2次。 事件: 'exit'- code {Number} 退出代码, 正常退出时才有效。
- signal {String} 如果是被父进程杀死,则它为传递给子进程的信号
子进程结束的时候触发这个事件。如果子进程正常终止,则 code 为最终的退出代码,否则为 null 。如果是由 signal 引起的终止,则 signal 为字符串,否则为 null。 注意,子进程的 stdio 流可能仍为开启模式。 注意,node 为 'SIGINT' 和 'SIGTERM' 建立句柄,所以当信号来临的时候,他们不会终止而是退出。 参见 waitpid(2)。 事件: 'close'- code {Number} 退出代码, 正常退出时才有效。
- signal {String} 如果是被父进程杀死,则它为传递给子进程的信号。
子进程里所有 stdio 流都关闭时触发这个事件。要和 'exit' 区分开, 因为多进程可以共享一个 stdio 流。 Event: 'disconnect'父进程或子进程中调用.disconnect() 方法后触发这个事件。 断开后不会在互发消息,并且 .connected 属性值为 false。 Event: 'message'- message {Object} 一个解析过的 JSON 对象,或者一个原始值
- sendHandle {Handle object} 一个 Socket 或 Server 对象
通过 .send(message, [sendHandle]) 传递消息。 child.stdin子进程的 stdin 是 Writable Stream(可写流)。如果子进程在等待输入,它就会暂停直到通过调用 end() 来关闭。 child.stdin 是 child.stdio[0] 的缩写。这两个都指向同一个对象,或者 null。 child.stdout子进程的 stdout 是 Readable Stream(可读流)。 child.stdout 是 child.stdio[1] 的缩写。 这两个都指向同一个对象,或者 null。 child.stderr子进程的 stderr 是 Readable Stream(可写流)。 child.stderr 是 child.stdio[2] 缩写。 这两个都指向同一个对象,或者 null。 child.stdio注意,流[0-2]也能分别用 ChildProcess.stdin,ChildProcess.stdout, 和 ChildProcess.stderrNote 来表示。 在下面的例子里,只有子进程的 fd 1 设置为 pipe管道,所以父进程的 child.stdio[1] 是流(stream), 数组里其他值为null。
- child = child_process.spawn("ls", {
- stdio: [
- 0, // use parents stdin for child
- 'pipe', // pipe child's stdout to parent
- fs.openSync("err.out", "w") // direct child's stderr to a file
- ]
- });
- assert.equal(child.stdio[0], null);
- assert.equal(child.stdio[0], child.stdin);
- assert(child.stdout);
- assert.equal(child.stdio[1], child.stdout);
- assert.equal(child.stdio[2], null);
- assert.equal(child.stdio[2], child.stderr);
复制代码 child.pid子进程的 PID。 例子: - var spawn = require('child_process').spawn,
- grep = spawn('grep', ['ssh']);
- console.log('Spawned child pid: ' + grep.pid);
- grep.stdin.end();
复制代码 child.connected- {Boolean} 调用 `.disconnect' 后设置为 false
如果 .connected 为 false, 消息不再可用。 child.kill([signal])发送信号给子进程。如果没有参数,会发送 'SIGTERM',参见 signal(7) 里的可用的信号列表。 - var spawn = require('child_process').spawn,
- grep = spawn('grep', ['ssh']);
- grep.on('close', function (code, signal) {
- console.log('child process terminated due to receipt of signal '+signal);
- });
- // send SIGHUP to process
- grep.kill('SIGHUP');
复制代码当信号无法传递的时候会触发 'error' 事件。给已经终止的进程发送信号不会触发 'error' 事件,但是可以能引起不可预知的后果: 因为有可能 PID (进程 ID) 已经重新分配给其他进程, 信号就会被发送到新的进程里,无法想象这样会引发什么样的事情。 注意,当函数调用 kill 信号的时候,它实际并并不会杀死进程,只是发送信号给进程。 参见 kill(2)
|