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中可看到邮件内容

 

 

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

 

 

 

 

 

转载于:https://www.cnblogs.com/chuxiking/archive/2010/09/05/1818546.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值