Linux中守护进程的创建及其程序设计方法

更新时间:2023-03-29 07:35:01 阅读量: 建筑文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

维普资讯 http://www.77cn.com.cn

第 1卷

第 2期

20 0 4年 6月

邵阳学院学报 (自然科学版) Jun l f ho a gUnvri N trl ce cs o ra o a yn ies y( aua S i e) S t n—

V0 . No. 1 1. 2

Jn20 u .04

文章编号:6 2—7 1 (0 4 0 17 0 0 2 0 )2—0 6 0 0—0 3

L n x中守护进程的创建及其程序设计方法 iu曾文飞(阳学院计算机中心,南邵阳 4 20 )邵湖 201 摘要:阐述了创建守护进程的方法及其注意事项,以 S C E并 O K T服务程序的守护进程程序示例详细分析了创建守护进程的程序设计方法与技巧 .关键词:守护进程;文件描述符;制终端控中图分类号: 3 1 1 TP 1 .文献标识码: A

Th e h d fCr a i g Da mo sa d P o r m mi g i n x e M t o so e tn e n n r g a n n Li u

Z ENG e W n— fi e

( o ue ea t n,S ay n iesy, n nS ay n 2 0 0 C mp trD p rmet h oa gUnvri Hu a h oa g 4 2 0 ) tAb ta tThsp p rI lb rtd h w o b i a mo sa d wh t h ud t adatn in t n d S sr c: i a e tea o ae o t ul d e n n a o l o p i te t o,a OCKET— sr iepo rm d s o evc r g a i sp o i e s a x m p e r vd a e a l. d n Ke r s d e n;i e tf r c n r lt r n l y wo d: a mo s f e i n i e; o t e mi a l d i o

守护进程 ( amos就是在后台运行而又无终端或登 D e n)录 se和它结合在一起的进程 .动守护进程最常用的方 hl l启法有: )引导系统时启动; )工地, se示符启 1在 2手从 hU提动;) c n守护进程启动; ) 3由 r d o 4由执行 at令启动 .个 c命一守护进程应该能够在所有的启动方式下被正确地执行 .因此,在设计守护进程时,须做到完全稳定且可靠,一问必唯

它认为处于打开状态的

文件描述符,实上它已不再能通事过这些文件描述符访问该终端 . 因此最简单的做法是关闭所有的文件描述符,它将使

守护进程和这些问题隔离开. c s(系统调用用在没有将 le ) o打开的文件描述符上不存在任何问题 .方法是:其#i ld n ue< sd aa!> c y pr . n hfr i;<NOFI E;+i o (=0 i L+ )

题是其中的一些启动方法使守护进程处于一种脆弱状态, 可能受到在它运行之前为它设置的环境的影响,以必须所把程序与这些环境影响隔离开,另外,准备作为守护进程使用的程序通常必须比普通的用户程序更可靠,得当它使作为守护进程运行时,即使出现各种类型的系统错误,也不至于引起程序的崩溃.以在设计守护进程时,以下所从几个方面着手 .

c ei; l () s o

符号常量 N F L给出一个进程一次可以打开的文 O IE件的最大个数 .

2甩开控制终端如果一个进程是从登录对话过程中被启动,则它将从对话过程中继承与它结合的控制中端,这对于守护进程来说,其结果是它可以接收由该控制终端所产生的信号,如

1关闭文件描述符关闭所有不必要的文件描述符 .如果守护进程留下一个普通文件处于打开状态,这将阻止该文件被任何其它进程从文件系统中删除,阻止包含该打开文件的已装配的也文件系统被卸下 .终端文件 (常是 s i、to ts e )在通 t n s u、t r d d dr的情况下,闭不必要的连接甚至更为重要,为当在该关因

