ChildProcess对象中包含以下可访问属性
和以下可调用方法
该属性为子进程的IPC通道的引用, 如果没有IPC通道, 该属性值为undefined
const { fork, exec } = require('child_process');
const child_exec = exec('ls -al /');
console.log(child_exec.channel);// undefined
// ============================================
const child_fork = fork('./sub_module.js');
console.log(child_fork.channel);
/**
Control {
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
[Symbol(kCapture)]: false,
[Symbol(kPendingMessages)]: []
}
*/
该属性标识子进程是否仍然可以和主线程进行通信, 如果值为false, 则子进程无法接收主线程发送的消息, 也无法向主线程发送消息
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
console.log(child_fork.connected); // true
child_fork.disconnect();
console.log(child_fork.connected); // false
该属性标识子进程的退出状态码, 如果子进程尚未退出, 该属性值为null
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
child_exec.on('close', (code, signal) => {
console.log(child_exec.exitCode); // 0
});
该属性标致子进程是否被中断, true为中断, false为未中断
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.killed); // false
该属性为子进程的PID, 如果子进程派生失败或发生异常, 该属性值为undefined, 同时会触发 error 事件
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.pid);
该属性为子进程的退出状态码, 如果子进程尚未退出, 该属性值为null
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
child_exec.kill('SIGTERM');
child_exec.on('close', (code, signal) => {
console.log(child_exec.signalCode); // 'SIGTERM'
});
该属性为子进程执行命令的完整参数列表
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.spawnargs); // [ 'C:\Windows\system32\cmd.exe', '/d', '/s', '/c', '"dir C:\"' ]
该属性为子进程执行的可执行文件名称
- fork() 创建的子进程, 该属性值为: process.execPath
- spawn() 创建的子进程, 该属性值为: 可执行文件的名称
- exec() 创建的子进程, 该属性值为: 子进程启动的Shell的名称
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.spawnfile); // 'C:\Windows\system32\cmd.exe'
该属性为包含子进程运行时stderr信息的可读的流对象
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.stderr); // Socket {...}
该属性为包含子进程运行时stdin信息的可读的流对象
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.stdin); // Socket {...}
该属性为包含了stdin, stdout, stderr信息的数组, 默认情况下:
- stdio[0], 为 stdin
- stdio[1], 为 stdout
- stdio[2], 为 stderr
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.stdio); // [Socket {...},Socket {...},Socket {...}]
该属性为包含子进程运行时stdout信息的可读的流对象
const { exec } = require('child_process');
const child_exec = exec('dir C:\\');
console.log(child_exec.stdout); // Socket {...}
如果之前调用过 unref() 方法, 则此方法使IPC通道保持父进程的事件循环运行
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
child_fork.channel.ref();
此方法使IPC通道不保持父进程的事件循环运行,并允许它在通道打开时完成
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
child_fork.channel.unref();
- signal: Node.Signal|String, 子进程退出信号
此方法用于向子进程发送中断信号, 如果有指定可选参数signal, 则子线程会在 close 事件的回调函数中得到该信号, 如果未指定signal参数, 则会在 close 事件回调函数中返回, 子进程创建时指定的可选参数option中指定的信号或其默认值: SIGTERM
子进程中断成功时返回true, 中断失败时返回false
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
console.log(child_fork.kill('SIGTERM')); // true
此方法用于关闭主进程和子进程之间的IPC通道, 允许子进程在没有其他连接保持活动状态时优雅地退出, 调用后主进程和子进程的 connected 属性值均会被设置为false
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
console.log(child_fork.connected); // true
child_fork.disconnect();
console.log(child_fork.connected); // false
在调用 unref() 函数后调用此方法, 可以为子进程恢复被删除的在主进程事件循环中的引用计数, 以强制主进程在子进程退出后才可以退出
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
child_fork.ref();
此方法用于在主进程和子进程的IPC通道间进行进程间通信, 如果主进程和子进程间没有IPC通道(channel 属性值为 undefined)时, 无法调用
- message: Object|String, 进程间通信消息
- sendHandle: Socket, 可选参数, net.Socket 对象或 net.Server 对象或undefined
- options: Object, 可选参数, 可选属性如下:
- keepOpen: Boolean, handle 为 net.Socket 时生效, 值为true时, socket连接会保持open, 默认值: false
- callback: Function, 可选参数, 发送消息后的回调函数
消息发送成功时返回true, 失败时返回false
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
console.log(child_fork.send({ str: 'hello world' })); // true
默认情况下, 主进程总是等待子进程退出后才可以退出, 此防范可以从主进程的事件循环中移除子进程的引用计数, 以允许主进程可以独立于子进程之外单独进行退出, 除非主进程和子进程之前存在IPC通道
const { fork } = require('child_process');
const child_fork = fork('dir', ['C:\\']);
child_fork.unref();