为啥我的 fork 子进程在我 fork 后立即退出?

Posted

技术标签:

【中文标题】为啥我的 fork 子进程在我 fork 后立即退出?【英文标题】:Why does my forked child process exit immediately after I fork it?为什么我的 fork 子进程在我 fork 后立即退出? 【发布时间】:2017-04-20 02:51:37 【问题描述】:

我只是想派生一个简单的子进程并让 IPC 通道保持打开状态,但由于某种原因它会立即退出。

在 parent.js 中:

var child = require('child_process').fork('./child.js');
child.on('hi', function() 
    console.log("Hi");
);

child.on('exit', function() 
    console.log("Exited");
);

child.send('hello');

在 child.js 中:

process.on('hello', function() 
    process.send('hi');
);

我立即将“退出”打印到控制台,但从未收到“嗨”。然后,如果我继续尝试发送到子进程,则会收到通道关闭错误。

我做错了什么?

【问题讨论】:

我认为这是因为您的子进程正在完成。子进程中的某些东西需要保持进程运行。 我尝试向它添加垃圾setInterval() 以使其保持活力,但仍然没有骰子 试试process.stdin.resume(); 在 child.js 中?我刚试了,还是不行:( 您是否将setInterval() 放入处理程序中?如果我把它放在child.js 的处理程序之外,我可以让进程保持活动状态,但消息发送仍然无法正常工作。 【参考方案1】:

您需要保持两个进程都打开,因为子进程会立即关闭,父进程也会立即关闭。你可以这样做:

父.js

var child = require('child_process').fork('./child.js');

child.on('message', function () 
  console.log("Hi");
);

child.on('exit', function () 
  console.log("Exited");
);

setTimeout(() => 
  child.send('hello');
, 1000);


process.stdin.resume();

child.js

process.on('message', function () 
  console.log("sending hi");
  process.send('hi');
);

【讨论】:

另外,我不确定任意事件名称是否有效。好像一定是“消息” ohhhhh 我搞定了 :) 原来是事件名称 - 以为它可以是任何东西,但就像你说的那样它必须是“消息”

以上是关于为啥我的 fork 子进程在我 fork 后立即退出?的主要内容,如果未能解决你的问题,请参考以下文章

fork 与 vfork

为啥 Rust RwLock 在 fork 中表现异常?

fork和vfork

为啥在调用 c++ fork 函数之前创建的值没有被父进程和子进程修改两次?

Linux学习之“fork函数”

12.9 线程与fork