Linux进程间的通信——守护进程学习笔记

初识守护进程

守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进程.Linux的大多数服务器就是用守护进程实现的.比如,Internet服务器inetd,Web服务器httpd等.同时,守护进程完成许多系统任务.比如,作业规划进程crond,打印进程lpd等.

创建守护进程步骤总结

1、父进程中执行fork之后,执行exit退出,让子进程成为孤儿进程。
2、在子进程中调用setsid,让守护进程成为会话的领导,让程序与控制台脱离关系。
3、chdir(“/”)让根目录成为子进程的工作目录。
4、把子进程的umask设为0。
5、关闭任何不需要的文件描述符
前两步是必须的,后三步根据需要添加
Linux进程间的通信——守护进程学习笔记_第1张图片

**

实例讲解

**
1、自己动手实现一个守护进程,当控制台窗口关闭时还可以在后台运行。每隔一秒钟向my.log文件中插入一条记录,记录格式如下:yyyy-mm-dd hh:mi:se 记录内容,其中yyyy为年,mm为月,dd为天,hh为小时,mi为分钟, se为秒。

/*daemon.c */

#include 
#include 
#include
#include
#include
#include 
#include 
#include 

void writelog(const char*log)
{
    time_t tDate;
    struct tm *eventTime;
    time(&tDate); //得到系统时间
    eventTime = localtime(&tDate); //将时间格式化为struct tm的格式
    int i_Year = eventTime->tm_year + 1900;
    int i_Mon = eventTime->tm_mon + 1;
    int i_Day = eventTime->tm_mday;
    int i_Hour = eventTime->tm_hour;
    int i_Min = eventTime->tm_min;
    int i_Sec = eventTime->tm_sec;
    char sDate[16];
    sprintf(sDate, "%4d-%2d-%2d", i_Year, i_Mon, i_Day);
    char sTime[16];
    sprintf(sTime, "%2d:%2d:%2d", i_Hour, i_Min, i_Sec);
    char s[1024];
    sprintf(s, "%s %s %s\n", sDate, sTime, log);

    FILE *fp = fopen("/home/vicent/5/my.log", "a+");
    if (fp == NULL)
    {
        printf("fopen failed\n");
        return;
    }
    fwrite(s, sizeof(char), strlen(s) + 1, fp);
    fclose(fp);
}

void setdaemon()
{
    pid_t sid;
    pid_t pid = fork();

    if (pid < 0)
    {
        printf("fork failed:%s\n", strerror(errno));
        return;
    }
    if (pid > 0) //父进程
    {
        exit(EXIT_FAILURE); //父进程直接退出,让子进程成为孤儿程序
    }
    if (pid == 0) //子进程
    {
        if((sid=setsid())<0)//让进程与控制台脱离关系
        {
            printf("setsid failed\n");
            exit(EXIT_FAILURE);
        }

        //chdir("/"); //让根目录成为子进程的工作目录
        //umask(0);
        //close(STDIN_FILENO);
        //close(STDOUT_FILENO);
        //close(STDERR_FILENO);
    }
}

int main(void)
{
    setdaemon();
    char buf[100];
    int i = 0;
    while (1)
    {
        memset(buf, 0, sizeof(buf));
        sprintf(buf, "log %d", i++);
        writelog(buf);
        sleep(1);
    }

    return 0;
}

运行结果
Linux进程间的通信——守护进程学习笔记_第2张图片
my.log内容
Linux进程间的通信——守护进程学习笔记_第3张图片
即使关闭控制台,writelogdae仍然在后台继续运行,my.log继续写内容。

你可能感兴趣的:(linux进程间通信)