实例解析Perl守护进程用法

开发 架构
Perl守护进程是一种很有用的进程。Linux的大多数服务器就是用Perl守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。

本文和大家重点讨论一下Perl守护进程的概念,Perl守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

Perl守护进程

LinuxPerl守护进程的编程方法

Perl守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。Perl守护进程是一种很有用的进程。Linux的大多数服务器就是用Perl守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,Perl守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。
Perl守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下Perl守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本的SystemV)到Linux会出现错误的。下面将全面介绍Linux下Perl守护进程的编程要点并给出详细实例。

一.Perl守护进程及其特性

Perl守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,Perl守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是Perl守护进程从执行它的父进程(特别是shell)中继承下来的。***,Perl守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。
总之,除开这些特殊性以外,Perl守护进程与普通进程基本上没有什么区别。因此,编写Perl守护进程实际上是把一个普通进程按照上述的Perl守护进程的特性改造成为Perl守护进程。如果读者对进程有比较深入的认识就更容易理解和编程了。

二、Perl守护进程实例

Perl守护进程实例包括两部分:主程序test.c和初始化程序init.c。主程序每隔一分钟向/tmp目录中的日志test.log报告运行状态。初始化程序中的init_daemon函数负责生成Perl守护进程。读者可以利用init_daemon函数生成自己的Perl守护进程。

1.init.c清单 

  1. init.c#include<unistd.h> 
  2. #include<signal.h> 
  3. #include<sys/param.h> 
  4. #include<sys/types.h> 
  5. #include<sys/stat.h> 
  6. voidinit_daemon(void)  
  7. {  
  8. intpid;  
  9. inti;  
  10. if(pid=fork())  
  11. exit(0);//是父进程,结束父进程  
  12. elseif(pid<0)  
  13. exit(1);//fork失败,退出  
  14. //是***子进程,后台继续执行  
  15. setsid();//***子进程成为新的会话组长和进程组长  
  16. //并与控制终端分离  
  17. if(pid=fork())  
  18. exit(0);//是***子进程,结束***子进程  
  19. elseif(pid<0)  
  20. exit(1);//fork失败,退出  
  21. //是第二子进程,继续  
  22. //第二子进程不再是会话组长  
  23.  
  24. for(i=0;i<NOFILE;++i)//关闭打开的文件描述符  
  25. close(i);  
  26. chdir("/tmp");//改变工作目录到/tmp  
  27. umask(0);//重设文件创建掩模  
  28. return;  
  29. }  
  30.  

 2.test.c清单test.c#include<stdio.h>
 

  1. #include<time.h> 
  2.  
  3. voidinit_daemon(void);//Perl守护进程初始化函数  
  4.  
  5. main()  
  6. {  
  7. FILE*fp;  
  8. time_tt;  
  9. init_daemon();//初始化为Daemon  
  10.  
  11. while(1)//每隔一分钟向test.log报告运行状态  
  12. {  
  13. sleep(60);//睡眠一分钟  
  14. if((fp=fopen("test.log","a"))>=0)  
  15. {  
  16. t=time(0);  
  17. fprintf(fp,"Imhereat%s\n",asctime(localtime(&t)));  
  18. fclose(fp);  
  19. }  
  20. }  
  21. }  
  22.  

 以上程序在RedHatLinux6.0下编译通过。步骤如下:
编译:gcc-g-otestinit.ctest.c
执行:./test
查看进程:ps-ef
从输出可以发现testPerl守护进程的各种特性满足上面的要求。
zt:http://swallor.blogdriver.com/swallor/567186.html

【编辑推荐】

 

  1. 应用Perl多进程技术到自动化测试脚本
  2. Perl多进程概念解析
  3. 解析四大Perl操作符用法
  4. 术语汇编 Perl多进程概念详解
  5. 实例解析Perl多进程技术在自动化测试中的应用
责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-16 08:47:53

Perl if语句

2010-07-20 09:45:04

Perl继承

2010-07-19 14:37:01

Perl进程启动函数

2010-07-19 14:20:57

Perl函数

2010-07-15 13:13:21

Perl多进程

2010-07-23 13:46:27

Perl语言

2010-07-13 13:49:43

Perl foreac

2010-07-15 15:47:46

Perl守护进程

2010-07-16 16:56:01

Perl构造函数

2010-07-19 14:13:41

Perl函数

2010-07-15 10:22:23

Perl控制结构

2010-07-14 15:32:21

Perl转义字符

2010-07-16 13:10:36

Perl哈希表

2010-07-20 15:02:20

Perl数组

2010-07-15 12:51:17

Perl多进程

2010-07-21 13:59:59

Perl引用

2010-07-26 15:17:51

Perl解析XML文件

2010-07-15 10:47:22

Perl命令行

2010-07-13 09:23:00

Perl变量

2010-07-14 12:39:30

Prel字符串
点赞
收藏

51CTO技术栈公众号