下面是一个示例代码,实现了你描述的守护服务功能:
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
// 定义全局变量存储进程路径和参数
const std::string processPath = "/path/to/your/process";
const std::string processArgs = "arguments";
// 声明函数用于重启进程
void restartProcess() {
pid_t pid = fork();
if (pid == 0) {
// 子进程,执行新的进程
execl(processPath.c_str(), processPath.c_str(), processArgs.c_str(), nullptr);
}
}
// 声明信号处理函数,用于捕捉异常退出信号并重启进程
void signalHandler(int signum) {
if (signum == SIGTERM || signum == SIGINT) {
exit(0); // 接收到终止信号时退出程序
} else if (signum == SIGHUP) {
restartProcess(); // 接收到挂起信号时重启进程
}
}
int main() {
// 检查之前的PID或进程路径是否存在,如果存在则kill掉之前的进程
int prevPidFd = open("/var/run/yourdaemon.pid", O_RDWR | O_CREAT, 0666);
int prevPid;
int lockResult = flock(prevPidFd, LOCK_EX | LOCK_NB);
if (lockResult != 0) {
// 锁定失败,说明之前的进程正在运行中,获取其PID并杀死之前的进程
read(prevPidFd, &prevPid, sizeof(int));
kill(prevPid, SIGTERM);
}
// 将当前进程的PID写入文件
int currentPid = getpid();
lseek(prevPidFd, 0, SEEK_SET);
write(prevPidFd, ¤tPid, sizeof(int));
// 注册信号处理函数
signal(SIGTERM, signalHandler); // 终止信号
signal(SIGINT, signalHandler); // 键盘中断信号
signal(SIGHUP, signalHandler); // 挂起信号
// 主循环,等待程序退出
while (true) {
sleep(1);
// 在此处添加你需要执行的其他代码逻辑
// 如果人为取消或暂停,则退出主循环,不重启该进程
if (shouldCancelOrPause) {
break;
}
// 如果程序异常退出,则根据路径和参数重启进程
if (!isProcessRunning()) {
restartProcess();
}
}
close(prevPidFd);
return 0;
}
以上代码仅是一个简单示例,你可以根据实际需求进行修改和扩展。注意替换 processPath
和 processArgs
为你实际的进程路径和参数,并根据需要添加其他相关代码逻辑。
内容由零声教学AI助手提供,问题来源于学员提问