• 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() //阻止父进程等待一个给出的子进程

    未完待续,如有指点,望不吝赐教!

  • 相关阅读:
    如何操作3D中的摄像机
    软件开发的未来,是MDA/MDD/面向模式/Plugin IDE吗?[转]
    Hibernate3一个不错的入门介绍
    C#中的== Equals 与 Java 的== Euqals
    The Attributes property of a ListItem control only works within an HtmlSelect control
    WebWork 与 Struts
    会计基本流程
    常用 js 函数
    SQL中的sysobjects与syscolumns
    一个Struts2的的辅助工具
  • 原文地址:https://www.cnblogs.com/zhaowinter/p/5661048.html
Copyright © 2020-2023  润新知