gpt4 book ai didi

c++ - 守护进程在 linux 中不停止

转载 作者:太空狗 更新时间:2023-10-29 20:48:01 27 4
gpt4 key购买 nike

我使用了以下指南 (http://peterlombardo.wikidot.com/linux-daemon-in-c),它工作得很好,很漂亮,接受它不会杀死。

main.cpp

//Global Directives
//#define DEBUG 1
#define DAE_NAME "dae"
#define DAE_PID "/var/run/dae.pid"

//Includes
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
#include <fstream>
#include <iomanip>
#include <vector>
#include <syslog.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <assert.h>
#include <signal.h>

//Namespace (System)
using namespace std;

//Classes
#include "class.h"

//Structures
#include "struct/struct.h"

//Functions
#include "function/signal_handler.h"

void usage(int argc, char *argv[]) {
if (argc >=1) {
printf("Usage: %s -h -nn", argv[0]);
printf(" Options:n");
printf(" -ntDon't fork off as a daemon.n");
printf(" -htShow this help screen.n");
printf("n");
}
}

int main(int argc, char *argv[]) {

#if defined(DEBUG)
int daemonize = 0;
#else
int daemonize = 1;
#endif

// Setup signal handling before we start
signal(SIGHUP, signal_handler);
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGQUIT, signal_handler);

//Print Usage Information
int c;
while((c = getopt(argc, argv, "nh|help")) != -1) {
switch(c){
case 'h':
usage(argc, argv);
exit(0);
break;
case 'n':
daemonize = 0;
break;
default:
usage(argc, argv);
exit(0);
break;
}
}

// Setup syslog logging
#if defined(DEBUG)
setlogmask(LOG_UPTO(LOG_DEBUG));
openlog(DAE_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
#else
setlogmask(LOG_UPTO(LOG_INFO));
openlog(DAE_NAME, LOG_CONS, LOG_USER);
#endif

//------------
//Daemon Setup
//------------
pid_t pid, sid;

if (daemonize) {
syslog(LOG_INFO, "Starting %s", DAE_NAME);

/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}

/* Change the file mode mask */
umask(0);

/* Create a new SID for the child process */
sid = setsid();
if (sid < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}

/* Change the current working directory */
if ((chdir("/")) < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}

/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
}

int count = 1;

//-------
//Process
//-------
while (1){
process();

syslog (LOG_INFO, "%s Processed(%s, %d)", DAE_NAME, getlogin(), count);

count++;
}

syslog (LOG_INFO, "Exiting Daemon %s", DAE_NAME);

closelog (); //Close the Connection

exit(EXIT_SUCCESS);
}

信号处理器.h

#ifndef SIGNAL_HANDLER_H_
#define SIGNAL_HANDLER_H_

void signal_handler(int sig) {

switch(sig) {
case SIGHUP:
syslog(LOG_WARNING, "Received SIGHUP signal.", DAE_NAME);
break;
case SIGTERM:
syslog(LOG_WARNING, "Received SIGTERM signal.", DAE_NAME);
break;
default:
syslog(LOG_WARNING, "Unhandled signal ", DAE_NAME);
break;
}
}

#endif

命令行

所以在命令行中我运行这个

./dae

然后我跑

kill procid

日志

INFROMATIONAL, Starting dae

INFORMATIONAL, dae Processed((null), 1)

INFORMATIONAL, dae Processed((null), 2)

INFORMATIONAL, dae Processed((null), 3)

WARNING, Received SIGTERM signal.

INFORMATIONAL, dae Processed((null), 4)

INFORMATIONAL, dae Processed((null), 5)

这该死的东西还不停?任何想法谢谢

最佳答案

由于您正在处理 TERM信号,它的默认行为是禁用的。

您需要显式调用 exit()从您的程序终止的信号处理程序。

这是一个允许清理但不使用 atexit() 的实现:

signal_handler.h

#ifndef SIGNAL_HANDLER_H_
#define SIGNAL_HANDLER_H_

extern bool g_terminated;

void signal_handler(int sig) {

switch(sig) {
case SIGHUP:
syslog(LOG_WARNING, "Received SIGHUP signal.", DAE_NAME);
break;
case SIGTERM:
syslog(LOG_WARNING, "Received SIGTERM signal.", DAE_NAME);
g_terminated = true;
break;
default:
syslog(LOG_WARNING, "Unhandled signal ", DAE_NAME);
break;
}
}

#endif

main.cpp

bool g_terminated = false;

int main(int argc, char *argv[])
{
.
.
.

//-------
//Process
//-------
while (!g_terminated) {
process();

syslog (LOG_INFO, "%s Processed(%s, %d)", DAE_NAME, getlogin(), count);

count++;
}

// Cleanup...

exit(EXIT_SUCCESS);
}

关于c++ - 守护进程在 linux 中不停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182080/

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