﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-Martin Ding's Garden Plot-随笔分类-Linux&amp;Unix</title><link>http://www.cnitblog.com/martin/category/2637.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 10:24:09 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 10:24:09 GMT</pubDate><ttl>60</ttl><item><title>[转]Linux下获取文件变更通知</title><link>http://www.cnitblog.com/martin/archive/2006/04/30/9951.html</link><dc:creator>Martin</dc:creator><author>Martin</author><pubDate>Sun, 30 Apr 2006 01:35:00 GMT</pubDate><guid>http://www.cnitblog.com/martin/archive/2006/04/30/9951.html</guid><wfw:comment>http://www.cnitblog.com/martin/comments/9951.html</wfw:comment><comments>http://www.cnitblog.com/martin/archive/2006/04/30/9951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/martin/comments/commentRss/9951.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/martin/services/trackbacks/9951.html</trackback:ping><description><![CDATA[From: http://www.cppblog.com/huyi/archive/2006/04/13/5462.aspx<br /><br />文章是在网上搜到的，我只是截取了其中一段。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);"> _GNU_SOURCE /* needed to get the defines */ </span><span style="color: rgb(0, 0, 0);"><br /><img id="Codehighlighter1_62_115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_115_Open_Text.style.display='none'; Codehighlighter1_62_115_Closed_Image.style.display='inline'; Codehighlighter1_62_115_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_62_115_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_62_115_Closed_Text.style.display='none'; Codehighlighter1_62_115_Open_Image.style.display='inline'; Codehighlighter1_62_115_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />#include </span><span id="Codehighlighter1_62_115_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">/**/</span><span id="Codehighlighter1_62_115_Open_Text"><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"> in glibc 2.2 this has the needed <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />values defined </span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 0, 0);"> <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" />#include <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" />#include <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" />#include <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">volatile</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> event_fd; <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 信号处理例程 </span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> handler(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> sig, siginfo_t </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">si, </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">data) <br /><img id="Codehighlighter1_249_275_Open_Image" onclick="this.style.display='none'; Codehighlighter1_249_275_Open_Text.style.display='none'; Codehighlighter1_249_275_Closed_Image.style.display='inline'; Codehighlighter1_249_275_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_249_275_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_249_275_Closed_Text.style.display='none'; Codehighlighter1_249_275_Open_Image.style.display='inline'; Codehighlighter1_249_275_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_249_275_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_249_275_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />event_fd </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> si</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">si_fd; <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: rgb(0, 0, 0);"> <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main(</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">) <br /><img id="Codehighlighter1_295_807_Open_Image" onclick="this.style.display='none'; Codehighlighter1_295_807_Open_Text.style.display='none'; Codehighlighter1_295_807_Closed_Image.style.display='inline'; Codehighlighter1_295_807_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_295_807_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_295_807_Closed_Text.style.display='none'; Codehighlighter1_295_807_Open_Image.style.display='inline'; Codehighlighter1_295_807_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_295_807_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_295_807_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">struct</span><span style="color: rgb(0, 0, 0);"> sigaction act; <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> fd; <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 登记信号处理例程 </span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">act.sa_sigaction </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> handler; <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />sigemptyset(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">act.sa_mask); <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />act.sa_flags </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> SA_SIGINFO; <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />sigaction(SIGRTMIN, </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">act, NULL); <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 需要了解当前目录"."的情况 </span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">fd </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> open(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, O_RDONLY); <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />fcntl(fd, F_SETSIG, SIGRTMIN); <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />fcntl(fd, F_NOTIFY, DN_MODIFY</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">DN_CREATE</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">DN_MULTISHOT); <br /><img id="Codehighlighter1_598_691_Open_Image" onclick="this.style.display='none'; Codehighlighter1_598_691_Open_Text.style.display='none'; Codehighlighter1_598_691_Closed_Image.style.display='inline'; Codehighlighter1_598_691_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_598_691_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_598_691_Closed_Text.style.display='none'; Codehighlighter1_598_691_Open_Image.style.display='inline'; Codehighlighter1_598_691_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_598_691_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">/**/</span><span id="Codehighlighter1_598_691_Open_Text"><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"> we will now be notified if any of the files <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />in "." is modified or new files are created </span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 0, 0);"> <br /><img id="Codehighlighter1_704_804_Open_Image" onclick="this.style.display='none'; Codehighlighter1_704_804_Open_Text.style.display='none'; Codehighlighter1_704_804_Closed_Image.style.display='inline'; Codehighlighter1_704_804_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_704_804_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_704_804_Closed_Text.style.display='none'; Codehighlighter1_704_804_Open_Image.style.display='inline'; Codehighlighter1_704_804_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">) </span><span id="Codehighlighter1_704_804_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_704_804_Open_Text"><span style="color: rgb(0, 0, 0);">{ <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 收到信号后，就会执行信号处理例程。 <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> 而 pause() 也就结束了。 </span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">pause(); <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" />printf(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Got event on fd=%d\n</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, event_fd); <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: rgb(0, 0, 0);"> <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: rgb(0, 0, 0);"> <br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" /></span></div><br />上
面这一小段例程，对于熟悉 Linux 系统编程的读者朋友们来说，是很容易理解的。程序首先注册一个信号处理例程，然后通知 Kernel，我要观察
fd 上的 DN_MODIFY 和 DN_CREATE 和 DN_MULTISHOT
事件。（关于这些事件的详细定义，请读者朋友们参阅文后所列的参考资料。） Linux Kernel 收到这个请求后，把相应的 fd 的
inode 给做上记号，然后 Linux Kernel 和用户应用程序就自顾自去处理各自的别的事情去了。等到 inode
上发生了相应的事件，Linux Kernel
就把信号发给用户进程，于是开始执行信号处理例程，用户程序对文件系统上的变化也就可以及时的做出反应了。而在这整个过程中，系统以及用户程序的正常运行
基本上未受到性能上的影响。这里还需要说明的是，dnotify 并没有通过增加新的系统调用来完成它的功能，而是通过 fcntl
来完成任务的。增加一个系统调用，相对来说是一个很大的手术，而且如果设计不当，处理得不好的话，伤疤会一直留在那里，这是 Linux Kernel
的开发者们所非常不愿意见到的事情。<img src ="http://www.cnitblog.com/martin/aggbug/9951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/martin/" target="_blank">Martin</a> 2006-04-30 09:35 <a href="http://www.cnitblog.com/martin/archive/2006/04/30/9951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Linux守护进程的编程方法</title><link>http://www.cnitblog.com/martin/archive/2006/04/30/9949.html</link><dc:creator>Martin</dc:creator><author>Martin</author><pubDate>Sun, 30 Apr 2006 01:29:00 GMT</pubDate><guid>http://www.cnitblog.com/martin/archive/2006/04/30/9949.html</guid><wfw:comment>http://www.cnitblog.com/martin/comments/9949.html</wfw:comment><comments>http://www.cnitblog.com/martin/archive/2006/04/30/9949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/martin/comments/commentRss/9949.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/martin/services/trackbacks/9949.html</trackback:ping><description><![CDATA[From: http://www.cppblog.com/tx7do/articles/5963.html<br /><p><br /></p><p><span class="Contents">守护进程（Daemon）是运行在后台的一种特殊进程。它独立于控制终端并且周期性地
执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如，Internet服务器
inetd，Web服务器httpd等。同时，守护进程完成许多系统任务。比如，作业规划进程crond，打印进程lpd等。 <br />守护进程的编程
本身并不复杂，复杂的是各种版本的Unix的实现机制不尽相同，造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意，照搬某些书上的规则
（特别是BSD4.3和低版本的System V）到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。 <br /><br />一． 守护进程及其特性 <br /><br />守
护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次，守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文
件描述符，控制终端，会话和进程组，工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程（特别是shell）中继承下来的。最后，守护
进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动，可以由作业规划进程crond启动，还可以由用户终端
（通常是shell）执行。<br /><br />总之，除开这些特殊性以外，守护进程与普通进程基本上没有什么区别。因此，编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果读者对进程有比较深入的认识就更容易理解和编程了。 <br /><br />二． 守护进程的编程要点 <br /><br />前
面讲过，不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样，区别在于具体的实现细节不同。这个原则就是要满足守护进
程的特性。同时，Linux是基于Syetem V的SVR4并遵循Posix标准，实现起来与BSD4相比更方便。编程要点如下； <br /><br /></span>1. 屏蔽一些有关控制终端操作的信号。<br />这是为了防止在守护进程没有正常运转起来时，控制终端受到干扰退出或挂起。示例如下：<br /></p><pre style="margin-left: 80px;"><ccid_code>signal(SIGTTOU,SIG_IGN); <br />signal(SIGTTIN,SIG_IGN); <br />signal(SIGTSTP,SIG_IGN); <br />signal(SIGHUP ,SIG_IGN);</ccid_code><br /></pre>　所有的信号都有自己的名字。这些名字都以“SIG”开头，只是后面有所不同。开发人员可以通过这些名字了解到系统中发生了什么事。当信号出现时，开发人员可以要求系统进行以下三种操作：<br /><p align="left">　忽略信号。大多数信号都是采取这种方式进行处理的，这里就采用了这种用法。但值得注意的是对SIGKILL和SIGSTOP信号不能做忽略处理。<br />　
捕捉信号。最常见的情况就是，如果捕捉到SIGCHID信号，则表示子进程已经终止。然后可在此信号的捕捉函数中调用waitpid()函数取得该子进程
的进程ID和它的终止状态。另外，如果进程创建了临时文件，那么就要为进程终止信号SIGTERM编写一个信号捕捉函数来清除这些临时文件。<br />　执行系统的默认动作。对绝大多数信号而言，系统的默认动作都是终止该进程。对这些有关终端的信号，一般采用忽略处理，从而保障了终端免受干扰。<br />　这类信号分别是，SIGTTOU（表示后台进程写控制终端）、SIGTTIN（表示后台进程读控制终端）、SIGTSTP（表示终端挂起）和SIGHUP（进程组长退出时向所有会议成员发出的）。 </p><span class="Contents">2. 在后台运行。 <br />为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止，让Daemon在子进程中后台执行。 <br /></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">if(pid=fork()) </span><br /><span class="Contents">exit(0);//是父进程，结束父进程，子进程继续 <br /><br /></span></div><span class="Contents"></span></div><span class="Contents">3. 脱离控制终端，登录会话和进程组 <br />有必要先介绍一下Linux中的进程与控制终端，登录会话和进程组之间的关系：进程属于一个进程组，进程组号（GID）就是进程组长的进程号（PID）。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 <br />控制终端，登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们，使之不受它们的影响。方法是在第1点的基础上，调用setsid()使进程成为会话组长： <br /></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">setsid(); </span><br /></div><span class="Contents"></span></div><span class="Contents">说明：当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后，进程成为新的会话组长和新的进程组长，并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性，进程同时与控制终端脱离。 <br /><br />4. 禁止进程重新打开控制终端 <br />现在，进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端： <br /></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">if(pid=fork()) </span><br /><span class="Contents">exit(0);//结束第一子进程，第二子进程继续（第二子进程不再是会话组长） <br /><br /></span></div><span class="Contents"></span></div><span class="Contents">5. 关闭打开的文件描述符 <br />进程从创建它的父进程那里继承了打开的文件描述符。如不关闭，将会浪费系统资源，造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们(NOFILE在头文件<sys>中定义)： <br /></sys></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">for(i=0;i &lt; NOFILE;i++)<br />close(i);<br /><br /></span></div><span class="Contents"></span></div><span class="Contents">6. 改变当前工作目录 <br />进程活动时，其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心，写运行日志的进程将工作目录改变到特定目录如/tmp：<br /></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">chdir("/tmp") <br /><br /></span></div><span class="Contents"></span></div><span class="Contents">7. 重设文件创建掩模 <br />进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点，将文件创建掩模清除：<br /></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">umask(0); <br /><br /></span></div><span class="Contents"></span></div><span class="Contents">8. 处理SIGCHLD信号 <br />处
理SIGCHLD信号并不是必须的。但对于某些进程，特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束，子进程将成为僵
尸进程（zombie）从而占用系统资源。如果父进程等待子进程结束，将增加父进程的负担，影响服务器进程的并发性能。在Linux下可以简单地将
SIGCHLD信号的操作设为SIG_IGN。 <br /></span><div style="margin-left: 40px;"><div style="margin-left: 40px;"><span class="Contents">signal(SIGCHLD,SIG_IGN); </span><br /></div><span class="Contents"></span></div><span class="Contents">这样，内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同，BSD4下必须显式等待子进程结束才能释放僵尸进程。</span><img src ="http://www.cnitblog.com/martin/aggbug/9949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/martin/" target="_blank">Martin</a> 2006-04-30 09:29 <a href="http://www.cnitblog.com/martin/archive/2006/04/30/9949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>