gpt4 book ai didi

c++ - 从主循环调用守护进程函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:20 25 4
gpt4 key购买 nike

所以我正在编写一个将作为 Linux 系统中的后台进程运行的程序,并且我一直在设置一个守护进程函数以开始在后台运行该进程。我需要知道的是我是否应该在主类中声明一个对象来运行 daemonize 函数,或者我是否应该将 daemonize 函数和它的两个子函数设为静态。代码在下面,有没有更好的方法来做到这一点,或者一种方法比另一种方法更可取?谢谢。

#include "../Headers/LogMonitor.h"

#define RUNNING_DIR "/tmp"
#define LOCK_FILE "exampled.lock"
#define LOG_FILE "exampled.log"

LogMonitor::LogMonitor() {
// TODO Auto-generated constructor stub

}

LogMonitor::~LogMonitor() {
// TODO Auto-generated destructor stub
}

int main( int argc, const char* argv[] )
{
// Daemonize the program to run in the background
LogMonitor::daemonize();
}

void LogMonitor::signal_handler(int sig)
{
switch(sig) {
case SIGHUP:
log_message(LOG_FILE,"hangup signal caught");
break;
case SIGTERM:
log_message(LOG_FILE,"terminate signal caught");
exit(0);
break;
}
}

void LogMonitor::log_message(const char *filename, const char *message)
{
FILE *logfile;
logfile=fopen(filename,"a");
if(!logfile) return;
fprintf(logfile,"%s\n",message);
fclose(logfile);
}

void LogMonitor::daemonize()
{
int i,lfp;
char str[10];

if(getppid()==1) return; // Check if already a daemon

i = fork();
if (i < 0) exit(1); // Fork error
if (i > 0) exit(0); // Parent exits

setsid(); // Obtain a new process group

for (i = getdtablesize(); i >= 0; --i) close(i); // Close all descriptors

i = open("/dev/null",O_RDWR); // stdin
dup(i); // stdout
dup(i); // stderr

umask(027); // Set newly created file permissions

chdir(RUNNING_DIR); // Change running directory

lfp = open("exampled.lock",O_RDWR|O_CREAT,0640);
if (lfp < 0) exit(1); // Can't open
if (lockf(lfp,F_TLOCK,0) < 0) exit(0); // Can't lock
sprintf(str,"%d\n", getpid());
write(lfp,str,strlen(str)); // Record pid to lockfile

signal(SIGCHLD,SIG_IGN); // Ignore child
signal(SIGTSTP,SIG_IGN); // Ignore tty signals
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGHUP, LogMonitor::signal_handler); // Catch hangup signal
signal(SIGTERM, LogMonitor::signal_handler); // Catch kill signal
}

最佳答案

现代守护进程不应该自己做背景。相反,只需在前台运行它并让 caller(即 /etc/init.d 下的脚本)选择守护它 - start-stop- daemon(8) 是常用的,尽管 systemd 可以自己完成。

关于c++ - 从主循环调用守护进程函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26767103/

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