Linux 守护进程创建

来源:互联网 发布:淘宝第四层级金额 编辑:程序博客网 时间:2024/05/19 14:53

守护进程demo

守护进程,也即通常所说的 Daemon 进程,是 Linux下一种特殊的后台服务进程,它独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。守护进程通常在系统引导装入时启动,在系统关闭时终止。Linux 系统下大多数服务都是通过守护进程实现的。


如果不想进程受到用户、终端或其他变化的影响,就必须把它变成守护进程。

守护进程的名称通常以 “d” 结尾,如 “httpd”、“crond”、“mysqld”等。

守护进程属于 Linux 进程管理的范畴。其首要的特性是后台运行;其次,要与从启动它的父进程的运行环境隔离开来,需要处理的内容大致包括会话、控制终端、进程组、文件描述符、文件权限掩码以及工作目录等。
守护进程可以在 Linux 启动时从脚本 /etc/rc.d 启动,也可以由作业规划进程 crond 启动,还可以通过用户终端(一般是 Shell)启动。

实现一个守护进程,其实就是将普通进程按照上述特性改造为守护进程的过程。
需要注意的一点是,不同版本的 Unix 系统其实现机制不同,BSD 和 Linux 下的实现细节就不同。

根据上述的特性,我们便可以创建一个简单的守护进程

编写守护进程的一般步骤步骤:

(1)在父进程中执行fork并exit推出;(2)在子进程中调用setsid函数创建新的会话;(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;(4)在子进程中调用umask函数,设置进程的umask为0;(5)在子进程中关闭任何不需要的文件描述符(6)在while循环中执行操作。。。。。。
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <time.h>#include <fcntl.h>#include <string.h>int main(){       int i;    int pid = fork();    if (pid > 0)    {        printf("父进程退出,子进程 pid = %d \n",pid);        exit(0); //父进程退出    }    else    {        printf("现在进入子进程... ...  \n");        setsid(); // 调用setsid函数创建新的会话,子进程开启新会话,并成为会话首进程和组长进程        if (0 != chdir("/"))        {            perror("chdir ");            exit(1);        }        umask(0);        for (i = 0; i < 64; i++)        {            close (i);        }        char buf[128];    //每隔两秒钟将系统时间写入到文件        while (1)        {               //创建文件需要注意权限问题,根目录下无法创建            int fd = open("/home/liu/learn/lrn_linux/daemon.log",O_WRONLY|O_CREAT|O_APPEND,0644);            if (-1 == fd)            {                perror("open failed");            }            time_t sec = time(NULL);            sprintf(buf,"second form 1970-1-1 000000 is %d \n",(unsigned int)sec);            write(fd, buf, strlen(buf));            memset(buf,0,sizeof(buf));            //格林尼治时间            struct tm gmclock = *gmtime(&sec);            sprintf(buf,"格林尼治时间: %d-%d-%d %d:%d:%d\n",1900 + gmclock.tm_year,1+gmclock.tm_mon,gmclock.tm_mday,gmclock.tm_hour,gmclock.tm_min,gmclock.tm_sec);            write(fd, buf, strlen(buf));            memset(buf,0,sizeof(buf));            //本地时间            struct tm localclock = *localtime(&sec);            sprintf(buf,"本地时间: %d-%d-%d %d:%d:%d\n",1900 + localclock.tm_year,1+localclock.tm_mon,localclock.tm_mday,localclock.tm_hour,localclock.tm_min,localclock.tm_sec);            write(fd, buf, strlen(buf));            memset(buf,0,sizeof(buf));            char *sbuf = asctime(localtime(&sec));            write(fd,sbuf,strlen(sbuf));            close(fd);            sleep(2);                   }    }}
原创粉丝点击