果这些信号不被捕获,将结束该进程 .个问题可以由守这护进程忽略所有它可能忽略的信号而加以克服,但是这将阻止守护进程利用信号作为简单的进程问通信手段使用 .解决的办法是使守护进程本身和控制终端分离,得这些使信号首先传播到守护进程 .方法是:i (=oe (/e/ y, - D ff ( d pn“dvt” DR WR)>=0 t ) ){

终端上的用户退出系统后,执行 vag p )将 h nu (系统调用,守护进程访问该终端的权利将被撤消 .表示守护进程虽有这

收稿日期:0 3 9 l 2 0—0一 l

作者简介:曾文飞 (9 1 )男

, 17一,湖南洞口县人,师,讲程序员,研究方向:面向对象的程序设计,件工程软

维普资讯 http://www.77cn.com.cn

第 2期

曾文飞:i x Ln中守护进程的创建及其程序设计方法 u

6 l

i t f, OCNOT o l d TI c( TY, ) 0;

了详细的注释,读者对守护进程的设计方法有个比较清让晰的领会和理解 .#i c d n l e< s i.> u to h d# icu e< sr g h nl d ti .> n# icu e< s n 1 h n ld i a .> g# icu e< fn 1h> n ld c t.

coe f ) l (d; s}

这是因为在 Ln x iu下通过打开文件/e/ y并且使用 dvt, t it) o l在该文件上执行 TI C l TY命令, c( O N使得每一个具有控制终端的进程通过文件/e t访问该终端 . d t y

3改变工作目录在进程存在期间,内核 (e e) k r 1保存系统中任何进程 n打开的当前工作目录 .在正常情况下,不成一个问题,这但是如果该进程在已装配的文件系统中有一个当前工作目 录,则该文件系统被标志为“在使用(nue”态, i s)状 而且它不可以被卸下 .了允许系统超级用户 (ueue)下文为 sprs卸 r件系统,护进程可以执行:守cdr“”; h i/) (

# icu e< st .> n ld ej h mp

#i l e<sd aa h nu cd y pr m.># icu e“ o k i.” n ld s c l h b

#df e ( T 2 2/ ei ) 11 *服务程序的通信端口号 * nPR/#d -n ei eNA. XI f E T 0

df eN— E r T 1/ a l )数的 nx— ei A R AR *f a(函 n t et

at n数值 * co参 i/ j pb f n;/ m -u v e *为 st/ nj p储全局环境 * empl g存 j o m/na (od  ̄i v i) n

为了正确地进行操作,个守护进程也可能必须用一 cd (改变到一个特定的目录 . hi ) r如果所有文件都放在守护进程的当前工作目录中,时你不得不接收限制,者有这或系统管理员在根 (ot文件系统中提供守护进程可以运行 ro)的一个位置 .果将

当前工作目录改变到根 (ot目录可如 r ) o

{9 KET s p;

i d; nts

能出现一个问题,当守护进程结束运行和卸出一个核心 (oe文件时, cr)内核将试图打开在当前目录中的文件,时此操作将会失败,除非守护进程正在用超级用户的权限运行 .以为了克服这个问题,所使用/ l m p作为当前工作目录,这是因为它只是根文件系统中的一个子目录,且所有进并程都有写的权限: cdr“t p ) hi/”; ( r a

stp am n )/ e - e o (; *为守护进程工作重新设置操作 ud环境 */ s nlSC HID, I— N)/ i a( I, L SG I g C G; *为了无 zm i设 o be置 S GCⅡD */ I}

/ *创建服务程序的 sce * ok t/i (p o e( ):0 f S=spn ): ( )

f a“o e(”N - XT)/如果失败,出服务 a l spn ), A E I; * t(退程序 * / st (n )/创建 N - E T R入口点 * emp ev; * j AR S A T/

4重新设置文件的创建掩码进程一开始,继承它的双亲进程的文件创建掩码 .它

/ *重复地接收和服务客户的请求 * /f (;; o r )

典型地,它具有 0 2值, 2表示由守护进程创建的任何文件将不把写权限给组或其它用户,管守护进程本身规定什不么权限位 .如果将:但u s() mak 0; 包含在你的代码中,取消由双亲进程设置的文件创将

{i (d sre(pP R SD L )==~1 f s=s vrs,O T,- E Y ) ( e )

f a(s re (” N - E T R;/ a l s vr ), A R S A T) t“e *连接客户或者在失败时重新启动 * /

/用 F r (创建子女进程 * * ok )/s i h( r() wt f k ) c o {

建掩码值产生效果,无论它当前是什么值 .

5处理 S G HL信号 lC D有时守护进程被写成创建子女进程 .这种情况下,在 双亲进程保持循环接收更多客户连接,子女进程服务客而户的请求,时,亲进程不执行 w i )此双 a (系统调用等待它的 t

/ *在子女进程中处理客户请求 *

/cs a e0;

d -evc (d; osri s ) e

/ *处理 f k )败 * O (失 r/cs : a e l

子女进程的结束,子女进程默认地变成 zm i,到将而 o be直来某个进程 (可能是 i t等待它们为止 .时,o b很 n) i这 zm i e的创建浪费了系统资源, Ln x下有几种方法可以绕过这在 i u个问题,简单的方式是将 SG HL最 I C D信号的操作设置为 SG, N.体方法是: I I G具s n lS G i a( I CHL S G—GN) g D, I I;

c s(d; l es ) o

/重新启动下一个客户 * */f a“ r(”N - E R; a l f k ), A R S A T) t( o}

c s( )/ l es; *在双亲进程中,闭客户并进入下一 o d关个连接循环 */}

这是 S I D信号的特殊的特征,告诉内核 ( e—它 kr n1不从调用进程的子女进程中产生 zm i e ) ob. e

简单介绍了创建守护进程 ( am n ) D e os的基本原理之后,这里设计了一个简单的 S C E服务程序的守护进在 O K T

t

/这个函数负责将进程的工作环境修改为守护进程 *

程程序示例 .这是一个非常简单的文件传输守护进程,它在主机的 P T端口上创立并发的 sce眼务程序, OR okt按照请求从当前目录中传输任何文件 .其程序清单如下,作并

所要求的工作环境,即它关闭不必要的文件描述符 .它将本身和当前的控制终端、话过程以及进程组分离开,对并且修改当前的文件创建掩码 ./ *

维普资讯 http://www.77cn.com.cn

邵阳学院学报 (自然科学版 )

第l卷

e u-amo (o stpd e n vi) d

信的 sc e描述符 ./ ok t *d- ri ( t d os v ei ) e c ns

{iti n;

{i ti d; n,f c a * m r e hr an;

o (=0;<NOFI E;+i fri i L+ )

c s(;/关闭所有打开的文件描述符 */ l ei o ) * s th f k )/ wi ( r( ) *第一次 fr(调用 * c o ok )/{ cs 1/在第一次 f k )用中的错误 * a e: * o (调 r/ f a(stpd

e o (,S f k ), A E I ) a l eu -am n ) l r(”N - X T; t“ to df l/退出第一个双亲进程 * e ut a: */ei 0; xt ) (

c a, a e; h C n mln r

i r d s, a e, )=1 *获取文件名的长度 f e (&nml 1 ! (a d n )/*/

fa(nm e ed ), - X T; a l a l ra(”NAE I ) t“ n i (R e (hr) ao ( a e f 1I= ca m l nml ( ' ̄ l l c n+8 )=0 *为 )= )/

mme+”pn )分配空间 */ oe (”f a(m lc ), -XI ) a“ ao(”NAE T; t l l

cs:/在第一个子女进程 (二个双亲进程 ) a 0 e *第中继续 */ i( td ) f s s (一 e i调用 ei ) xt */ ( 1/启动新的对话过程,错误时 ) *在

/取得所要的文件名送入 nHe] * a l数组 * [/fri;<n ml;+i o (=0 i a e+ ) n

i r d s, a[] 1 !=1 f e (l ( a c&nmei, ) )f a“i aer d ), A E I; a ( fe B l e (” N—X T) t l lnT a

f a“ tpde o (, ti ), A E T; a l s u-am n ) s s (”N -XI ) t(e e d s i h f k )/第二次 f k ) w t ( r( ) * c o o (调用 * r/{

nI[]\ 0; * nI[成为一字符串 * a l i=’ n’/使 a l] I e I e/ i s crnme’’)/ f t h(a,/) *检查 n/e] (r B[是否在当前目录 n中 *| f a“l a fe a e, -XI; a l i g lmr” NAE T) t ( l l i n e i (=oe (a eO R O L )一 f f pn nm, - D N Y ) (d

cs:/在第二次 fr(中出错 */ a 1 e * ok )f a“ tp amo (,n r(”N -XI ) a (s u- e n )2 df k ), A E T; t e l d od fut ea l :

1,打开指 *

ei 0; *出第二个双亲进程 * x ()/退 t/ c e0/在第二个子女进程中继续 */ a: * s

定的文件 * /f a s ctnme”pn ) )N - X T; a (t a(a,o

(”, A E I ) t r l e

ta k O; *为 E R R. O ma ()/ s R O L G复位文件创建掩码 */ rtr/创建守护进程后返回 * eun; */} }

w i (i ed f,,) !=0 *把文件内容传输 hl (=r (&c1) e a d )/绘客产 *| ii f一 ( 1 ) f a“i d ), A E I; a (fe e (” N .X T) t l lr ae e f ies,,)=1 l ( t d&C1 ! s i wr ( ) f a“ re ), -X T) a (w t(” NAE I; t l i

l/通常, *当从守护进程调用的系统调用中返回错误条件时,调用这个子程序 .这个函数首先打印<tx>所指的 et信息,然后根据参数<n t co>的值, x ai e— tn或者终止该进程, 或者用 l g (重新启动它 ./ t (hr*t ti et o j ) n mp * f a ca a l e, t x— x nnat n ci ) o

ei 0; * x ( )/结束子女进程和对这个客户的连接 * t/}

说明:程序中第一项任务是关闭所有的文件描述在

{FI LE * f: p

i (=f e ( E O L G,a)==0 *打开 f f o n“ R R. O”…’) (p p )/

错误日志文件 * /ei 1; *里在失败时退出,报告错误 */ x ()/这 t不

fr t f,E rrn%s” t t;/显示错误信息 pi f p” r n( oi\n, ) * x e*l fl ef) c (; s o pi( e tat n==NA— E T fn x—ci o R S ART)

符,不管它们是否打开都这样做,接下来是将守护进程和它的控制终端、对话过程以及进程组分离开,并且阻止它将来重新获得另一个中断的可能,这些是用通常的 fr(, ok ) e i )f k ) s s (, r(序列完成, td o并嵌入到一对 s i h )构中, wt (结 c 使得它易于处理从 f k ) o (调用中返回的任何可能的错误 . r Fr( ok )调用返回三个不同的值:转向出错处理,向一1 0转子女进程,非零值转向双亲进程由 dfu:ae e l cs处理, at然后在第二个子女进程中调用 u s (将文件创建掩码设置为 mak ) 0这是因为在出现任何严重的错误时,,守护进程可能需要创

建 E I参考文献:

.(G文件 . L)

l g (n,)/重新启动调用进程 * o j ev 1; * n mp/es le

ei 1; * xt )/结束调用进程 * (//在子女进程中调用这个函数, *这个子女进程是当与个客户进程作出成功的连接时创建的,任务是服务客它

[][]akT ctJ ai G ne著 . i x大全 (三 1美 Jc akt r v utr Ln D d u第版 )M]电子工业出版社,99[ . 19 . [][]肿 a ̄ e著 .iu从 A l到精通[ . 2美 A nE ns h Lnx ' - J M]北京: 电子工业出版社,99 19 .

户的请求和监督所请求的文件传输,数<s>是用于通参 d

本文来源:https://www.bwwdw.com/article/xrun.html

Top