守护进程不会注册sigint信号

rkr*_*rdo 3 c ubuntu signals daemon

我正在制作一个简单的守护进程,当发送SIGINT和SIGTERM信号时会生成一个日志,我可以在发出SIGTERM信号时记录,但是当我按Ctrl + C尝试获取SIGINT信号时,似乎信号不是因为它没有保存在日志中,所以守护进程正在运行,而我尝试发送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 */
}
Run Code Online (Sandbox Code Playgroud)

我的代码找不到任何问题,我正在使用Ubuntu 11.04.

cHa*_*Hao 5

由于守护进程的定义并未在前台运行,因此当您按Ctrl + C时,应用程序不会获得SIGINT.Ctrl + C仅影响前台应用.