child_process 子進程


創建子進程,使其可以在進程中執行操作,應用系統命令等。nodejs創建子進程有四種方法,分別是spawn,fork,exec,execFile。

區別 :

  1. 格式 : spawn和execFile的格式都是(command,[args]);fork的參數直接(文件名);exec的command相當於spawn的command+args;
  2. 回調 : spawn和fork沒有直接的回調。spawn通過事件監聽處理; fork相當於直接執行一個node程序;其余兩個有回調,回調的參數為error,stdout,stderr;
  3. 作用 : [這里我也不是很明白,引用網上的],fork用於啟動一個node進程,可以進程進程之間通信;execFile用於執行一個外部應用;spawn方法會在新的進程執行外部應用;exec這個方法將會生成一個子shell,能夠在shell中執行命令。

spawn child_process.spawn(command, [args], [options])

  * command 命令指的是windows或者linux系統命令,如果報錯spawn xx ENOENT則指在windows系統運行linux命令,或者相反。
  * 這里的args是選填,有些命令需要加參數,比如cat a.txt,則格式為spawn('cat',['a.txt']);有些命令不需要參數,比如ls,則直接spawn('ls'),一些輔助命令如'-a','-m'等也放到數組中;

//windows系統下的命令;
var spawn = require('child_process').spawn,
    free  = spawn('cat', ['a.txt'],{cwd:'./a'});

// 捕獲標准輸出並將其打印到控制台
free.stdout.on('data', function (data) {
    console.log('標准輸出:' + data);
});

// 捕獲標准錯誤輸出並將其打印到控制台
free.stderr.on('data', function (data) {
    console.log('標准錯誤輸出:' + data);
});

// 注冊子進程關閉事件
free.on('exit', function (code, signal) {
    console.log('子進程已退出,代碼:' + code);
});
----------
//同步的spawn;
var spawn = require('child_process').spawnSync('cat',['a.txt']);
console.log(spawn.stdout.toString());


### fork `child_process.fork(modulePath, [args], [options])` 簡易版的spawn,用於執行node.js文件; ```javscript var fork = require('child_process').fork('a.js'); ---------- var spa = require('child_process').spawn('node',['a.js']); spa.stdout.on('data',function(data){ console.log(data.toString('utf8')); }) ```
### exec `child_process.exec(command, [options], callback)` exec的command相當於spawn的command+args;
var exec = require('child_process').exec;
exec('cat a.txt',function(error,stdout ,stderr ){
     console.log(stdout);
});
----------
//同步的exec方法;
var execSync = require('child_process').execSync;
var s = execSync('cat a.txt');
console.log(s.toString());


### execFile `child_process.execFile(file, args, options, callback)` ```javascript var execFile = require('child_process').execFile; execFile('cat',['a.txt'],function(error,stdout ,stderr ){ console.log(stdout); }); ```

主進程與子進程的通信

//例子來源於網絡

//parent.js
const  cp = require( 'child_process');
const  n = cp.fork( `./sub.js`);
n.on( 'message', ( m) => {
    console.log( 'PARENT got message:',  m);
});
n.send({ hello:  'world' });

//sub.js
process.on( 'message', ( m) => {
    console.log( 'CHILD got message:',  m);
});
process.send({ foo:  'bar' });


1. 事件監聽 error,exit,close,disconnect,message 2. child.stdin,child.stderr,child.stdout,child.pid//屬性值子進程的PID,child.kill,child.send,child.unref() //阻止父進程等待一個給出的子進程

未完待續,如有指點,望不吝賜教!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM