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

标签 c ubuntu daemon signals

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

相关文章:

ubuntu - python 脚本到 .deb ubuntu 包来安装守护进程

c - 将空字符插入 snprintf

c - LLDB 错误,我该怎么办?

java - Java中的类不就相当于c中的结构吗

Python 3.6 : New line command '/n' is ignored when writing to a file on AWS Ubuntu

python - 如何在 Python 中生成一个新的独立进程

检查文件是否正在使用 Win32 API 或 C/C++ 写入。我自己没有写权限

ubuntu - 将 Kubernetes 网络路由更改为互联网

python - 在 Ubuntu Azure VM 上找到 SQL Server 的 ODBC 驱动程序 13.0

java - Matlab 与 Java 中运行的 Java 守护进程的连接