守护进程是指:在后台运行的一种特殊进程

       脱离终端

       不被信号干扰(有两种信号除外),产生的信息也不在任何终端上显示

       周期性的执行某个任务或等待处理某个发生的事件

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc,char* argv[])
{
        FILE *fp;
        time_t ticks;
        init_daemon(argv[0],LOG_KERN);
        while(1)
        {
                sleep(1);
                ticks=time(NULL);//读取当地时间
                syslog(LOG_INFO,"%s",asctime(localtime(&ticks)));//产生一条日志信息,然后由日志守候进程发布到日志文件中去,日>志级别LOG_INFO(消息)日志输出格式,输出文档的内容
                }
        }

int init_daemon(const char *pname,int facility)
{
        int pid;
        int i;
        signal(SIGTTOU,SIG_IGN);//1.屏蔽一些有关控制终端操作的信号,signal(SIGTTOU,SIG_IGN)忽略所有可以忽略的信号
        signal(SIGTTIN,SIG_IGN);
        signal(SIGTSTP,SIG_IGN);
        signal(SIGHUP,SIG_IGN);

        if(pid=fork())
                exit(EXIT_SUCCESS);//2.为了避免挂起控制终端在后台运行,创建子进程,使父进程终止
        else if(pid<0)
        {
                perror("fork");
                exit(EXIT_FAILURE);
                }
        setsid();//3.脱离控制终端和进程组,调用setsid的进程成为新的会话组长和新的进程组长
        if(pid=fork())
                exit(EXIT_SUCCESS);//4.现在进程成为了会话组长,但他可以重新申请控制终端,所以禁止进程重新打开控制终端,创建子进程终止父进程
      else if(pid<0) { perror("fork"); exit(EXIT_FAILURE); } for(i=0;i<NOFILE;++i) close(i);//5.关闭子进程从父进程那里继承来的文件描述符 open("/dev/null",O_RDONLY);//对标准输入输出全部重定向到/dev/null open("/dev/null",O_RDWR);//先前关闭了所有的文件描述符,新打开的为0、1、2 open("/dev/null",O_RDWR); chdir("/tmp");//6.修改主目录 umask(0);//7.重设文件创建掩码 signal(SIGCHLD,SIG_IGN);//8.处理SIGCHLD信号(子进程退出信号) openlog(pname,LOG_PID,facility);//与守候进程建立联系,加上进程号,文件名 return; }

 

 posted on 2013-12-31 10:10  瞌睡的美人鱼  阅读(216)  评论(0编辑  收藏  举报