面试题答案
一键面试实现代码
const { execFile } = require('child_process');
// 定义要执行的脚本路径
const scriptPath = './hello.js';
execFile('node', [scriptPath], (error, stdout, stderr) => {
if (error) {
console.error(`执行脚本出错: ${error}`);
return;
}
console.log(`标准输出: ${stdout}`);
console.error(`标准错误: ${stderr}`);
});
假设 hello.js
内容如下:
console.log('Hello, World!');
child_process模块中常用启动子进程的方法及其区别
-
child_process.exec()
- 特点:该方法会创建一个 shell 并在其中执行命令,适合执行 shell 命令,命令执行结果通过回调函数的
stdout
和stderr
参数返回,数据以字符串形式接收。 - 示例:
exec('ls -l', (error, stdout, stderr) => { /* 处理回调 */ });
- 适用场景:适用于执行简单的 shell 命令并获取其输出,例如查看文件列表、执行系统命令等。
- 特点:该方法会创建一个 shell 并在其中执行命令,适合执行 shell 命令,命令执行结果通过回调函数的
-
child_process.execFile()
- 特点:直接执行可执行文件,不通过 shell,相比
exec
更高效,因为避免了 shell 启动的开销。执行结果同样通过回调函数返回,数据也是以字符串形式接收。 - 示例:
execFile('node', ['script.js'], (error, stdout, stderr) => { /* 处理回调 */ });
- 适用场景:当明确要执行一个可执行文件(如 Node.js 脚本、Python 脚本等),且不需要 shell 特性(如管道、通配符等)时使用。
- 特点:直接执行可执行文件,不通过 shell,相比
-
child_process.fork()
- 特点:专门用于创建新的 Node.js 子进程,子进程与父进程之间可以通过 IPC(进程间通信)进行高效的数据传递。子进程会加载一个 Node.js 模块,并与父进程共享一些内置模块。
- 示例:
const child = fork('child.js'); child.send('Hello from parent');
在child.js
中可通过process.on('message', (msg) => { /* 处理消息 */ });
接收消息。 - 适用场景:适用于在 Node.js 应用中创建多个并行执行的 Node.js 子进程来处理计算密集型任务,利用多核 CPU 资源,同时需要进程间通信的场景。
-
child_process.spawn()
- 特点:启动一个新进程,提供了更细粒度的控制,返回一个
ChildProcess
对象,可以直接操作子进程的stdin
、stdout
和stderr
流,数据以 buffer 形式接收,可通过监听data
事件来处理。 - 示例:
const child = spawn('node', ['script.js']); child.stdout.on('data', (data) => { console.log(
子进程输出: ${data.toString()}); });
- 适用场景:适用于需要对进程的输入输出流进行实时控制和处理,例如持续读取子进程的输出并实时处理,或者向子进程持续写入数据等场景。
- 特点:启动一个新进程,提供了更细粒度的控制,返回一个