守护进程不会注册sigint信号

时间:2011-11-26 02:43:48

标签: c ubuntu daemon signals

我正在制作一个简单的守护进程,当发送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 */
}

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

您无法将键盘生成的信号发送到守护程序。你必须kill -INT

终端可以有一个前台进程组和几个后台进程组。键盘生成的信号被发送到前台进程组。

守护进程没有控制终端,因此任何终端都不能在前台或后台。

相关问题