демон не зарегистрирует сигнал sigint - PullRequest
3 голосов
/ 26 ноября 2011

Я делаю простой демон, который ведет журнал при отправке сигналов SIGINT и SIGTERM, я уже могу регистрировать, когда подается сигнал SIGTERM, но когда я пытаюсь получить сигнал SIGINT нажатием 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.

Ответы [ 2 ]

5 голосов
/ 26 ноября 2011

Поскольку демон по определению не работает на переднем плане, это не приложение, которое получит SIGINT, когда вы нажмете Ctrl + C.Ctrl + C влияет только на приложение переднего плана.

3 голосов
/ 26 ноября 2011

Вы не можете отправлять сгенерированные с клавиатуры сигналы демону.Вам потребуется kill -INT it.

Терминал может иметь одну группу процессов переднего плана и несколько групп фоновых процессов.Сгенерированные с клавиатуры сигналы отправляются в группу процессов переднего плана.

У демона нет управляющего терминала, поэтому он не может быть ни на переднем плане, ни на заднем плане ни для какого терминала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...