您的当前位置:首页正文

守护进程浅析

2024-06-28 来源:步旅网
  中图分类号:TP311  文献标识码:A  文章编号:1009-2552(2008)06-0088-02

守护进程浅析

周 超,毋玉芝

(焦作大学计算机系,焦作454003)

摘 要:守护进程独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。在

Linux系统中,大多数服务器都是用守护进程实现的。现介绍了守护进程的编写步骤,并给出了避免守护进程本身的多个副本相互干扰的加锁方法。关键词:服务;加锁;进程;互斥

ProbingintodaemonprocessZHOUChao,WUYu2zhi(ComputerDepartment,JiaozuoUniversity,Jiaozuo454003,China)

Abstract:Daemonprocessisindependenttocontrolterminalsandperformssometasksperiodicallyorwaitsforprocessingcertainevents.ThemajorityserverrealizesdaemonprocessunderLinux.ThispapergivesamethodofprogrammingdaemonforLinuxandoffersalockingmethodsavoidingmutualdisturbanceofmultiplecopiesofdaemonitself.

Keywords:service;lock;process;mutex

0 引言

Linux服务器在启动时需要启动很多系统服务,

造成守护进程。具体步骤如下:

(1)后台运行,为避免挂起,控制终端将Daemon放入后台执行。

(2)脱离控制终端,登录会话和进程组。

(3)禁止进程重新打开控制终端。(4)关闭打开的文件描述符。(5)改变当前工作目录。(6)重设文件创建掩模。(7)处理SIGCHLD信号。

它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户,提供这些服务的程序是由运行在后台的守护进程来执行的。守护进程是生存期长的一种进程,它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。它们常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务器都是用守护进程实现的;同时守护进程完成许多系统任务,如作业规划进程crond、打印进程lqd等。

2 避免守护进程本身的多个副本相互

干扰

守护进程通常占用固定的端口资源和其他一些它所需要的资源,如果系统中同时运行多个服务进程,则它们之间可能会相互干扰。为了避免这种干扰,我们可以使用某种互斥的手段,使得系统中没有两个相同的守护进程同时在运行。一种方法是每个进程在运行前先检测某个确定的文件是否存在,如

收稿日期:2007-10-22

作者简介:周超(1976-),女,讲师,华东理工大学在读硕士,从事计

算机操作系统的研究。

1 守护进程的编写

守护进程最重要的特性是在后台运行,与终端无连接,除非特殊情况下,用户不能直接操作守护进程。其次,守护进程必须与启动时的运行环境隔离开来,这些环境通常是从启动它的父进程中继承下来的。与运行环境的隔离可以保证守护进程的正常工作,避免产生一些不必要的错误。除此之外,守护进程与普通程序基本上没有什么区别,因此编写守护进程实际上是把一个普通程序按照一定的规则改—88

© 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net

果文件存在,则说明已经有一个守护进程运行了,进程将退出,否则它将继续运行。当进程退出后,它将删除这个文件。但如果系统异常崩溃,守护进程可能没有机会删除那个文件。要使守护进程正常运行,就需要在它运行之前将该文件删除。我们可以使用锁文件的方式取代判定创建文件的方式,两者的思路相似,因为对文件的加锁在系统崩溃时自动释放,所以加锁的方法更加安全。2.1 文件和记录的锁定Linux中提供两种给文件上锁的方式,给整个文件上锁和给文件的某个部分上锁(或称为记录上锁)。

(1)使用flock函数实现对整个文件的加锁#include

intflock(intfd,intoperation);

fd是需要加锁的文件的描述符,operation可以

来进行:首先填充结构中的参数,然后以匹配的方式打开文件,最后调用fcntl进行文件加锁。2.2 在锁文件中增加进程的进程号

这个操作不是守护进程所必须的,但它可以为系统管理者带来方便。因为一个负载很重的服务器运行的守护进程可能很多,当某个进程发生异常故障时,系统管理员可能需要一段时间,才能将错误准确地定位在某号进程上,但如果每个守护进程都将其进程号记录在锁文件中,在发生异常时,系统管理员就可以迅速地定位问题。2.3 修改init

daemon函数

可以对函数initdaemon进行修改,增加控制守护进程多个副本,以及在锁文件中记录守护进程号的工作。

 #includeLOCKFILE″/root/mylock.lock″ intinitdaemon(constchar3pathname,intfacility) {structsigactionact;intmaxfd,i,ret;intlockfd;charbuf[100];

