- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第28讲 守护进程编程
Linux系统管理与开发守护进程开发 Copyright @2008 by shao-hui.Guan Pccw of china customization All rights reserved 本次课程内容 守护介绍 守护进程编程步骤 实例讲解 守护进程简介 守护进程是在后台运行,不受前台控制的的进程。他脱离终端,屏蔽由键盘产生的某些信号 守护进程设计步骤 忽略必要的信号 产生子进程,关闭父进程。 脱离控制终端,使进程成为会话组长。 转化目录到跟目录下面 关闭打开的文件描述符 重设文件掩码 处理sigchld信号,如果服务器生成子进程处理请求,如果父进程先退出,子 进程会成为僵尸进程,消耗资源。如果父进程等待子进程,增加父进程负担。 设计要点 1:调用fork产生一个子进程,同时父进程退出。我们所有后续工作都在子进程中完 成。这样做我们可以:如果我们是从命令行执行的该程序,这可以造成程序执行完 毕的假象,shell会回去等待下一条命令;刚刚通过fork产生的新进程一定不会是一 个进程组的组长,这为第2步的执行提供了前提保障。 这样做还会出现一种很有趣的现象:由于父进程已经先于子进程退出,会造成子进 程没有父进程,变成一个孤儿进程(orphan)。每当系统发现一个孤儿进程,就会 自动由1号进程收养它,这样,原先的子进程就会变成1号进程的子进程。 2:调用setsid系统调用。这是整个过程中最重要的一步。setsid的介绍见附录2,它的 作用是创建一个新的会话(session),并自任该会话的组长(session leader)。 如果调用进程是一个进程组的组长,调用就会失败,但这已经在第1步得到了保 证。调用setsid有3个作用: 让进程摆脱原会话的控制; 让进程摆脱原进程组的控制; 让进程摆脱原控制终端的控制; 总之,就是让调用进程完全独立出来,脱离所有其他进程的控制。 设计要点 3:把当前工作目录切换到根目录。如果我们是在一个临时加载的文件系统上执行这个 进程的,比如:/mnt/floppy/,该进程的当前工作目录就会是/mnt/floppy/。在整个进 程运行期间该文件系统都无法被卸下(umount),而无论我们是否在使用这个文件 系统,这会给我们带来很多不便。在这一步里,如果有特殊的需要,我们也可以把 当前工作目录换成其他的路径,比如/tmp。 4:将文件权限掩码设为0。这需要调用系统调用umask。每个进程都会从父进程那里 继承一个文件权限掩码,当创建新文件时,这个掩码被用于设定文件的默认访问权 限,屏蔽掉某些权限,如一般用户的写权限。当另一个进程用exec调用我们编写的 daemon程序时,由于我们不知道那个进程的文件权限掩码是什么,这样在我们创 建新文件时,就会带来一些麻烦。所以,我们应该重新设置文件权限掩码,我们可 以设成任何我们想要的值,但一般情况下,大家都把它设为0,这样,它就不会屏 蔽用户的任何操作。5:如果你的应用程序根本就不涉及创建新文件或是文件访问权限的设定,跳过这一 步。关闭所有不需要的文件。同文件权限掩码一样,我们的新进程会从父进程那里 继承一些已经打开了的文件。这些被打开的 文件可能永远不被我们的daemon进程 读或写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。 sample1 #include??unistd.h? #include??signal.h? #include??sys/param.h? #include??sys/types.h? #include??sys/stat.h? main( ) { ?? FILE? *fp ; ?? time_t ?t ;?? int?pid, i; ?? ?? if( (pid = fork())!= 0 ) ?? exit(0);//是父进程,结束父进程 ?? else
原创力文档


文档评论(0)