C语言实现简单的守护进程及信号处理

C语言实现的一个比较简单的守护进程、信号处理及具名管道与守护进程通信的例子

daemon.h
#ifndef DAEMON_H_

#define DAEMON_H_

void write_log(char *); 
void set_daemon(void);
void signal_handler(int);
void listen_fifo();

#endif


daemon.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include "daemon.h"

const char *filename = "/home/solariens/Documents/C/err.log";
const char *fifo_path = "/home/solariens/Documents/C/fifo";

void write_log(char *error) {
    time_t date_time;
    time(&date_time);
    struct tm *date = localtime(&date_time);

    int year = date->tm_year;
    int month = date->tm_mon;
    int day = date->tm_mday;
    int hour = date->tm_hour;
    int min = date->tm_min;
    int sec = date->tm_sec;

    char str_date[1000];
    memset(str_date, 0, strlen(str_date));
    sprintf(str_date, "[date:%04d-%02d-%02d %02d:%02d:%02d] [err_msg:%s] \n", year, month, day, hour, min, sec, error);
    FILE *fp = fopen(filename, "a");
    fwrite(str_date, 1, strlen(str_date), fp);
    fclose(fp);
}

void set_daemon() {
    pid_t pid = fork();
    if (pid < 0) {
        write_log(strerror(errno));
        exit(0);
    } else if (pid > 0) {
        exit(0);
    } else {
        setsid();
        chdir("/");
        umask(0);
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
    }
}

void signal_handler(int signo) {
    switch(signo) {
        case SIGINT :
            listen_fifo();
            break;
    }
}

void listen_fifo() {
    int fd = open(fifo_path, O_RDONLY);
    if (fd == -1) {
        write_log(strerror(errno));
        exit(0);
    }
    char buf[1000];
    memset(buf, 0, sizeof(buf));
    if((read(fd, buf, sizeof(buf))) > 0) {
        int len = strlen(buf);
        if (buf[len - 1] == '\n') {
            buf[len - 1] = 0;
        }
        write_log(buf);
    }
}

main.c

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include "daemon.h"

int main() {
    set_daemon();
    signal(SIGINT, signal_handler);
    while(1) {
        sleep(1);
    }   
    return 0;
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值