lockfd=open(LOCKFILE,OAT,0640);

if(lockfd<0)exit(1);

ret=flock(lockfd,LOCKEXILOCKNB);

if(ret<0)

); {fprintf(stderr,″cannotobtainthefilelock\\n″

  exit(0);}ret=fork();if(ret<0)

);{fprintf(stderr,″errorinfirstfork\\n″exit(1);}

elseif(ret!=0)exit(0);ret=setsid();if(ret<0)exit(1);act.sa.handler=SINact.saflag=0;

sigaction(SIGHUP,&act,NULL);ret=fork();

if(ret<0)exit(1);elseif(ret!=0)exit(0););chdir(″/″

umask(0);setpgrp();

(下转第93页)

为下列值:

LOCKSH:共享锁,多个进程可以同时拥有对文件的共享锁。

LOCKEX:互斥锁,一个文件只能上一把互斥锁。LOCKUN:解锁操作。LOCKNB:如果进程不能获取指定的锁,函数

将不阻塞,缺省时,进程将睡眠等待。

这几个控制选项可以进行组合使用或操作。(2)使用fcntl函数函数fcntl提供更加完备的锁定功能,它可以支持对文件的部分锁定。函数fcntl将使用数据结构structflock。结构flock定义如下:

structflock{

RDWRIOCRE2

  shortltype;  shortlwhence;  offtlstart;  offtllen;  pidtlpid;};

在该结构中,ltype用于指定锁的类型,它可以是FRELCK,FWRLCK,FUNLCK,分别是共享锁(读锁)、互斥锁和解锁操作。lwhence指定如何使用lstart来设置锁定的起始位置,如果lwhence取SEEKSET,表示从lstart指定的位置作为锁定的起始位置;如果lwhence取SEEKCUR,表示锁定从当前文件指针的位置加上lstart开始;如果lwhence取SEEKEND,表示锁定从当前文件的结束位置加上lstart开始。11en表示锁定区域的长度。1pid表示进行锁定的进程的进程号。

使用fcntl进行文件加锁,通常按照下面的步骤

GIN;

—89

© 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net

参考文献:

制[J].电机与控制学报,2002,6(4):342-345.

图6 仿真结果

[4] 林长青,孙胜利.基于FPGA的多路高速数据采集系统[J].电

测与仪表,2005,42(473):52-54.

[5] 王玉辉.状态机在AΠD采样控制中的应用[J].电子元器件应

[1] 赵洪,王暄.基于CCD的XLPE电缆料杂质颗粒测量系统的研[2] 徐国盛.基于CCD扫描的缺陷检测数字化技术与边缘提取技

用,2006,8(10):26-27.

[6] 张伟功.用VHDL开发FPGA[J].微电子学与计算机,2001(2):

45-48.

术[D].哈尔滨理工大学硕士论文,2006:6-123.

[3] 刘卓夫,彭侠夫,李福义.FPGA在高速数据采集系统中的应用

[J].计算机工程,2003,29(10):166-167.(上接第89页)

责任编辑:张荣香

sprintf(buf,″%6d\\n″,getpid());

write(lockfd,buf,strlen(buf));

maxfd=sysconf(SCOPENMAX);for(i=0;iopenlog(pathname,LOGPID,facility);return0;

程,运行不必要或有漏洞的守护进程会给操作系统带来安全和性能上的影响。操作系统中的任何一个漏洞,都可能使整个系统受到攻击,如r字开头的守护进程rsh,rstatd,rsync这些命令都是远程命令,主要用来使一台计算机上的某个用户以相同的帐户远程执行另一台计算机的一个程序,已经被证实存在安全风险,所以应该关掉。参考文献:

[1] [美]JackTackttJrDavidGunter.Linux大全[M].3版.北京:电子

工业出版社,1999.

[2] SandraLoosemore,etal.TheGNUCLibraryReferenceManual[M].

 }

3 结束语

基于开放源代码的Linux给用户提供了这样一

个平台,可以根据自己的软硬件环境,定制和管理自己的Linux守护进程。此外,还要合理选择守护进

北京:机械工业出版社,2000.

[3] 张忠杰,田质广.编写Linux守护进程[J].山东轻工业学院学

报,2001,15(4):5-9.

[4] StevensWR.UNIX环境高级编程[M].尤晋元,译.北京:机械

工业出版社,2005.责任编辑:张荣香

—93

© 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net

因篇幅问题不能全部显示,请点此查看更多更全内容