gpt4 book ai didi

c - 守护进程不会注册 sigint 信号

转载 作者:太空狗 更新时间:2023-10-29 15:59:31 24 4
gpt4 key购买 nike

我正在制作一个简单的守护进程,它在发送 SIGINT 和 SIGTERM 信号时生成日志,我已经可以在生成 SIGTERM 信号时进行记录,但是当我尝试通过按 Ctrl +C 似乎没有发出信号,因为它没有保存在日志中,而且当我尝试发送 SIGINT 信号时守护进程正在运行。

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>

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

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

void signal_handler(sig)
int sig;
{
switch(sig) {

case SIGTERM:
log_message(LOG_FILE,"received a SIGTERM signal");
exit(0);
break;
case SIGINT:
log_message(LOG_FILE, "received a SIGINT signal");
exit(0);
break;
}
}

void daemonize()
{
int i,lfp;
char str[10];
if(getppid()==1) return; /* already a daemon */
i=fork();
if (i<0) exit(1); /* fork error */
if (i>0) exit(0); /* parent exits */
/* child (daemon) continues */
setsid(); /* obtain a new process group */
for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
i=open("/dev/null",O_RDWR); /* open stdin */
dup(i); /* open stdout */
dup(i); /* open stderr */
umask(027); /* set newly created file permissions */
chdir(RUNNING_DIR); /* change running directory */
lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
if (lfp<0) exit(1); /* can not open */
if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
/* first instance continues */
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(SIGTERM,signal_handler); /* catch kill signal */
signal(SIGINT,signal_handler); /* catch kill signal */
}

main()
{
daemonize();
while(1) sleep(1); /* run */
}

我没有发现我的代码有任何问题,我使用的是 Ubuntu 11.04。

最佳答案

由于根据定义守护程序不在前台运行,因此当您按 Ctrl+C 时,它不是应用程序将获得 SIGINT。 Ctrl+C 仅影响前台应用。

关于c - 守护进程不会注册 sigint 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275898/

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