【问题标题】:Why can't I write to a child process's socket during a SIGQUIT?为什么我不能在 SIGQUIT 期间写入子进程的套接字?
【发布时间】:2011-07-11 17:54:39
【问题描述】:

我有一个通过 UNIX 套接字与子进程通信的主进程。当主进程收到 SIGQUIT 时,我无法写入孩子的套接字。我希望子进程知道主进程正在退出并优雅地退出。

SIGQUIT 陷阱之外的通信按预期完美运行。

这里有一些重现问题的示例代码。请记住,CRTL + \ 发送一个 SIGQUIT。 (CTRL + C 是 SIGINT)

主进程:test.js

var net = require("net");
var spawn = require("child_process").spawn;

var socket = new net.Socket();

path_to_worker = process.cwd() + "/test_child.js"

var child = spawn("node", [path_to_worker]);
child.stdout.on('data', function (data) {process.stdout.write(data);})
setTimeout(function() {
  socket.connect("/tmp/node-sock", function () {
    socket.on('data', function(data) {
      console.log(data.toString());
    });
  });
}, 100)

process.on("SIGQUIT", function () {
  socket.write("This won't appear");
});

子进程:test_child.js

var net = require("net");

var socket = new net.Socket();
console.log("Started");
net.createServer(function (server_socket) {
  server_socket.on('data', function(data) {
    console.log(data.toString());
  });
  server_socket.write("This will appear");
}).listen("/tmp/node-sock");

子进程不在我的控制范围内,并且使用掩码来屏蔽除 SIGKILL 和 SIGTERM 之外的所有信号。如果在 SIGQUIT 陷阱期间根本无法写入他们的套接字,那么除了套接字之外,还有其他方法可以与他们通信吗?

【问题讨论】:

标签: sockets unix node.js child-process


【解决方案1】:

来自 Gihib,koichik 回答了我的问题: https://github.com/joyent/node/issues/1308#issuecomment-1552790

我通过 kill -SIGQUIT(不是 C-)向父进程发送了 SIGQUIT,它可以工作。

$ node test.js
Started
This will appear
This won't appear

所以我将代码添加到 test.js,然后按 C-。

child.on('exit', function(code, signal) {
  console.log(' child died', code, signal);
});

结果:

$ node test.js
Started
This will appear
^\ child died null SIGQUIT

SIGQUIT 也被发送到子进程,而不仅仅是父进程。 因此我将代码添加到 test_child.js。

process.on("SIGQUIT", function () {
  console.log(' child received SIGQUIT');
});

结果:

$ node test.js
Started
This will appear
^\ child received SIGQUIT
This won't appear

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2010-10-05
    • 2019-11-15
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多