我正试图为我的程序编写一个systemD守护进程。在阅读Linux手册页时,我注意到了一句话:
如果收到SIGHUP,请重新加载配置文件(如果适用的话)。
我的问题是,在接收到SIGHUP后,如何在C/C++中“重新加载配置文件”?
我已经看到其他人在接收SIGHUP时通过execv(self, args);重新启动守护进程。但是,我是否可以在不重新启动守护进程的情况下重新加载配置文件?
谢谢你的帮助!
发布于 2023-04-02 15:14:55
从中派生出来,并实现纯虚拟化:
class LinuxOSService
{
public:
LinuxOSService()
{
sigemptyset(&sigset_);
sigaddset(&sigset_, SIGINT);
sigaddset(&sigset_, SIGTERM);
sigaddset(&sigset_, SIGHUP);
sigaddset(&sigset_, SIGUSR1);
sigprocmask(SIG_BLOCK, &sigset_, nullptr);
wait_thread_ = std::thread(&LinuxOSService::signal_handler, this);
}
virtual ~LinuxOSService()
{
wait();
}
void wait()
{
if (wait_thread_.joinable())
wait_thread_.join();
}
void abort()
{
abort_ = true;
raise(SIGUSR1);
}
virtual void on_terminate() = 0;
virtual void on_reload() = 0;
private:
sigset_t sigset_;
std::thread wait_thread_;
std::atomic<bool> abort_ = false;
void signal_handler()
{
int signum;
siginfo_t siginfo;
while (!abort_)
{
signum = sigwaitinfo(&sigset_, &siginfo);
if(abort_)
break;
if (signum == -1)
{
if (errno == EINTR)
continue;
break;
}
if (signum == SIGINT
|| signum == SIGTERM)
{
on_terminate();
break;
}
else if (signum == SIGHUP)
on_reload();
}
}
};https://unix.stackexchange.com/questions/687797
复制相似问题