mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 14:59:39 -04:00
ipc: Add Ctrl-C handler for spawned subprocesses
This fixes an error reported by Antoine Poinsot <darosior@protonmail.com> in https://github.com/bitcoin-core/libmultiprocess/issues/123 that does not happen in master, but does happen with https://github.com/bitcoin/bitcoin/pull/10102 applied, where if Ctrl-C is pressed when `bitcoin-node` is started, it is handled by both `bitcoin-node` and `bitcoin-wallet` processes, causing the wallet to shutdown abruptly instead of waiting for the node and shutting down cleanly. This change fixes the problem by having the wallet process print to stdout when it receives a Ctrl-C signal but not otherwise react, letting the node shut everything down cleanly.
This commit is contained in:
parent
85bed077bd
commit
55b4df08f1
1 changed files with 23 additions and 0 deletions
|
@ -17,6 +17,7 @@
|
|||
#include <cstdlib>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <signal.h>
|
||||
#include <stdexcept>
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
|
@ -26,6 +27,27 @@
|
|||
|
||||
namespace ipc {
|
||||
namespace {
|
||||
#ifndef WIN32
|
||||
std::string g_ignore_ctrl_c;
|
||||
|
||||
void HandleCtrlC(int)
|
||||
{
|
||||
(void)write(STDOUT_FILENO, g_ignore_ctrl_c.data(), g_ignore_ctrl_c.size());
|
||||
}
|
||||
#endif
|
||||
|
||||
void IgnoreCtrlC(std::string message)
|
||||
{
|
||||
#ifndef WIN32
|
||||
g_ignore_ctrl_c = std::move(message);
|
||||
struct sigaction sa{};
|
||||
sa.sa_handler = HandleCtrlC;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_RESTART;
|
||||
sigaction(SIGINT, &sa, nullptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
class IpcImpl : public interfaces::Ipc
|
||||
{
|
||||
public:
|
||||
|
@ -53,6 +75,7 @@ public:
|
|||
if (!m_process->checkSpawned(argc, argv, fd)) {
|
||||
return false;
|
||||
}
|
||||
IgnoreCtrlC(strprintf("[%s] SIGINT received — waiting for parent to shut down.\n", m_exe_name));
|
||||
m_protocol->serve(fd, m_exe_name, m_init);
|
||||
exit_status = EXIT_SUCCESS;
|
||||
return true;
|
||||
|
|
Loading…
Add table
Reference in a new issue