내 프로그램에 대한 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();
}
}
};