<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beyond the Void &#187; 原创</title>
	<atom:link href="http://www.byvoid.com/blog/tag/%e5%8e%9f%e5%88%9b/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.byvoid.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 29 Jun 2010 08:44:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>達拉然酒店——“英雄光臨”與“下流畜生”</title>
		<link>http://www.byvoid.com/blog/dalaran-tavern/</link>
		<comments>http://www.byvoid.com/blog/dalaran-tavern/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 07:20:38 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[自娛自樂]]></category>
		<category><![CDATA[下流畜生]]></category>
		<category><![CDATA[侮辱]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[联盟]]></category>
		<category><![CDATA[英雄光临]]></category>
		<category><![CDATA[达拉然]]></category>
		<category><![CDATA[部落]]></category>
		<category><![CDATA[魔兽世界]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1838</guid>
		<description><![CDATA[我對此感到疑惑不解：曾經作為聯盟七個王國之一的達拉然，爲什麼會與聯盟部落保持中立？接受部落也就算了，爲什麼還會接受正攻打安伯米爾的被遺忘者？當然解釋起來也並不困難，銀色... ]]></description>
			<content:encoded><![CDATA[<p>我對此感到疑惑不解：曾經作為聯盟七個王國之一的達拉然，爲什麼會與聯盟部落保持中立？接受部落也就算了，爲什麼還會接受正攻打安伯米爾的被遺忘者？當然解釋起來也並不困難，銀色黎明和卡德加都是先例，就是因爲巫妖王的勢力太強大了，以至於達拉然不得不接受一切可以團結的力量共同對抗。但是我一直懷疑達拉然的法師們是否具有如此高尚的品格，直到我看到了達拉然城內專門爲聯盟和部落開設的旅店，才恍然大悟。</p>
<p>聯盟的旅店裝飾得金碧輝煌，而且有一個響亮的名字，叫做“英雄光臨（A Hero&#8217;s Welcome）”。</p>
<p><img class="alignnone size-full wp-image-1837" title="dalaran_a" src="http://www.byvoid.com/blog/wp-content/uploads/2010/03/dalaran_a.jpg" alt="" width="800" height="449" /></p>
<p>形成強烈反差的是，部落的旅店名叫“下流畜生（The Filthy Animal）”。</p>
<p><img class="alignnone size-full wp-image-1839" title="dalaran_h" src="http://www.byvoid.com/blog/wp-content/uploads/2010/03/dalaran_h.jpg" alt="" width="800" height="449" /><br />
<span id="more-1838"></span><br />
太有諷刺意味了，不是嗎？達拉然根本沒有把部落當成永久的盟友，只是對抗巫妖王時暫時的結盟。達拉然大部份的民眾是無法忘記部落對達拉然的入侵，以及被遺忘者落井下石的行爲的。達拉然能讓部落在城中安然無恙，已經足夠寬容了，因此把“下流畜生”這個名字作爲部落的棲息點，也是合乎情理的。然而部落的決策者理應不能容忍這等羞辱，但即便如此，還是睜一隻眼閉一隻眼。</p>
<p>可以預見的是，當巫妖王的威脅被解除以後，達拉然極有可能對部落進行驅逐，或者從某種意義上來說，屠殺。至於達拉然是否會回到聯盟，還是個未知數，因爲在聯盟和部落的消耗戰中，它可以慢慢積累實力，但距離復興到兩次大戰之前的水平，還有相當長的距離。</p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/byvoid-wow-stage-2/" title="BYVoid 魔兽世界模拟赛 Stage.2">BYVoid 魔兽世界模拟赛 Stage.2</a></li><li><a href="http://www.byvoid.com/blog/byvoid-wow-stage-2-old/" title="BYVoid 魔兽世界模拟赛 Stage.2[已推迟]">BYVoid 魔兽世界模拟赛 Stage.2[已推迟]</a></li><li><a href="http://www.byvoid.com/blog/byvoid-wow-stage-1/" title="BYVoid 魔兽世界模拟赛 Stage.1">BYVoid 魔兽世界模拟赛 Stage.1</a></li><li><a href="http://www.byvoid.com/blog/ubuntu-wine-wow/" title="Ubuntu下用wine玩魔兽世界">Ubuntu下用wine玩魔兽世界</a></li><li><a href="http://www.byvoid.com/blog/fiveyearsago-wow/" title="依稀記得五年前的今天">依稀記得五年前的今天</a></li><li><a href="http://www.byvoid.com/blog/byvoid-wow-stage-4/" title="BYVoid 魔兽世界模拟赛 Stage.4">BYVoid 魔兽世界模拟赛 Stage.4</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/dalaran-tavern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>j,q,x與尖團合流</title>
		<link>http://www.byvoid.com/blog/jqx-ziantuan/</link>
		<comments>http://www.byvoid.com/blog/jqx-ziantuan/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 06:08:19 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[中文與漢字]]></category>
		<category><![CDATA[稷下學宮]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[团音]]></category>
		<category><![CDATA[国语罗马字]]></category>
		<category><![CDATA[尖团合流]]></category>
		<category><![CDATA[尖音]]></category>
		<category><![CDATA[汉语]]></category>
		<category><![CDATA[腭化]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1679</guid>
		<description><![CDATA[有沒有發現，清華大學的拉丁字母拼寫形式是Tsinghua呢？有沒有發現，在拼音打字的時候，聲母爲j,q,x的字特別多呢？有沒有發現，不少方言中普通話j,q,x的對應讀音最奇怪呢？ j,q,x的來源 現代... ]]></description>
			<content:encoded><![CDATA[<p>有沒有發現，清華大學的拉丁字母拼寫形式是Tsinghua呢？有沒有發現，在拼音打字的時候，聲母爲j,q,x的字特別多呢？有沒有發現，不少方言中普通話j,q,x的對應讀音最奇怪呢？</p>
<h2>j,q,x的來源</h2>
<p>現代普通話中的聲母j,q,x，來自于近代漢語聲母z,c,s和g,k,h。本身j,q,x是從g,k,h分化出來的三個新的聲母，例如“君”古音讀作gün(與日語相似)，“其”讀作ki，“虛”讀作hü，發展過程中，gi,ki,hi,gü,kü,hü聲母變成了j,q,x。這種現象叫“<strong>腭化</strong>”（舌面擡高，接近硬腭），是語音發展走向成熟的表現，分化出的聲母有利於語音更清晰，更精確表意。目前粵語等方言中，還保留了沒有腭化的讀音，其他大部份地區已經腭化。</p>
<p>此外，現代j,q,x還有一大部份的字是來自于z,c,s。例如“箭”近代讀作zian，“千”讀作cian，“迅”讀作sün，和“作”、“此”、“三”的聲母是相同的。現在不少老年人以及很多方言中，還都是這麼念的。近代語音學把zi,ci,si(包括zü,cü,sü，下同)稱作“<strong>尖音</strong>”，把腭化後的gi,ki,hi（j,q,x）成為“<strong>團音</strong>”。普通話和臺灣通行的國語中不再區分尖音和團音，但是在戲曲界，如京劇、豫劇、昆曲、川劇、黃梅戲等所有名家都分尖團音，甚至還可以找到分尖團的國歌錄音帶（前cian進zin、前cian進zin、前cian進zin進zin）。</p>
<h2>國羅派與尖團合流</h2>
<p>尖團音合的最終促成流發生在近代不到一百年內。與gi,ki,hi腭化不同的是，這次合流是人工促成的，是音節的模糊化，是語音發展的退化。尖團合流在近代學術界、教育家曾經有過激烈的爭論，尖團合流的促成主要是國語羅馬字派（簡稱<strong>國羅派</strong>）主張的結果。近代中國內憂外患，不少有識之士把中國的落後歸咎于漢字，同時也產生了一種“漢語落後論”（其實漢語是很先進的“分析語”，英語正從“屈折語”朝著“分析語”的方向發展）。有人認為，漢語聲母過多，韻母也十分複雜，難以用26個拉丁字母表示，因此應當“削足適履”，國羅派就是其中之一。國羅派主張zi,ci,si與ji,qi,xi不需要區分，一直在不遺餘力地推廣其不分尖團音的“國語羅馬字”，最終促成了尖團合流。</p>
<p>尖團合流的問題可以追溯到清代，滿清統治者入關後，開始學習漢語。但由於滿語只有11個聲母（遠少於《廣韻》36聲母，近古音24聲母，現代普通話21聲母），許多漢語讀音都發不清楚，其中尤以zi,qi,si為甚。因此，滿清旗人習慣於將尖音讀作團音。起初漢族下至文盲，上至文豪，所有百姓都是可以分清楚尖團音的，但後來有一些讀書人爲了迎合官場上滿人的習慣，故意不分尖團音。久而久之，中國北方逐漸出現了少數不分尖團音的漢人，其中犬儒居多。後來由於滿人對漢語學習的深入，發現尖音對應了《廣韻》“精”、“清”、“從”、“心”、“邪”聲母，團音對應了“見”、“溪”、“群”、“曉”、“匣”聲母，因此滿人也開始糾正讀音。乾隆年間朝廷還專門撰寫了《圓音正考》來糾正尖團合流的錯誤，合流的尖團開始慢慢重新分化。</p>
<p>民國初年，國民政府制定了區分尖團的“國音”（後被稱為“老國音”）。一九二三年，國羅派開始興風作浪，違背語音事實地制定了“國語羅馬字”，粗暴的合併了尖團音，砍掉了iai韻母，並開始大肆推廣。國語羅馬字的推廣不得人心，一九三二年，瞿秋白主持制定推行了區分尖團音的“北方話拉丁化拼音方案”，簡稱“<strong>北拉</strong>”。由於北拉派與國羅派主張不和，因此遭到以黎錦熙為首的尖團合流頑固派的嚴酷鎮壓。使用北拉注音者被冠以“反政府”拘禁。</p>
<p>新中國成立後，“北拉”得到毛澤東的支持，終於走上前臺。黎錦熙不甘屈從，仍然竭力製造尖團合流，因此否定北拉，要求新的方案出臺。以吳玉章爲首的拼音方案委員會先後四次提出了分尖團的拼音方案《漢語拼音方案（拉丁字母式）草案初稿》，都遭到黎錦熙的抵制而失敗。一九五五年，中國文字改革委員會通過了和“北拉”基本相同的《中文拼音文字（拉丁字母式）草案初稿》。頑固派首腦黎錦熙不甘心自己的失敗，串聯語言所長羅常培以語言研究所的名義搞了個“通信調查尖團音”，讓縣教局找縣駐地師範學校的一個教師或學生（一個人代表一個縣）區分尖團音。調查的統計資料是，分尖團的方言占 20.3%，不分尖團的方言占79.7%。這是黎錦熙預想的結果，因為接受調查的師範生，一方面已經接受了不分尖團的新國音，難以整齊區分了；另一方面，即使能區分，表上又沒寫明按方言，學生就像考試一樣，生怕填錯了，只好以黎氏字典上的標音填表。這樣就必然會得到不分尖團的方言占多數的結果。因此在黎錦熙的操縱下，“理所當然”地通過了不區分尖團音的《漢語拼音方案》。至此，尖團音完全合流，多數數人已經不能整齊區分所有尖團音。</p>
<h2>尖團合流的後果</h2>
<p>尖團音是漢語語言數千年發展的瑰寶，是漢族和漢字文化圈普通人民和知識階層的共同語音。美國語言學家Jerry Norman曾經嘲笑尖團合流的《漢語拼音方案》是“懒惰的方案”。語言學界普遍認為，一個語言增加新的語音是非常苦難的。語音就像“不可再生資源”，合流容易分化難，尖團合流就等於我們扔掉了寶貴的語音資源。尖團合流以後，漢語音節數量減少，導致音譯不夠準確，遠沒有用粵語等方言音譯讀音接近。同時舊時一些音譯會發生變味（例如Spain西班牙，是xi ban ya更接近還是si ban ya更接近？）。</p>
<p>尖團音合流以後，增加了多數人學習普通話的難度，因為這個不去分尖團“普通話”，甚至已經和北京話有了顯著區別，和南方各個方言區別更甚。老年人，尤其是沒有受過教育的婦女，尤其能區分尖團。現代年輕人說話不分尖團，與老年人交談時有聽不懂，更加深了老一輩與年輕一輩的代溝。尖團合流割裂了以漢語爲載體的文化藝術形式，尤其是嚴格區分尖團的京劇。本來現代愛聽京劇的人就越來越少了，再加上尖團合流導致的“聽不懂”，更使京劇藝術雪上加霜。</p>
<p>尖團合流使音節區分度減少，導致本可以直接從讀音聽出來的兩個字現在分不清。如“劍jian”和“箭zian”，“希xi”和“西si”，“近jin”和“進zin”，“郡jün”和“俊zün”，“宣süan”和“喧xüan”，“九jiu”和“酒ziu”，“結jie”和“節zie”（你是愛寫“節點”，還使“結點”呢？）等等。與音節減少相伴的就是同音字的增多，尤其體現在用漢語拼音打字的時候，j,q,x爲聲母的字特別多，即使是搜狗拼音、Google拼音這樣的高智能輸入法，也經常會在j,q,x的詞彙上組詞出錯。</p>
<h2>附：被合併的團音iai韻母</h2>
<p>iai韻母原本是漢語一個很重要的語音，不少形聲字都以此爲聲旁。國羅派認為“拉丁語中沒有iai這個古怪的韻母，寫成iai不符合拼寫規則”，因此要刪除iai韻母。下為部份iai韻母的字，這些字都是團音，即古音聲母爲g,k,h。</p>
<p>jiai 皆介价界街<br />
qiai 楷揩锴<br />
xiai 蟹鞋骇谐</p>
<p>可以看出，皆、楷、锴、谐本為同韻字(iai)，現在卻變成了聲母韻母均不相同的字，打破了聲旁字族的嚴謹性，需要單獨記憶。另外，“街”字在很多方言中念作jiai或giai或gai，唯獨普通話變成了不倫不類的jie，“鞋”字也同理（四川話說hai）。</p>
<p><a href="http://www.byvoid.com">BYVoid原創</a> 轉載請注明</p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/language-chinese-deities/" title="［轉載］中国的神仙用的是什么语言">［轉載］中国的神仙用的是什么语言</a></li><li><a href="http://www.byvoid.com/blog/c-chinese-status/" title="[轉載]中文的常態與變態">[轉載]中文的常態與變態</a></li><li><a href="http://www.byvoid.com/blog/dalaran-tavern/" title="達拉然酒店——“英雄光臨”與“下流畜生”">達拉然酒店——“英雄光臨”與“下流畜生”</a></li><li><a href="http://www.byvoid.com/blog/bh-diao-cao/" title="避諱借字——“屌”、“肏”、“屄”">避諱借字——“屌”、“肏”、“屄”</a></li><li><a href="http://www.byvoid.com/blog/pa-origin/" title="注音符號的由來">注音符號的由來</a></li><li><a href="http://www.byvoid.com/blog/linux-c-1/" title="Linux C语言编程学习笔记 (1)进程控制入门">Linux C语言编程学习笔记 (1)进程控制入门</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/jqx-ziantuan/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Linux C语言编程学习笔记 (1)进程控制入门</title>
		<link>http://www.byvoid.com/blog/linux-c-1/</link>
		<comments>http://www.byvoid.com/blog/linux-c-1/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 13:48:32 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機技術]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[exec]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[僵尸进程]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[子进程]]></category>
		<category><![CDATA[孤儿进程]]></category>
		<category><![CDATA[守护进程]]></category>
		<category><![CDATA[实际用户]]></category>
		<category><![CDATA[有效用户]]></category>
		<category><![CDATA[父进程]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[进程]]></category>
		<category><![CDATA[阻塞]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1616</guid>
		<description><![CDATA[想进行Linux系统开发已经很久了，一直没有付诸实践。今日终于开始学习Linux下的C语言编程，研究一天，终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法，总结下来以方便大家学... ]]></description>
			<content:encoded><![CDATA[<p>想进行Linux系统开发已经很久了，一直没有付诸实践。今日终于开始学习Linux下的C语言编程，研究一天，终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法，总结下来以方便大家学习和自己实践。</p>
<h2>进程系统</h2>
<p>Linux是个多任务多用户的操作系统，系统直接管理的每个任务的最小单位，就是<strong>进程(process)</strong>。每个进程都有一个惟一的标识符pid，不同的进程pid不相同，在Shell下输入ps -A，可以显示当前的所有进程。一个进程不代表一个<strong>应用程序(application)</strong>，因为一个应用程序可能对应多个进程，也不代表一个<strong>可执行文件(executable file)</strong>，因为一些可执行文件可以被同时运行多个，它们是互不相干的。</p>
<p>在Linux中，进程不是相互独立的，每个进程（除了init进程）都有一个<strong>父进程(parent process)</strong>，同时每个进程可以有0个1个或多个<strong>子进程(child process)</strong>。换句话说，Linux的进程是一个树形结构，在Shell下输入pstree可以查看这个树的形状。下图为pstree返回结果的一部分。</p>
<blockquote><p>init─┬─NetworkManager─┬─dhclient<br />
│                └─{NetworkManager}<br />
├─SystemToolsBack<br />
├─avahi-daemon───avahi-daemon<br />
├─bonobo-activati───{bonobo-activati}<br />
├─console-kit-dae───63*[{console-kit-dae}]<br />
├─hald───hald-runner─┬─hald-addon-acpi<br />
│                    ├─hald-addon-cpuf<br />
├─pulseaudio─┬─gconf-helper<br />
│            └─2*[{pulseaudio}]<br />
├─rsyslogd───2*[{rsyslogd}]<br />
├─seahorse-daemon<br />
├─telepathy-gabbl<br />
├─telepathy-haze─┬─telepathy-haze<br />
│                └─{telepathy-haze}<br />
├─trashapplet<br />
└─wpa_supplicant</p></blockquote>
<p>在C语言中，获得当前进程的pid的函数是pid_t getpid(void);，获得当前进程的父进程的pid的函数是pid_t getppid(void);，两者都在unistd.h中声明。</p>
<h2>用户和权限</h2>
<p>因为Linux是多用户的系统，所以内核中有着强大的用户控制，因此每个进程还有一个所有者，即<strong>实际用户ID(uid)</strong>。系统uid是一个整数，不同于用户名。默认情况下进程的uid继承于父进程。例如我用所有者为byvoid(uid为1000)的bash终端启动了一个进程，那么这个进程的uid也是1000。用户uid可以通过uid_t getuid(void);函数获得。如果权限满足，程序在运行时可以修改uid，C语言函数为int setuid(uid_t uid);，如果成功执行返回0，否则返回-1。只有具有root用户权限的进程可以设置uid。</p>
<p>除此以外，进程还有一个<strong>有效用户ID(euid)</strong>。euid是决定进程文件系统权限的身份，一般情况下进程euid和uid是相同的。在C语言中可以通过uid_t geteuid(void);函数获得进程euid。同样euid也可以修改，函数为int seteuid(uid_t uid);仅当当前uid和euid中至少有一个为0(root)时，才可以设置euid。有一种特殊情况，就是一个二进制可执行文件所有者为root，并且被chmod +s后，在一般用户身份下执行，这时产生的进程uid为一般用户，而euid为0(root)，这种情况下该进程具有和root一样高的权限。</p>
<h2>进程生成</h2>
<h3>fork函数</h3>
<p>Linux允许用户创建用户进程的子进程，在C语言中通过pid_t fork(void);函数实现。fork函数的基本功能是生成一个子进程，并复制当前进程的数据段和堆栈段，子进程和父进程共用代码段。因为复制了堆栈段，所以父进程和子进程都停留在fork函数的栈帧中，fork函数要返回两次，一次在父进程中返回，一次在子进程中返回，但是两次的返回值是不一样的。在父进程中，fork函数返回值为子进程的pid（如果成功调用的话），在子进程中，fork函数的返回值为0。因此可以根据返回值的不同确定程序的运行流程。父进程和子进程默认情况下是同步执行的，由系统内核调度，哪个先执行是未知的。因为父子进程的数据段和堆栈段都是独立的，所以两者互不干涉，各行其是，内存不能直接共享。</p>
<h3>执行程序</h3>
<p>Linux中要执行一个外部程序，必须生成一个子进程，因为内核执行程序的命令exec会替换掉当前进程的地址空间的所有内容并继续执行，执行另一个程序意味着当前程序不再执行。在C语言中，并没有exec这样的一个函数，而是有下列一组函数。</p>
<blockquote><p>int execl (const char * file,const char * arg,&#8230;);<br />
int execlp(const char * file,const char * arg,&#8230;);<br />
int execle(const char * file,const char * arg,&#8230;,NULL,char * const envp[ ]);<br />
int execv (const char * file, char * const argv[ ]);<br />
int execvp(const char *file ,char * const argv []);<br />
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);</p></blockquote>
<p>其中以execl开头的函数，第一个参数file为可执行文件名，接下来有若干个参数，分别为传入的argv[0],argv[1],argv[2],&#8230;，最有以NULL结束。如果file参数为路径名(其中包含&#8217;/')，execl函数会直接定位到文件并执行，否则仅在当前目录下寻找文件，而execlp函数遇到文件名则会按照环境变量PATH的顺序寻找。execle最后一个参数为二维字符数组，表示传递给程序新的环境变量列表。execv，execvp，execve和前三者用法相似，只不过不以可变参数列表的方式传递参数，换以二维字符数组。上述函数执行失败后会返回-1，如果执行成功的话将会不返回，因为代码段已经被新的可执行程序替换。</p>
<h2>进程阻塞</h2>
<h3>wait函数</h3>
<p>在实际的应用中，有时候需要让父进程停下来等待子进程的执行完毕，这时候就需要进行<strong>进程阻塞(process blocking)</strong>。C语言中使用pid_t wait(int *statloc)函数可以得到子进程的结束信息。调用wait函数的进程会阻塞，直到该进程的任意一个子进程结束，wait函数会返回结束的子进程的pid，结束信息保存在statloc指针指向的内存区域。如果该进程没有活动的子进程，那么立即出错并返回-1。如果statloc指针为NULL，那么表示不关心进程结束的状态。如果有多个子进程，wait函数返回哪个数不确定的，需要通过pid来判断。</p>
<p>如果我们需要等待特定的一个进程，可以使用pid_t waitpid(pid_t pid,int *statloc,int options)函数。waitpid函数的第一个参数指定了要等待的进程pid，并且有更多的选项。</p>
<h3>僵尸进程</h3>
<p>当一个子进程退出时，如果没有被父进程通过wait取得状态信息，这些信息会一直保留在内核内存中，子进程的pid也不会被消除，直到父进程退出，这时候这些子进程被称为<strong>僵尸进程（zombie process）</strong>。虽然僵尸进程只占用很少的一点内存，但如果是长期运行的服务器，积累大量的僵尸进程会导致系统进程表被塞满，以至于无法创建新的进程。产生一个僵尸进程很容易，只需要让子进程先于父进程退出即可，在父进程退出之前，子进程将会成为僵尸进程。</p>
<h3>孤儿进程</h3>
<p>与僵尸进程相反，如果父进程没有阻塞并先于子进程退出，那么子进程将会成为<strong>孤儿进程(orphan process)</strong>。Linux系统中init进程负责领养所有孤儿进程，也就是说，孤儿进程的父进程会被设为init进程。init进程作为系统<strong>守护进程(daemon process)</strong>，会不断调用wait函数等待领养的孤儿进程退出，不会产生僵尸进程。</p>
<h3>利用孤儿进程避免僵尸进程</h3>
<p>许多时候我们不能让父进程阻塞下来等待子进程处理完以后再继续，例如在多用户的服务器程序上。这时如果让子进程处理事务，就会产生大量僵尸进程。避免僵尸进程出现的一个经典方法就是利用孤儿进程，具体方法为首先用父进程产生一个子进程，然后让子进程立刻产生一个孙子进程，用孙子进程来处理事务。同时父进程阻塞等待，并让子进程则立刻退出。这时候由于子进程已经退出，孙子进程就变成了孤儿进程，被init领养。而子进程立刻退出后，父进程收到信号并正确销毁了子进程，相比之下父进程只阻塞了可以忽略不计的一瞬间。下面程序是一个例子避免僵尸进程。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1616code2'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p16162"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p1616code2"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//启动一个子进程</span>
	<span style="color: #009900;">&#123;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;the child<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//启动一个孙子进程</span>
		<span style="color: #009900;">&#123;</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;do something you want<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			sleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;done<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span> <span style="color: #666666; font-style: italic;">//子进程立刻退出</span>
			exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//父进程立即阻塞</span>
		wait<span style="color: #009900;">&#40;</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;the parent<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		sleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><a href="http://www.byvoid.com/" target="_blank">BYVoid 原创作品</a>。</p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/ibus-bopomofo-1-3-9-features/" title="ibus-pinyin注音模式新特性">ibus-pinyin注音模式新特性</a></li><li><a href="http://www.byvoid.com/blog/ubuntu-wine-wow/" title="Ubuntu下用wine玩魔兽世界">Ubuntu下用wine玩魔兽世界</a></li><li><a href="http://www.byvoid.com/blog/linux-ssh-wall/" title="Linux下实现自动设置SSH代理">Linux下实现自动设置SSH代理</a></li><li><a href="http://www.byvoid.com/blog/vakuum-dev-note-02/" title="Vakuum开发笔记02 核心与安全问题">Vakuum开发笔记02 核心与安全问题</a></li><li><a href="http://www.byvoid.com/blog/fast-readfile/" title="探寻C++最快的读取文件的方案">探寻C++最快的读取文件的方案</a></li><li><a href="http://www.byvoid.com/blog/linux-cprogram-syscall/" title="Linux下C程序启动时的系统调用">Linux下C程序启动时的系统调用</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/linux-c-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“鍾”、“鐘”之辨</title>
		<link>http://www.byvoid.com/blog/zhong-dc/</link>
		<comments>http://www.byvoid.com/blog/zhong-dc/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 05:30:14 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[中文與漢字]]></category>
		<category><![CDATA[分辨]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[文字]]></category>
		<category><![CDATA[正体]]></category>
		<category><![CDATA[汉字]]></category>
		<category><![CDATA[简体]]></category>
		<category><![CDATA[繁体]]></category>
		<category><![CDATA[规范]]></category>
		<category><![CDATA[鍾]]></category>
		<category><![CDATA[鐘]]></category>
		<category><![CDATA[钟]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1601</guid>
		<description><![CDATA[“鍾”、“鐘”均讀作“zhong1”，其“簡化字”均爲“钟”。兩者本義不同，但簡化字刻意追求簡略，把兩者合為一字，因而在辨別上造成了不少困難。 “鍾”，本意爲“盛酒的器具”，與“... ]]></description>
			<content:encoded><![CDATA[<p>“鍾”、“鐘”均讀作“zhong1”，其“簡化字”均爲“钟”。兩者本義不同，但簡化字刻意追求簡略，把兩者合為一字，因而在辨別上造成了不少困難。</p>
<p>“<span style="font-size: 48px;">鍾</span>”，本意爲“盛酒的器具”，與“盅”相通，如“酒鍾（酒盅）”、“酒逢知己千鍾少，話不投機半句多”，後引申爲一種容量計量單位。另一個引申義爲“積聚，集中”，例如“鍾愛”、“鍾情”、“鍾靈毓秀”。此外，“鍾”和“鍾離”還是兩個姓氏，古有“鍾繇”、“鍾子期”、“鍾離權”等人。</p>
<p>“<span style="font-size: 48px;">鐘</span>”，本意爲“一種打擊樂器”，如“編鐘”、“鐘鳴鼎食”。後起意義爲一種計時工具“鐘錶”，如“鬧鐘”、“鐘點”、“鐘擺”。</p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/hou-dc/" title="“后”、“後”之辨">“后”、“後”之辨</a></li><li><a href="http://www.byvoid.com/blog/xi-dc/" title="“系”、“係”、“繫”之辨">“系”、“係”、“繫”之辨</a></li><li><a href="http://www.byvoid.com/blog/zhi-dc/" title="“祇”、“祗”、“衹”之辨">“祇”、“祗”、“衹”之辨</a></li><li><a href="http://www.byvoid.com/blog/mrtws/" title="[轉載]大陸『識正書簡』的文化意涵">[轉載]大陸『識正書簡』的文化意涵</a></li><li><a href="http://www.byvoid.com/blog/mingliao-ofy/" title="明瞭體——優美的舊字形無襯線體">明瞭體——優美的舊字形無襯線體</a></li><li><a href="http://www.byvoid.com/blog/baidu-zhst/" title="百度搜索強悍的地方">百度搜索強悍的地方</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/zhong-dc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
