什么需要(“child_process”)实际上做什么?

时间:2014-12-29 13:43:40

标签: node.js child-process

当我们致电:

var p = require(child_process);

我们是否已经在创建子流程了? (如果没有,这里的p是什么?)

为了解释我的困惑,在我拿起的代码库中,我看到了:

var childProcess1 = require("child_process");
var  _retrieveChild = childProcess1.fork(
           __dirname + '/backgroundProcesses/DadProcess',
           { execArgv: ['--debug=5859'] }
        );

我问自己,是否正在创建一个来自子进程的另一个进程,或者childProcess1只是一个非常明确的名称?

3 个答案:

答案 0 :(得分:14)

要求模块可以有时初始化模块,所以不要因为不知道而感到难过。他们都是不同的。但是,child_process只需要像您一样要求使用模块,就可以创建流程。您必须调用fork()spawn()(或exec())来实际创建新进程(和PID)。

如果查看文档,您可以看到他们有时会使用这种语法:

var spawn = require('child_process').spawn;
// ...
spawn('ps', ['ax']);

基本上抓取了模块API,然后是spawn方法,并将其别名为局部变量,以便稍后在代码中使用。

修改

为了便于您理解,只需在Node模块内部,模块决定要“导出”的内容。无论它输出什么,都将从require(...)电话中返回。例如,如果我们有这个模块:

// foo.js
module.exports = function() {
    return "bar";
};

然后require("foo")会给我们一个函数(但它还没有被调用):

var mymodule = require("foo");
var result = mymodule(); // <-- this calls the function returned via module.exports
console.log(result); // "bar"

答案 1 :(得分:3)

child_process module充当spawnexecexecFilefork函数的命名空间。您调用require("child_process")来引用该模块,然后调用其中一个成员函数来创建一个新进程。

每个函数的返回值为ChildProcess object,表示生成的进程,并包含stdinstdoutpid等成员。

答案 2 :(得分:0)

如果您对它的作用有疑问,请检查它返回的内容。

var childProcess = require('child_process')
console.log(childProcess); 

你可能会这样(取决于Node.js版本):

{ ChildProcess: 
   { [Function: ChildProcess]
     super_: 
      { [Function: EventEmitter]
        EventEmitter: [Circular],
        usingDomains: false,
        defaultMaxListeners: 10,
        init: [Function],
        listenerCount: [Function] } },
  fork: [Function],
  _forkChild: [Function],
  exec: [Function],
  execFile: [Function],
  spawn: [Function],
  spawnSync: [Function: spawnSync],
  execFileSync: [Function: execFileSync],
  execSync: [Function: execSync] }

ChildProcess的最新节点版本docs