gpt4 book ai didi

c++ - 在 C++ 中确定系统停止

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:44 27 4
gpt4 key购买 nike

好吧,我正在开发一个用 C++ 编写的程序,该程序作为守护进程运行。它主要针对 Linux 用户,但我希望也包括 Windows(作为服务运行)和 Mac 用户。

我希望守护进程在手动关闭时进行记录。但是,它不应该记录由于系统停止或重新启动而导致的系统关闭。

目前我已经屏蔽了所有信号并使用 sigaction() 实现了某种处理。在记录关闭之前,还有一个函数会检查系统的运行级别,如果是 0, 1 0r 6 则忽略记录。检查运行级别的方法是运行命令“runlevel”并处理输出。

我的问题是运行级别并不总是我所期望的。我正在运行 Ubuntu,当像往常一样登录时,我处于运行级别 2,重新启动时也是如此。当停止时,我有时从“运行级别”得不到任何输出。不同的 Linux 发行版使用自己的运行级别,因此它对于可移植性来说并不是最佳的。

那么有没有更好的方法来确定系统是否停止呢?另外,是否有更好的方法来捕获中断,例如通过异常处理等?

如果有任何帮助,我将在这里粘贴一段代码。用 c++ 编写,使用 Poco C++ libraries .

void MainApplication::signalHandler(int sig) {
#if defined(POCO_OS_FAMILY_UNIX)
switch(sig) {
case -1:
struct sigaction act;
act.sa_handler = signalHandler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, 0); //Better way to do this?
sigaction(SIGQUIT, &act, 0);
sigaction(SIGKILL, &act, 0);
sigaction(SIGTERM, &act, 0);
sigaction(SIGHUP, &act, 0);
sigaction(SIGSTOP, &act, 0);
sigaction(SIGTSTP, &act, 0);
sigaction(SIGCONT, &act, 0);
sigaction(SIGUSR1, &act, 0);
sigaction(SIGUSR2, &act, 0);
break;
case SIGINT:
case SIGQUIT:
case SIGTSTP:
case SIGHUP:
case SIGKILL:
case SIGTERM:
//Log Shutdown!
if (!isHalting())
_instance->_database->logBypass(BYPASS_SHUTDOWN);
terminateNicely(true);
break;
case SIGCONT:
//Continued, means stopped
break;
case SIGUSR1:
//Resetting Net Responsibility
_instance->uninitialize();
_instance->initialize(*_instance);
break;
case SIGUSR2:
//Other action or just mask it
break;
default:
//Caught signal
break;
}
#endif
}



bool MainApplication::isHalting() {
#if defined(POCO_OS_FAMILY_UNIX)
string cmd("runlevel");
vector<string> args;
Poco::Pipe outPipe;
ProcessHandle ph = Process::launch(cmd, args, 0, &outPipe, 0);
ph.wait();
Poco::PipeInputStream istr(outPipe);
stringstream ss;
Poco::StreamCopier::copyStream(istr, ss);
int runlevel;
ss.seekg(-2, ios::end);
ss >> runlevel;
return (runlevel == 0 || runlevel == 1 || runlevel == 6);
#else
return false;
#endif
}

最佳答案

我最终选择了另一条路线来解决这个问题。现在,我正在读取计算机的启动历史记录,并将其与软件的历史记录进行比较,以查看计算机是否在没有该软件的情况下启动或停止。这就足够了,而且可能会更加准确。

用于确定 Linux 中启动历史记录的命令是

$ last reboot

关于c++ - 在 C++ 中确定系统停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9159558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com