Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs向子进程发送信号不工作_Javascript_Node.js - Fatal编程技术网

Javascript nodejs向子进程发送信号不工作

Javascript nodejs向子进程发送信号不工作,javascript,node.js,Javascript,Node.js,我正在学习nodejs,并检查了一些关于向子进程发送信号的示例,正如下面的代码一样,据说子进程中的“SIGINT”处理程序应该是response,而我没有得到任何输出 // parent.js var spawn = require('child_process').spawn; var child = spawn('node', ['child.js']); child.stdout.on('data', function(data) { console.log('data from c

我正在学习nodejs,并检查了一些关于向子进程发送信号的示例,正如下面的代码一样,据说子进程中的“SIGINT”处理程序应该是response,而我没有得到任何输出

// 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 calling”输出

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

另外,我不清楚child.js是什么时候执行的,在语句执行的时候?希望有人能详细解释一下?谢谢

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

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

setTimeout(function() {
  child.kill('SIGINT');
}, 100);
现在你会看到

data from child: child calling
然后它就会退出。但你在等信号。这次的问题是子进程记录、注册信号,然后完成
node.js
将在它完成并且不等待任何其他操作时结束。它将等待的事情包括打开套接字、
setTimeout
s等等。不过,您需要它来做一些事情。作为一个简单的测试,您只需添加到
child.js

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

或者类似的。然后您将看到预期的输出。

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

setTimeout(function() {
  child.kill('SIGINT');
}, 100);
现在你会看到

data from child: child calling
然后它就会退出。但你在等信号。这次的问题是子进程记录、注册信号,然后完成
node.js
将在它完成并且不等待任何其他操作时结束。它将等待的事情包括打开套接字、
setTimeout
s等等。不过,您需要它来做一些事情。作为一个简单的测试,您只需添加到
child.js

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

或者类似的。然后您将看到预期的输出。

谢谢@Aaron Dufour。我试过你的建议。它起作用了。虽然我还不清楚你说的“它将等待的东西包括打开的套接字、设置超时等等”,你是说parent.js中的设置超时将打开子进程套接字?你能详细解释一下吗?我自己也尝试过,我尝试在child.js的头部添加“process.stdin.resume()”,并在“SIGINT”处理程序中添加“process.stdin.end()”,这同样有效。你对这个决议的看法如何?谢谢。事实上,我不清楚你说的“开放式插座”是什么意思?隐式操作,如“process.stdin.resume()”??打开套接字,类似于打开TCP连接或启动服务器(在子进程中)。你到底想做什么?你现在所做的看起来像是一个测试,但如果你做了一些实际的事情,它很可能会导致node.js继续运行。是的,这只是一个测试,我只想刷新nodejs的工作点,比如当我们需要显式恢复stdin时?子进程的stdin流是默认暂停的,所以父进程中的“kill”将隐式地“resume”它(子stdin)?不需要通过子代码显式地恢复它?不,
kill
从父级将不会恢复子级的stdin。这些东西根本没有联系。如果你想要的话,你必须明确地恢复孩子的stdin。谢谢@Aaron Dufour。我试过你的建议。它起作用了。虽然我还不清楚你说的“它将等待的东西包括打开的套接字、设置超时等等”,你是说parent.js中的设置超时将打开子进程套接字?你能详细解释一下吗?我自己也尝试过,我尝试在child.js的头部添加“process.stdin.resume()”,并在“SIGINT”处理程序中添加“process.stdin.end()”,这同样有效。你对这个决议的看法如何?谢谢。事实上,我不清楚你说的“开放式插座”是什么意思?隐式操作,如“process.stdin.resume()”??打开套接字,类似于打开TCP连接或启动服务器(在子进程中)。你到底想做什么?你现在所做的看起来像是一个测试,但如果你做了一些实际的事情,它很可能会导致node.js继续运行。是的,这只是一个测试,我只想刷新nodejs的工作点,比如当我们需要显式恢复stdin时?子进程的stdin流是默认暂停的,所以父进程中的“kill”将隐式地“resume”它(子stdin)?不需要通过子代码显式地恢复它?不,
kill
从父级将不会恢复子级的stdin。这些东西根本没有联系。如果你想要的话,你必须明确地恢复孩子的stdin。