我正在尝试为我的程序编写一个 systemD 守护进程。当我阅读 Linux 手册页时,我注意到一行:
如果收到 SIGHUP,则重新加载配置文件(如果适用)。
我的问题是,在收到 SIGHUP 后,如何在 C/C++ 中“重新加载配置文件”?
我见过其他人execv(self, args);
在收到 SIGHUP 时重新启动守护进程。但是,有没有一种方法可以重新加载配置文件,而无需重新启动守护进程?
谢谢您的帮助!
答案1
由此派生并实现纯虚拟:
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();
}
}
};