私のプログラム用の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();
}
}
};