gpt4 book ai didi

sockets - 为什么在 SIGQUIT 期间无法写入子进程的套接字?

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:33 27 4
gpt4 key购买 nike

我有一个主进程,它通过 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 陷阱期间根本无法写入套接字,除了套接字之外还有其他方式与它们通信吗?

最佳答案

koichik 在 Githib 回答了我的问题: 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

关于sockets - 为什么在 SIGQUIT 期间无法写入子进程的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6654277/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com