zoukankan      html  css  js  c++  java
  • linux守护进程小例

    程序目的:设计三个并发的守护进程在后台运行,其中第一子进程写守护进程的运行日志记录,第二子进程child2则监控进程中是否有gedit工具调用,第二子进程child3则检查自己是否有新邮件到达,若有则将邮件内容输出到一个主目录下文件

    程序分析:此处我借用fork()函数创建三个并发的守护进程,借用syslog调试程序运行;其中,第二子进程child2作为gedit工具调用的监控守护进程,

             第一子进程child1借助syslog日志监控守护进程的运行,第二子进程child3此处用来检查是否有新邮件收到,收到则将邮件内容输出到重定向输出文件标记:

             一般来说守护进程无法在终端中调试,也无法在终端输出,故而均采用syslog()函数进行跟踪调试

     

    /*文件名为2.c*/

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

    int main()
    {
       pid_t child1,child2,child3;
       struct stat buf;
       int i,check=0,j=0;
       time_t t;
       DIR * dir;
       struct dirent * ptr;

       child1=fork();
       if (child1>0)
           exit(0);    /*父进程退出*/
       else if(child1<0)
       {
          perror("创建子进程失败");
          exit(1);
       }

      /*第一子进程*/
       setsid();
       chdir("/");
       umask(0);
       for(i=0;i<NOFILE;++i)
       close(i);
       openlog("守护进程程序信息",LOG_PID,LOG_DAEMON); /*打开守护进程日志/var/log/syslog */

       child2=fork();
       if (child2==-1)
       {
         perror("创建子进程失败");
         exit(2);
       }
       else if (child2==0)/*第二子进程中的child2*/
       {
         i=0;
         while(i++<100){
         system("ps -ef|grep gedit> /home/king/gedit.log");
         stat("home/king/gedit.log",&buf); /*根据从进程中调出的文件数据大小判读当前是否有调用gedit工具*/
         if (buf.st_size>180 && check==0) /*此处的180来自于文件查看得出的数据,check用来记录当前gedit是否调用*/
           {
             t=time(0);
             syslog(LOG_INFO,"gedit开始时间为: %s\n",asctime(localtime(&t)));
             check=1;  
           }
         if (buf.st_size<180 && buf.st_size>0 && check==1)
           {  
             t=time(0);
             syslog(LOG_INFO,"gedit结束时间为: %s\n",asctime(localtime(&t)));
             check=0;
           }
         sleep(1);
         }
       }
       else
       { /*在第一子进程下继续创建进程*/
          child3=fork();
          if (child3<0){
            perror("创建子程序失败");
            exit(3);
          }
          else if (child3==0){ /*第二子进程child3用来查看邮件*/
            j=0;
            dir=opendir("/var/spool/mail/king");
            while (j<6){
            j++;
            sleep(10);
            if ((ptr=readdir(dir))!=NULL){
                system("cat /var/spool/mail/king/* > /home/king/mail.log");
            }
            }
            closedir(dir);
          }
          else
          {  /*第一子进程写日志来记录守护进程的运行*/
              t=time(0);
              syslog(LOG_INFO,"守护进程开始时间为: %s\n",asctime(localtime(&t)));
              waitpid(child2,NULL,0);
              waitpid(child3,NULL,0);
              t=time(0);
              syslog(LOG_INFO,"守护进程结束时间为: %s\n",asctime(localtime(&t)));
              closelog();
              while (1)
                sleep(10);
          }  
       }
    }

    在下linux系统为ubuntu,主文件名为king

    先在  var/spool/mail/king/下建一文本文件,便于测试第二子进程child3功能

    在终端1中运行 

    sudo ./2

    tail -f /var/log/syslog

    监控程序运行

    Sep  5 18:27:54 ubuntu 守护进程程序信息[26748]: 守护进程开始时间为: Sun Sep  5 18:27:54 2010#012
    Sep  5 18:28:10 ubuntu 守护进程程序信息[26749]: gedit开始时间为: Sun Sep  5 18:28:10 2010#012
    Sep  5 18:28:32 ubuntu 守护进程程序信息[26749]: gedit结束时间为: Sun Sep  5 18:28:32 2010#012
    Sep  5 18:29:12 ubuntu 守护进程程序信息[26748]: 守护进程结束时间为: Sun Sep  5 18:29:12 2010#012

     


    在终端2中运行

    ps -ef | grep ./2

    可观察到相应的守护进程运行

    运行一个gedit文件,等待数秒后关闭

    再等候一会到对应的守护进程全部停止关闭

    最终在主目录下的mail.log中可看到邮件内容

    个人想法:守护进程能够在后台提供服务,那么便具有一定的隐蔽性,一般操作用户无法发现.......所以是个用来做黑客软件的很好的程序对象

  • 相关阅读:
    Assetbundle创建与加载
    11个超棒的iOS开发学习网站
    UGUI
    Unity3D教程宝典之Shader篇
    解决ngui挡住粒子的问题
    unity 随笔
    进程与线程浅析
    c#语言
    Unity3D中使用委托和事件
    Unity3D中常用的数据结构总结与分析
  • 原文地址:https://www.cnblogs.com/chuxiking/p/1818546.html
Copyright © 2011-2022 走看看