<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_宠辱不惊，闲看庭前花开花落；去留无意，漫随天外云卷云舒</title><subtitle type="text">记录及整理日常学习过程的遇到的觉得需要记录的信息,方便以后忘记时重新翻出来看看.</subtitle><id>http://feed.cnblogs.com/blog/u/42027/rss</id><updated>2012-03-19T23:13:52Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/42027/rss"/><entry><id>http://www.cnblogs.com/chenhs/archive/2012/01/14/2322193.html</id><title type="text">GCC</title><summary type="text">/Files/chenhs/gcc.7z</summary><published>2012-01-13T21:17:00Z</published><updated>2012-01-13T21:17:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2012/01/14/2322193.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2012/01/14/2322193.html"/><content type="html">&lt;a href="http://files.cnblogs.com/chenhs/gcc.7z"&gt;/Files/chenhs/gcc.7z&lt;/a&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2322193.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2012/01/14/2322193.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/11/14/2247751.html</id><title type="text">rtmpdata</title><summary type="text">/Files/chenhs/rtmpnew.rar</summary><published>2011-11-13T22:32:00Z</published><updated>2011-11-13T22:32:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/11/14/2247751.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/11/14/2247751.html"/><content type="html">&lt;a href="http://files.cnblogs.com/chenhs/rtmpnew.rar"&gt;/Files/chenhs/rtmpnew.rar&lt;/a&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2247751.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/11/14/2247751.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/11/06/2238445.html</id><title type="text">Environment</title><summary type="text">/Files/chenhs/EnvSet.rar</summary><published>2011-11-06T14:23:00Z</published><updated>2011-11-06T14:23:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/11/06/2238445.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/11/06/2238445.html"/><content type="html">&lt;a href="http://files.cnblogs.com/chenhs/EnvSet.rar"&gt;/Files/chenhs/EnvSet.rar&lt;/a&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2238445.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/11/06/2238445.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/10/31/2229739.html</id><title type="text">Bookmark</title><summary type="text">/Files/chenhs/bookmarks_1031.rar</summary><published>2011-10-30T22:38:00Z</published><updated>2011-10-30T22:38:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/10/31/2229739.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/10/31/2229739.html"/><content type="html">&lt;a href="http://files.cnblogs.com/chenhs/bookmarks_1031.rar"&gt;/Files/chenhs/bookmarks_1031.rar&lt;/a&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2229739.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/10/31/2229739.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/08/15/2138642.html</id><title type="text">一些杂的网站</title><summary type="text">http://www.mydigit.net/http://www.immsky.com/http://www.jdwx.info/thread-30291-1-1.htmlhttp://dynamorio.googlecode.com/svn-history/trunk/http://www.deepin.org/home.phphttp://user.qzone.qq.com/470320752/blog/1259827504http://www.lib.ctu.edu.tw/98index/index/http://www.fdcview.com/</summary><published>2011-08-14T23:26:00Z</published><updated>2011-08-14T23:26:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/08/15/2138642.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/08/15/2138642.html"/><content type="html">&lt;a href="http://www.mydigit.net/"&gt;http://www.mydigit.net/&lt;/a&gt;&lt;div&gt;&lt;a href="http://www.immsky.com/"&gt;http://www.immsky.com/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.jdwx.info/thread-30291-1-1.html"&gt;http://www.jdwx.info/thread-30291-1-1.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dynamorio.googlecode.com/svn-history/trunk/"&gt;http://dynamorio.googlecode.com/svn-history/trunk/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.deepin.org/home.php"&gt;http://www.deepin.org/home.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://user.qzone.qq.com/470320752/blog/1259827504"&gt;http://user.qzone.qq.com/470320752/blog/1259827504&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.lib.ctu.edu.tw/98index/index/"&gt;http://www.lib.ctu.edu.tw/98index/index/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.fdcview.com/"&gt;http://www.fdcview.com/&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2138642.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/08/15/2138642.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/08/14/2138419.html</id><title type="text">C语言运算符表</title><summary type="text">C语言运算符表运算符按照优先级大小由上向下排列，在同一行的运算符具有相同优先级。第二行是所有的一元运算符。运算符解释结合方式() [] -&gt; .括号（函数等），数组，两种结构成员访问由左向右! ~ ++ -- + -* &amp; (类型) sizeof否定，按位否定，增量，减量，正负号，间接，取地址，类型转换，求大小由右向左* / %乘，除，取模由左向右+ -加，减由左向右&lt;&lt; &gt;&gt;左移，右移由左向右&lt; &lt;= &gt;= &gt;小于，小于等于，大于等于，大于由左向右== !=等于，不等于由左向右&amp;按位与由左向右^按位异或由左向右|按位或由左</summary><published>2011-08-14T12:51:00Z</published><updated>2011-08-14T12:51:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/08/14/2138419.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/08/14/2138419.html"/><content type="html">&lt;div&gt;&lt;span style="font-family: Simsun; line-height: normal; font-size: medium; "&gt;&lt;strong&gt;C语言运算符表&lt;/strong&gt;&lt;p&gt;运算符按照优先级大小由上向下排列，在同一行的运算符具有相同优先级。第二行是所有的一元运算符。&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;table border="" cellspacing="2" width="622" bordercolor="#000000"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;&lt;center&gt;运算符&lt;/center&gt;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;&lt;center&gt;解释&lt;/center&gt;&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;结合方式&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;() [] -&amp;gt; .&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;括号（函数等），数组，两种结构成员访问&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;! ~ ++ -- + -&amp;nbsp;&lt;p&gt;* &amp;amp; (类型) sizeof&lt;/p&gt;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;否定，按位否定，增量，减量，正负号，&lt;p&gt;间接，取地址，类型转换，求大小&lt;/p&gt;&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由右向左&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;* / %&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;乘，除，取模&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;+ -&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;加，减&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;左移，右移&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;&amp;lt; &amp;lt;= &amp;gt;= &amp;gt;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;小于，小于等于，大于等于，大于&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;== !=&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;等于，不等于&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;&amp;amp;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;按位与&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;^&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;按位异或&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;|&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;按位或&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;&amp;amp;&amp;amp;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;逻辑与&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;||&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;逻辑或&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;? :&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;条件&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由右向左&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;= += -= *= /=&amp;nbsp;&lt;p&gt;&amp;amp;= ^= |= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;=&lt;/p&gt;&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;各种赋值&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由右向左&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="TOP" width="31%"&gt;,&lt;/td&gt;&lt;td valign="TOP" width="52%"&gt;逗号（顺序）&lt;/td&gt;&lt;td valign="TOP" width="17%"&gt;&lt;center&gt;由左向右&lt;/center&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2138419.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/08/14/2138419.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/08/14/2138084.html</id><title type="text">计算机软考资料</title><summary type="text">工业和信息化部教育与考试中心http://www.ceiaec.org/index.htm工业和信息化部全国信息技术人才培训广东省管理中心http://www.gdceiaec.org/index.asp广东省电子信息应用教育中心http://www.gdie.org/深圳考试学院http://www.testcenter.gov.cn/</summary><published>2011-08-14T10:04:00Z</published><updated>2011-08-14T10:04:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/08/14/2138084.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/08/14/2138084.html"/><content type="html">&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; line-height: normal; font-size: 16px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "&gt;&lt;a href="http://www.ceiaec.org/index_zxjj.html" style="color: #000000; text-decoration: none; "&gt;&lt;span style="font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;工业和信息化部教育与考试中心&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.ceiaec.org/index.htm"&gt;&lt;span style="font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;http://www.ceiaec.org/index.htm&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;span class="Apple-style-span" style="font-family: 宋体; line-height: normal; font-size: 12px; "&gt;&lt;span style="color: black; font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;工业和信息化&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: normal; font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;部全国信息技术人才培训广东省管理中心&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.gdceiaec.org/index.asp"&gt;&lt;span style="font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;http://www.gdceiaec.org/index.asp&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;span class="Apple-style-span" style="line-height: normal; color: #69562e; font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;广东省电子信息应用教育中心&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.gdie.org/"&gt;&lt;span style="font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;http://www.gdie.org/&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;&amp;nbsp;深圳考试学院&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;a href="http://www.testcenter.gov.cn/"&gt;&lt;span style="font-size: 14pt; font-family: Arial; "&gt;&lt;strong&gt;http://www.testcenter.gov.cn/&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2138084.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/08/14/2138084.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/06/17/2083253.html</id><title type="text">fork两次如何避免僵尸进程</title><summary type="text">曾经觉得费解，温故知新一下：/*g++ -o New0001 New0001.cpp */#include &lt;stdio.h&gt;#include &lt;sys/wait.h&gt;#include &lt;sys/types.h&gt;#include &lt;unistd.h&gt;int main(void){ pid_t pid; if ((pid = fork()) &lt; 0) { fprintf(stderr,"Fork error!\n"); exit(-1); } else if (pid == 0) /* first child */ { i</summary><published>2011-06-16T21:47:00Z</published><updated>2011-06-16T21:47:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/06/17/2083253.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/06/17/2083253.html"/><content type="html">&lt;span style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "&gt;&lt;p&gt;曾经觉得费解，温故知新一下：&lt;/p&gt;&lt;p&gt;/*g++ -o New0001 New0001.cpp */&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/p&gt;&lt;p&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; pid_t pid;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pid = fork()) &amp;lt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr,"Fork error!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (pid == 0) /* first child */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((pid = fork()) &amp;lt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr,"Fork error!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (pid &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(0); /* parent from second fork == first child */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * We're the second child; our parent becomes init as soon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * as our real parent calls exit() in the statement above.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Here's where we'd continue executing, knowing that when&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * we're done, init will reap our status.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sleep(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Second child, parent pid = %d\n", getppid());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (waitpid(pid, NULL, 0) != pid) /* wait for first child */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr,"Waitpid error!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * We're the parent (the original process); we continue executing,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * knowing that we're not the parent of the second child.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(0);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;fork两次在防止僵死方面来说，就是因为儿子进程先退出，孙子进程就被init接管了，实际上与最初的父进程脱离了关系，就不会僵死了。见APUE 的P151以下描述：&lt;/p&gt;&lt;p&gt;回忆一下8 . 5节中有关僵死进程的讨论。如果一个进程要f o r k一个子进程，但不要求它等待&lt;br /&gt;子进程终止，也不希望子进程处于僵死状态直到父进程终止，实现这一要求的诀窍是调用f o r k&lt;br /&gt;两次。程序8 - 5实现了这一点。&lt;br /&gt;在第二个子进程中调用s l e e p以保证在打印父进程I D时第一个子进程已终止。在f o r k之后，&lt;br /&gt;父、子进程都可继续执行&amp;#8212;&amp;#8212;我们无法预知哪一个会先执行。如果不使第二个子进程睡眠，则&lt;br /&gt;在f o r k之后，它可能比其父进程先执行，于是它打印的父进程I D将是创建它的父进程，而不是&lt;br /&gt;i n i t进程（进程ID 1）。&lt;br /&gt;&lt;br /&gt;两次fork的其它作用就是做daemon：&lt;/p&gt;&lt;p&gt;void InitAsDaemon()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;if (Fork() &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;exit(0);&lt;/p&gt;&lt;p&gt;&amp;nbsp;setsid();&lt;/p&gt;&lt;p&gt;&amp;nbsp;Signal(SIGINT, SIG_IGN);&lt;br /&gt;&amp;nbsp;Signal(SIGHUP, SIG_IGN);&lt;br /&gt;&amp;nbsp;Signal(SIGQUIT, SIG_IGN);&lt;br /&gt;&amp;nbsp;Signal(SIGPIPE, SIG_IGN);&lt;br /&gt;&amp;nbsp;Signal(SIGTTOU, SIG_IGN);&lt;br /&gt;&amp;nbsp;Signal(SIGTTIN, SIG_IGN);&lt;br /&gt;&amp;nbsp;Signal(SIGCHLD, SIG_IGN);&lt;/p&gt;&lt;p&gt;&amp;nbsp;if (Fork() &amp;gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;exit(0);&lt;/p&gt;&lt;p&gt;&amp;nbsp;chdir("/");&lt;br /&gt;&amp;nbsp;umask(0);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;关于僵尸进程：&lt;/p&gt;&lt;p&gt;在fork()/execve()过程中，假设子进程结束时父进程仍存在，而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束，又没有显式忽略该信号，则子进程成为僵尸进程，无法正常结束，此时即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在)，僵尸进程成为"孤儿进程"，过继给1号进程init，init始终会负责清理僵尸进程。&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;div id="lemmaContent"&gt;&lt;div&gt;&lt;/div&gt;僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;怎样产生僵尸进程的：&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;一个进程在调用exit命令结束自己的生命的时候，其实它并没有真正的被销毁，而是留下一个称为僵尸进程（Zombie）的数据结构（系统调用exit，它的作用是使进程退出，但也仅仅限于将一个正常的进程变成一个僵尸进程，并不能将其完全销毁）。在Linux进程的状态中，僵尸进程&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;是非常特殊的一种，它已经放弃了几乎所有内存空间，没有任何可执行代码，也不能被调度，仅仅在进程列表中保留一个位置，记载该进程的退&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;出状态等信息供其他进程收集，除此之外，僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸，如果他的父进程没安装SIGCHLD信&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;号处理函数调用wait或waitpid()等待子进程结束，又没有显式忽略该信号，那么它就一直保持僵尸状态，如果这时父进程结束了，那么init进程自动&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;会接手这个子进程，为它收尸，它还是能被清除的。但是如果如果父进程是一个循环，不会结束，那么子进程就会一直保持僵尸状态，这就是为什么系统中有时会有很多的僵尸进程。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;怎么查看僵尸进程：&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;利用命令ps，可以看到有标记为Z的进程就是僵尸进程。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;怎样来清除僵尸进程：&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;1.改写父进程，在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后，会发送SIGCHLD信号给父进程，父进程收到此信号后，执行waitpid()函数为子进程收尸。这是基于这样的原理：就算父进程没有调用wait，内核也会向它发送SIGCHLD消息，尽管对的默认处理是忽略，如果想响应这个消息，可以设置一个处理函数。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;2.把父进程杀掉。父进程死后，僵尸进程成为"孤儿进程"，过继给1号进程init，init始终会负责清理僵尸进程．它产生的所有僵尸进程也跟着消失。&lt;br /&gt;&lt;div&gt;&lt;/div&gt;===========================================&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;在Linux中可以用&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;ps auwx&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;发现僵尸进程&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;a all w/ tty, including other users 所有窗口和终端，包括其他用户的进程&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;u user-oriented 面向用户(用户友好)&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;-w,w wide output 宽格式输出&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;x processes w/o controlling ttys&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;在僵尸进程后面 会标注&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;ps axf&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;看进程树，以树形方式现实进程列表&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;ps axm&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;会把线程列出来,在linux下进程和线程是统一的，是轻量级进程的两种方式。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;ps axu&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;显示进程的详细状态&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;===========================================&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;killall&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;kill -15&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;kill -9&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;一般都不能杀掉 defunct进程&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;用了kill -15,kill -9以后 之后反而会多出更多的僵尸进程&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;kill -kill pid&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;fuser -k pid&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;可以考虑杀死他的parent process，&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;kill -9 他的parent process&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;===========================================&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;一个已经终止,但是其父进程尚未对其进行善后处理（获取终止子进程的有关信息、释放它仍占用的资源）的进程被称为僵死进程(Zombie Process)。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;避免zombie的方法：&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;1)在SVR4中，如果调用signal或sigset将SIGCHLD的配置设置为忽略,则不会产生僵死子进程。另外,使用SVR4版的sigaction,则可设置SA_NOCLDWAIT标志以避免子进程僵死。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;Linux中也可使用这个，在一个程序的开始调用这个函数&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;signal(SIGCHLD,SIG_IGN);&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;2)调用fork两次。程序8 - 5 实现了这一点。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;3)用waitpid等待子进程返回.&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;===========================================&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;zombie进程是僵死进程。防止它的办法，一是用wait,waitpid之类的函数获得&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;进程的终止状态，以释放资源。另一个是fork两次&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;===========================================&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;defunct进程只是在process table里还有一个记录，其他的资源没有占用，除非你的系统的process个数的限制已经快超过了，zombie进程不会有更多的坏处。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;可能唯一的方法就是reboot系统可以消除zombie进程。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;===========================================&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;任何程序都有僵尸状态，它占用一点内存资源(也就是进程表里还有一个记录)，仅仅是表象而已不必害怕。如果程序有问题有机会遇见，解决大批量僵尸简单有效的办法是重起。kill是无任何效果的&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;fork与zombie/defunct"&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;在Unix下的一些进程的运作方式。当一个进程死亡时,它并不是完全的消失了。进程终止,它不再运行,但是还有一些残留的小东西等待父进程收回。这些残留的东西包括子进程的返回值和其他的一些东西。当父进程 fork() 一个子进程后,它必须用 wait() 或者 waitpid() 等待子进程退出。正是这个 wait() 动作来让子进程的残留物消失。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;自然的，在上述规则之外有个例外:父进程可以忽略 SIGCLD 软中断而不必要 wait()。可以这样做到(在支持它的系统上,比如Linux):&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;main()&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;{&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;signal(SIGCLD, SIG_IGN); /* now I don't have to wait()! */&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;.&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;.&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;fork();&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;fork();&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;fork(); /* Rabbits, rabbits, rabbits! */&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;｝&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;现在，子进程死亡时父进程没有 wait()，通常用 ps 可以看到它被显示为&amp;#8220;&amp;#8221;。它将永远保持这样 直到 父进程 wait()，或者按以下方法处理。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;这里是你必须知道的另一个规则:当父进程在它wait()子进程之前死亡了(假定它没有忽略 SIGCLD),子进程将把 init(pid 1)进程作为它的父进程。如果子进程工作得很好并能够控制，这并不是问题。但如果子进程已经是 defunct，我们就有了一点小麻烦。看，原先的父进程不可能再 wait()，因为它已经消亡了。这样，init 怎么知道 wait() 这些 zombie 进程。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;答案：不可预料的。在一些系统上，init周期性的破坏掉它所有的defunct进程。在另外一些系统中,它干脆拒绝成为任何defunct进程的父进程，而是马上毁灭它们。如果你使用上述系统的一种,可以写一个简单的循环，用属于init的defunct进程填满进程表。这大概不会令你的系统管理员很高兴吧?&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;你的任务：确定你的父进程不要忽略 SIGCLD，也不要 wait() 它 fork() 的所有进程。不过，你也未必 要 总是这样做（比如，你要起一个 daemon 或是别的什么东西）,但是你必须小心编程，如果你是一个 fork() 的新手。另外，也不要在心理上有任何束缚。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;总结：&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;子进程成为 defunct 直到父进程 wait()，除非父进程忽略了 SIGCLD 。&amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;更进一步，父进程没有 wait() 就消亡（仍假设父进程没有忽略 SIGCLD ）的子进程（活动的或者 defunct）成为 init 的子进程，init 用重手法处理它们。&lt;/div&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2083253.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/06/17/2083253.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/06/14/2080230.html</id><title type="text">深圳市职业技能鉴定报名</title><summary type="text">窗口名称：深圳市职业技能鉴定报名中心业务范围：深圳市职业技能鉴定报名具体流程为：1.报考者按自己实际情况填好《职业技能鉴定报名卡》2.报考者向窗口工作人员提交《职业技能鉴定报名卡》和相关证件3.窗口工作人员根据报考条件审核报考者报名资格4.窗口工作人员将符合条件报考者的《职业技能鉴定报名卡》资料转入电脑5. 窗口工作人员对报考者现场摄像并打印出准考证6.在准考证加盖公章后发放给报考者2008深圳招调工考试报名地点：1.深圳市福田区八卦二路612栋劳动就业大厦45-48号窗口2.福强路1007号高级技工学校附楼一楼，咨询电话0755-89805511。（站台：市第一技校，联合广场）一、考试时间：</summary><published>2011-06-13T22:58:00Z</published><updated>2011-06-13T22:58:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/06/14/2080230.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/06/14/2080230.html"/><content type="html">&lt;div&gt;&lt;span style="font-family: Verdana, Helvetica, Arial, sans-serif; line-height: 22px; border-collapse: collapse; color: #444444; "&gt;窗口名称：深圳市职业技能鉴定报名中心&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;业务范围：深圳市职业技能鉴定报名&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;具体流程为：&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;1.报考者按自己实际情况填好《职业技能鉴定报名卡》&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;2.报考者向窗口工作人员提交《职业技能鉴定报名卡》和相关证件&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;3.窗口工作人员根据报考条件审核报考者报名资格&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;4.窗口工作人员将符合条件报考者的《职业技能鉴定报名卡》资料转入电脑&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;5. 窗口工作人员对报考者现场摄像并打印出准考证&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;6.在准考证加盖公章后发放给报考者&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;br style="word-wrap: break-word; line-height: normal; " /&gt;&lt;p align="left" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "&gt;&lt;/p&gt;&lt;p align="left" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "&gt;&lt;strong style="word-wrap: break-word; text-align: left; font-style: normal; line-height: normal; font-weight: bold; "&gt;2008深圳招调工考试报名地点：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="left" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "&gt;&lt;/p&gt;&lt;p align="left" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "&gt;1.深圳市福田区八卦二路612栋劳动就业大厦45-48号窗口&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p align="left" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "&gt;&lt;/p&gt;&lt;p align="left" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: normal; "&gt;2.福强路1007号高级技工学校附楼一楼，咨询电话0755-89805511。（站台：市第一技校，联合广场）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; line-height: 30px; font-size: 18px; "&gt;一、考试时间：报考时间：&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;5&lt;/span&gt;月&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;20&lt;/span&gt;日&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;-6&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;月5&lt;/span&gt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;日&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="border-collapse: separate; color: #000000; font-family: Simsun; line-height: 30px; "&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;考试时间：&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;6&lt;/span&gt;月&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;11&lt;/span&gt;日起&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;二、报考地点：&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;1&lt;/span&gt;、福田区八卦二路&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;612&lt;/span&gt;栋劳动就业大厦&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;45&lt;/span&gt;－&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;48&lt;/span&gt;号窗口；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;、福强路&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;1007&lt;/span&gt;号市高级技工学校附楼一楼；&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;三、考试地点：&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;1&lt;/span&gt;、高训大厦（准考证上注明）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;2&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;、协和电子职业技能鉴定中心（准考证上注明）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;四、报考凭证：身份证原件、复印件&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13.5pt; color: black; "&gt;五、考试凭证：身份证&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;+&lt;/span&gt;准考证&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2080230.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/06/14/2080230.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chenhs/archive/2011/06/13/2080050.html</id><title type="text">Windows下Critical Section、Event、Mutex、Semaphores区别</title><summary type="text">Windows下Critical Section、Event、Mutex、Semaphores区别2008年05月30日 星期五 上午 10:14临界区（Critical Section） 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区，那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起，并一直持续到进入临界区的线程离开。临界区在被释放后，其他线程可以继续抢占，并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语： EnterCriticalSection（） 进入临界区 LeaveCritic</summary><published>2011-06-13T12:54:00Z</published><updated>2011-06-13T12:54:00Z</updated><author><name>大熊猫</name><uri>http://www.cnblogs.com/chenhs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chenhs/archive/2011/06/13/2080050.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chenhs/archive/2011/06/13/2080050.html"/><content type="html">&lt;div&gt;&lt;span style="font-family: Arial; line-height: 18px; font-size: 12px; color: #425458; "&gt;&lt;div style="font-family: Tahoma; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 14px; line-height: 20px !important; font-weight: bold; color: #425458; text-align: left; background-image: url(http://imgsrc.baidu.com/css/pic/item/ed99b706c49bdd41020881b8.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; height: 50px; padding-top: 7px; padding-right: 0px; padding-bottom: 0px; padding-left: 50px; overflow-x: hidden; overflow-y: hidden; background-position: initial initial; background-repeat: no-repeat no-repeat; "&gt;Windows下Critical Section、Event、Mutex、Semaphores区别&lt;/div&gt;&lt;div style="font-family: Tahoma; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 10px; line-height: 20px !important; margin-top: -26px; margin-right: 0px; margin-bottom: 8px; margin-left: 50px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #425458; text-align: left; "&gt;2008年05月30日 星期五 上午 10:14&lt;/div&gt;&lt;table style="line-height: 20px !important; table-layout: fixed; width: 818px; "&gt;&lt;tbody style="line-height: 20px !important; "&gt;&lt;tr style="line-height: 20px !important; "&gt;&lt;td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px !important; "&gt;&lt;div id="blog_text" style="font-family: Georgia; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px; color: #425458; letter-spacing: 2px; overflow-x: hidden; overflow-y: hidden; position: static; "&gt;&lt;p&gt;临界区（Critical Section）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区，那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起，并一直持续到进入临界区的线程离开。临界区在被释放后，其他线程可以继续抢占，并以此达到用原子方式操作共享资源的目的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 临界区包含两个操作原语： EnterCriticalSection（） 进入临界区 LeaveCriticalSection（） 离开临界区&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EnterCriticalSection（）语句执行后代码将进入临界区以后无论发生什么，必须确保与之匹配的LeaveCriticalSection（）都能够被执行到。否则临界区保护的共享资源将永远不会被释放。在使用临界区时，一般不允许其运行时间过长，只要进入临界区的线程还没有离开，其他所有试图进入此临界区的线程都会被挂起而进入到等待状态，并会在一定程度上影响。程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区。如果进入了临界区却一直没有释放，同样也会引起其他线程的长时间等待。换句话说，在执行了EnterCriticalSection（）语句进入临界区后无论发生什么，必须确保与之匹配的LeaveCriticalSection（）都能够被执行到。可以通过添加结构化异常处理代码来确保LeaveCriticalSection（）语句的执行。虽然临界区同步速度很快，但却只能用来同步本进程内的线程，而不可用来同步多个进程中的线程。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MFC提供了很多功能完备的类，我用MFC实现了临界区。MFC为临界区提供有一个CCriticalSection类，使用该类进行线程同步处理是非常简单的。只需在线程函数中用CCriticalSection类成员函数Lock（）和UnLock（）标定出被保护代码片段即可。Lock（）后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。&lt;/p&gt;&lt;p&gt;互斥量（Mutex）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 互斥（Mutex）是一种用途非常广泛的内核对象。能够保证多个线程对同一共享资源的互斥访问。同临界区有些类似，只有拥有互斥对象的线程才具有访问资源的权限，由于互斥对象只有一个，因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出，以便其他线程在获得后得以访问资源。与其他几种内核对象不同，互斥对象在操作系统中拥有特殊代码，并由操作系统来管理，操作系统甚至还允许其进行一些其他内核对象所不能进行的非常规操作。 互斥量跟临界区很相似，只有拥有互斥对象的线程才具有访问资源的权限，由于互斥对象只有一个，因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出，以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享，而且可以在不同应用程序的线程之间实现对资源的安全共享。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 　以互斥内核对象来保持线程同步可能用到的函数主要有CreateMutex（）、OpenMutex（）、ReleaseMutex（）、WaitForSingleObject（）和WaitForMultipleObjects（）等。在使用互斥对象前，首先要通过CreateMutex（）或OpenMutex（）创建或打开一个互斥对象。CreateMutex（）函数原型为：&lt;/p&gt;&lt;p&gt;HANDLE CreateMutex(&lt;br style="line-height: normal; " /&gt;　LPSECURITY_ATTRIBUTES lpMutexAttributes, // 安全属性指针&lt;br style="line-height: normal; " /&gt;　BOOL bInitialOwner, // 初始拥有者&lt;br style="line-height: normal; " /&gt;　LPCTSTR lpName // 互斥对象名&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;参数bInitialOwner主要用来控制互斥对象的初始状态。一般多将其设置为FALSE，以表明互斥对象在创建时并没有为任何线程所占有。如果在创建互斥对象时指定了对象名，那么可以在本进程其他地方或是在其他进程通过OpenMutex（）函数得到此互斥对象的句柄。OpenMutex（）函数原型为：&lt;/p&gt;&lt;p&gt;HANDLE OpenMutex(&lt;br style="line-height: normal; " /&gt;　DWORD dwDesiredAccess, // 访问标志&lt;br style="line-height: normal; " /&gt;　BOOL bInheritHandle, // 继承标志&lt;br style="line-height: normal; " /&gt;　LPCTSTR lpName // 互斥对象名&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;当目前对资源具有访问权的线程不再需要访问此资源而要离开时，必须通过ReleaseMutex（）函数来释放其拥有的互斥对象，其函数原型为：&lt;/p&gt;&lt;p&gt;BOOL ReleaseMutex(HANDLE hMutex);&lt;/p&gt;&lt;p&gt;其唯一的参数hMutex为待释放的互斥对象句柄。至于WaitForSingleObject（）和WaitForMultipleObjects（）等待函数在互斥对象保持线程同步中所起的作用与在其他内核对象中的作用是基本一致的，也是等待互斥内核对象的通知。但是这里需要特别指出的是：在互斥对象通知引起调用等待函数返回时，等待函数的返回值不再是通常的WAIT_OBJECT_0（对于WaitForSingleObject（）函数）或是在WAIT_OBJECT_0到WAIT_OBJECT_0+nCount-1之间的一个值（对于WaitForMultipleObjects（）函数），而是将返回一个WAIT_ABANDONED_0（对于WaitForSingleObject（）函数）或是在WAIT_ABANDONED_0到WAIT_ABANDONED_0+nCount-1之间的一个值（对于WaitForMultipleObjects（）函数）。以此来表明线程正在等待的互斥对象由另外一个线程所拥有，而此线程却在使用完共享资源前就已经终止。除此之外，使用互斥对象的方法在等待线程的可调度性上同使用其他几种内核对象的方法也有所不同，其他内核对象在没有得到通知时，受调用等待函数的作用，线程将会挂起，同时失去可调度性，而使用互斥的方法却可以在等待的同时仍具有可调度性，这也正是互斥对象所能完成的非常规操作之一。&lt;/p&gt;&lt;p&gt;在编写程序时，互斥对象多用在对那些为多个线程所访问的内存块的保护上，可以确保任何线程在处理此内存块时都对其拥有可靠的独占访问权。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 互斥对象在MFC中通过CMutex类进行表述。使用CMutex类的方法非常简单，在构造CMutex类对象的同时可以指明待查询的互斥对象的名字，在构造函数返回后即可访问此互斥变量。CMutex类也是只含有构造函数这唯一的成员函数，当完成对互斥对象保护资源的访问后，可通过调用从父类CSyncObject继承的UnLock（）函数完成对互斥对象的释放。CMutex类构造函数原型为：&lt;/p&gt;&lt;p&gt;CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );&lt;/p&gt;&lt;p&gt;该类的适用范围和实现原理与API方式创建的互斥内核对象是完全类似的，但要简洁的多。&lt;/p&gt;&lt;p&gt;信号量（Semaphores）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 信号量对象对线程的同步方式与前面几种方法不同，信号允许多个线程同时使用共享资源，这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源，但是需要限制在同一时刻访问此资源的最大线程数目。在用CreateSemaphore（）创建信号量时即要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数，每增加一个线程对共享资源的访问，当前可用资源计数就会减1，只要当前可用资源计数是大于0的，就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目，不能在允许其他线程的进入，此时的信号量信号将无法发出。线程在处理完共享资源后，应在离开的同时通过ReleaseSemaphore（）函数将当前可用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。 信号量是通过计数来对线程访问资源进行控制的，而实际上信号量确实也被称作Dijkstra计数器。&lt;/p&gt;&lt;p&gt;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数，S大于等于零时代表可供并发进程使用的资源实体数，但S小于零时则表示正在等待使用共享资源的进程数。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; P操作申请资源：&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1）S减1；&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2）若S减1后仍大于等于零，则进程继续执行；&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3）若S减1后小于零，则该进程被阻塞后进入与该信号相对应的队列中，然后转入进程调度。&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; V操作 释放资源：&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （1）S加1；&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （2）若相加结果大于零，则进程继续执行；&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （3）若相加结果小于等于零，则从该信号的等待队列中唤醒一个等待进程，然后再返回原进程继续执行或转入进程调度。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用信号量内核对象进行线程同步主要会用到CreateSemaphore（）、OpenSemaphore（）、ReleaseSemaphore（）、WaitForSingleObject（）和WaitForMultipleObjects（）等函数。其中，CreateSemaphore（）用来创建一个信号量内核对象，其函数原型为：&lt;/p&gt;&lt;p&gt;HANDLE CreateSemaphore(&lt;br style="line-height: normal; " /&gt;　LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性指针&lt;br style="line-height: normal; " /&gt;　LONG lInitialCount, // 初始计数&lt;br style="line-height: normal; " /&gt;　LONG lMaximumCount, // 最大计数&lt;br style="line-height: normal; " /&gt;　LPCTSTR lpName // 对象名指针&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;参数lMaximumCount是一个有符号32位值，定义了允许的最大资源计数，最大取值不能超过4294967295。lpName参数可以为创建的信号量定义一个名字，由于其创建的是一个内核对象，因此在其他进程中可以通过该名字而得到此信号量。OpenSemaphore（）函数即可用来根据信号量名打开在其他进程中创建的信号量，函数原型如下：&lt;/p&gt;&lt;p&gt;HANDLE OpenSemaphore(&lt;br style="line-height: normal; " /&gt;　DWORD dwDesiredAccess, // 访问标志&lt;br style="line-height: normal; " /&gt;　BOOL bInheritHandle, // 继承标志&lt;br style="line-height: normal; " /&gt;　LPCTSTR lpName // 信号量名&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;在线程离开对共享资源的处理时，必须通过ReleaseSemaphore（）来增加当前可用资源计数。否则将会出现当前正在处理共享资源的实际线程数并没有达到要限制的数值，而其他线程却因为当前可用资源计数为0而仍无法进入的情况。ReleaseSemaphore（）的函数原型为：&lt;/p&gt;&lt;p&gt;BOOL ReleaseSemaphore(&lt;br style="line-height: normal; " /&gt;　HANDLE hSemaphore, // 信号量句柄&lt;br style="line-height: normal; " /&gt;　LONG lReleaseCount, // 计数递增数量&lt;br style="line-height: normal; " /&gt;　LPLONG lpPreviousCount // 先前计数&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;该函数将lReleaseCount中的值添加给信号量的当前资源计数，一般将lReleaseCount设置为1，如果需要也可以设置其他的值。WaitForSingleObject（）和WaitForMultipleObjects（）主要用在试图进入共享资源的线程函数入口处，主要用来判断信号量的当前可用资源计数是否允许本线程的进入。只有在当前可用资源计数值大于0时，被监视的信号量内核对象才会得到通知。&lt;/p&gt;&lt;p&gt;信号量的使用特点使其更适用于对Socket（套接字）程序中线程的同步。例如，网络上的HTTP服务器要对同一时间内访问同一页面的用户数加以限制，这时可以为没一个用户对服务器的页面请求设置一个线程，而页面则是待保护的共享资源，通过使用信号量对线程的同步作用可以确保在任一时刻无论有多少用户对某一页面进行访问，只有不大于设定的最大用户数目的线程能够进行访问，而其他的访问企图则被挂起，只有在有用户退出对此页面的访问后才有可能进入。&lt;/p&gt;&lt;p&gt;在MFC中，通过CSemaphore类对信号量作了表述。该类只具有一个构造函数，可以构造一个信号量对象，并对初始资源计数、最大资源计数、对象名和安全属性等进行初始化，其原型如下：&lt;/p&gt;&lt;p&gt;CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL );&lt;/p&gt;&lt;p&gt;在构造了CSemaphore类对象后，任何一个访问受保护共享资源的线程都必须通过CSemaphore从父类CSyncObject类继承得到的Lock（）和UnLock（）成员函数来访问或释放CSemaphore对象。与前面介绍的几种通过MFC类保持线程同步的方法类似，通过CSemaphore类也可以将前面的线程同步代码进行改写，这两种使用信号量的线程同步方法无论是在实现原理上还是从实现结果上都是完全一致的。&lt;/p&gt;&lt;p&gt;事件（Event）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 信号量包含的几个操作原语：&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CreateEvent（） 创建一个信号量&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenEvent（） 打开一个事件&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetEvent（） 回置事件&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WaitForSingleObject（） 等待一个事件&amp;nbsp;&lt;br style="line-height: normal; " /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WaitForMultipleObjects（）　等待多个事件&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 　使用临界区只能同步同一进程中的线程，而使用事件内核对象则可以对进程外的线程进行同步，其前提是得到对此事件对象的访问权。可以通过OpenEvent（）函数获取得到，其函数原型为：&lt;/p&gt;&lt;p&gt;HANDLE OpenEvent(&lt;br style="line-height: normal; " /&gt;　DWORD dwDesiredAccess, // 访问标志&lt;br style="line-height: normal; " /&gt;　BOOL bInheritHandle, // 继承标志&lt;br style="line-height: normal; " /&gt;　LPCTSTR lpName // 指向事件对象名的指针&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;如果事件对象已创建（在创建事件时需要指定事件名），函数将返回指定事件的句柄。对于那些在创建事件时没有指定事件名的事件内核对象，可以通过使用内核对象的继承性或是调用DuplicateHandle（）函数来调用CreateEvent（）以获得对指定事件对象的访问权。在获取到访问权后所进行的同步操作与在同一个进程中所进行的线程同步操作是一样的。&lt;/p&gt;&lt;p&gt;如果需要在一个线程中等待多个事件，则用WaitForMultipleObjects（）来等待。WaitForMultipleObjects（）与WaitForSingleObject（）类似，同时监视位于句柄数组中的所有句柄。这些被监视对象的句柄享有平等的优先权，任何一个句柄都不可能比其他句柄具有更高的优先权。WaitForMultipleObjects（）的函数原型为：&lt;/p&gt;&lt;p&gt;DWORD WaitForMultipleObjects(&lt;br style="line-height: normal; " /&gt;　DWORD nCount, // 等待句柄数&lt;br style="line-height: normal; " /&gt;　CONST HANDLE *lpHandles, // 句柄数组首地址&lt;br style="line-height: normal; " /&gt;　BOOL fWaitAll, // 等待标志&lt;br style="line-height: normal; " /&gt;　DWORD dwMilliseconds // 等待时间间隔&lt;br style="line-height: normal; " /&gt;);&lt;/p&gt;&lt;p&gt;参数nCount指定了要等待的内核对象的数目，存放这些内核对象的数组由lpHandles来指向。fWaitAll对指定的这nCount个内核对象的两种等待方式进行了指定，为TRUE时当所有对象都被通知时函数才会返回，为FALSE则只要其中任何一个得到通知就可以返回。dwMilliseconds在这里的作用与在WaitForSingleObject（）中的作用是完全一致的。如果等待超时，函数将返回WAIT_TIMEOUT。如果返回WAIT_OBJECT_0到WAIT_OBJECT_0+nCount-1中的某个值，则说明所有指定对象的状态均为已通知状态（当fWaitAll为TRUE时）或是用以减去WAIT_OBJECT_0而得到发生通知的对象的索引（当fWaitAll为FALSE时）。如果返回值在WAIT_ABANDONED_0与WAIT_ABANDONED_0+nCount-1之间，则表示所有指定对象的状态均为已通知，且其中至少有一个对象是被丢弃的互斥对象（当fWaitAll为TRUE时），或是用以减去WAIT_OBJECT_0表示一个等待正常结束的互斥对象的索引（当fWaitAll为FALSE时）。&lt;br style="line-height: normal; " /&gt;&lt;br style="line-height: normal; " /&gt;MFC为事件相关处理也提供了一个CEvent类，共包含有除构造函数外的4个成员函数PulseEvent（）、ResetEvent（）、SetEvent（）和UnLock（）。在功能上分别相当与Win32 API的PulseEvent（）、ResetEvent（）、SetEvent（）和CloseHandle（）等函数。而构造函数则履行了原CreateEvent（）函数创建事件对象的职责，其函数原型为：&lt;/p&gt;&lt;p&gt;CEvent(BOOL bInitiallyOwn = FALSE, BOOL bManualReset = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );&lt;/p&gt;&lt;p&gt;按照此缺省设置将创建一个自动复位、初始状态为复位状态的没有名字的事件对象。封装后的CEvent类使用起来更加方便，&lt;/p&gt;&lt;p&gt;事件可以实现不同进程中的线程同步操作，并且可以方便的实现多个线程的优先比较等待操作，例如写多个WaitForSingleObject来代替WaitForMultipleObjects从而使编程更加灵活。&lt;/p&gt;&lt;p&gt;总结：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1． 互斥量与临界区的作用非常相似，但互斥量是可以命名的，也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多，所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建，就可以通过名字打开它。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2． 互斥量（Mutex），信号灯（Semaphore），事件（Event）都可以被跨越进程使用来进行同步数据操作，而其他的对象与数据同步操作无关，但对于进程和线程来讲，如果进程和线程在运行状态则为无信号状态，在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3． 通过互斥量可以指定资源被独占的方式使用，但如果有下面一种情况通过互斥量就无法处理，比如现在一位用户购买了一份三个并发访问许可的数据库系统，可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作，这时候如果利用互斥量就没有办法完成这个要求，信号灯对象可以说是一种资源计数器。&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chenhs/aggbug/2080050.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chenhs/archive/2011/06/13/2080050.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
