三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 272|回复: 0
打印 上一主题 下一主题

类: ChildProcess

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-8-8 08:24:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ChildProcess 是一个 EventEmitter
子进程有三个相关的流 child.stdin,child.stdout, 和 child.stderr。他们可能和会父进程的 stdiostreams 共享, 也可作为独立的对象。
不能直接调用 ChildProcess 类,使用spawn(), exec(), execFile(), 或 fork() 方法来创建子进程的实例。
事件: 'error'
  • err {Error Object} 错误。
发生于:
  • 无法创建进程。
  • 无法杀死进程。
  • 无论什么原因导致给子进程发送消息失败。
注意,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
  • {Stream object}
子进程的 stdin 是 Writable Stream(可写流)。如果子进程在等待输入,它就会暂停直到通过调用 end() 来关闭。
child.stdin 是 child.stdio[0] 的缩写。这两个都指向同一个对象,或者 null。
child.stdout
  • {Stream object}
子进程的 stdout 是 Readable Stream(可读流)。
child.stdout 是 child.stdio[1] 的缩写。 这两个都指向同一个对象,或者 null。
child.stderr
  • {Stream object}
子进程的 stderr 是 Readable Stream(可写流)。
child.stderr 是 child.stdio[2] 缩写。 这两个都指向同一个对象,或者 null。
child.stdio
  • {Array}
子进程的管道数组和 spawnstdio 里设置为 'pipe' 的内容次序相对应。
注意,流[0-2]也能分别用 ChildProcess.stdin,ChildProcess.stdout, 和 ChildProcess.stderrNote 来表示。
在下面的例子里,只有子进程的 fd 1 设置为 pipe管道,所以父进程的 child.stdio[1] 是流(stream), 数组里其他值为null。


  1. child = child_process.spawn("ls", {
  2.     stdio: [
  3.       0, // use parents stdin for child
  4.       'pipe', // pipe child's stdout to parent
  5.       fs.openSync("err.out", "w") // direct child's stderr to a file
  6.     ]
  7. });

  8. assert.equal(child.stdio[0], null);
  9. assert.equal(child.stdio[0], child.stdin);

  10. assert(child.stdout);
  11. assert.equal(child.stdio[1], child.stdout);

  12. assert.equal(child.stdio[2], null);
  13. assert.equal(child.stdio[2], child.stderr);
复制代码
child.pid
  • {Integer}
子进程的 PID。
例子:
  1. var spawn = require('child_process').spawn,
  2.     grep  = spawn('grep', ['ssh']);

  3. console.log('Spawned child pid: ' + grep.pid);
  4. grep.stdin.end();
复制代码
child.connected
  • {Boolean} 调用 `.disconnect' 后设置为 false
如果 .connected 为 false, 消息不再可用。
child.kill([signal])
  • signal {String}
发送信号给子进程。如果没有参数,会发送 'SIGTERM',参见 signal(7) 里的可用的信号列表。
  1. var spawn = require('child_process').spawn,
  2.     grep  = spawn('grep', ['ssh']);

  3. grep.on('close', function (code, signal) {
  4.   console.log('child process terminated due to receipt of signal '+signal);
  5. });

  6. // send SIGHUP to process
  7. grep.kill('SIGHUP');
复制代码
当信号无法传递的时候会触发 'error' 事件。给已经终止的进程发送信号不会触发 'error' 事件,但是可以能引起不可预知的后果: 因为有可能 PID (进程 ID) 已经重新分配给其他进程, 信号就会被发送到新的进程里,无法想象这样会引发什么样的事情。
注意,当函数调用 kill 信号的时候,它实际并并不会杀死进程,只是发送信号给进程。
参见 kill(2)


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-6-27 00:08 , Processed in 0.032715 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表