2015-09-12 48 views
1

我正在学习nodejs,并且检查了一些关于向子进程发送信号的例子,就像下面的代码一样,它说“孩子的SIGINT”处理程序应该是响应,而我没有得到任何输出。nodejs发送信号给子进程不起作用

// parent.js 
var spawn = require('child_process').spawn; 
var child = spawn('node', ['child.js']); 

child.stdout.on('data', function(data) { 
    console.log('data from child: ' + data); 
}); 

child.kill('SIGINT'); 


// child.js 
console.log('child calling'); 
process.on('SIGINT', function() { 
    console.log('Received SIGINT signal'); 
}); 

当我打字

节点parent.js

为什么没有输出?甚至在child.js中输出“child call”?

希望有人帮助我吗?谢谢。

另外,我不清楚child.js何时执行,执行语句时?希望任何人都可以提供详细的解释?谢谢。

var child = spawn('node', ['child.js']); 

回答

2

第一个问题是,你生成一个子进程,然后立即发送SIGINT。由于子进程(可能)还没有运行,它没有注册该信号,因此被它杀死。得到这个工作的最简单方法是把它放在一个setTimeout

setTimeout(function() { 
    child.kill('SIGINT'); 
}, 100); 

现在你会看到

data from child: child calling 

,然后它会退出。但是你期待SIGINT消息。这次的问题是子进程日志,注册信号,然后完成。 node.js将结束,如果它结束,并没有等待其他任何事情。它需要等待的东西包括开放的套接字,setTimeout s,等等。然而,你需要它来做某件事。作为一个简单的测试,你可以添加到child.js

setInterval(function() { 
    console.log('hey!'); 
}, 1000); 

或类似的东西。然后你会看到你期待的输出。

+0

谢谢@Aaron Dufour。我尝试了你的建议。有用。虽然我仍然不清楚你的话“它会等待的东西包括打开套接字,setTimeouts等。” 你的意思是在parent.js中的setTimeouts将打开子进程套接字? 你能否给出更详细的解释? 我也试过自己,我尝试在child.js的头部添加“process.stdin.resume()”,并在“SIGINT”处理程序中添加“process.stdin.end()”,它也起作用。你对这个决议的看法如何? 谢谢。 –

+0

其实我不清楚你的意思是“开放套接字”?像“process.stdin.resume()”这样的隐式操作? –

+0

打开套接字就像打开TCP连接或启动服务器(在子节点中)一样。你究竟在做什么?你现在正在做的事情看起来像一个测试,但如果你真正做了一件事情,它很可能会导致node.js继续运行。 –