<?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>益友网</title>
	<atom:link href="http://www.1uu2.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.1uu2.com</link>
	<description>Linux之友</description>
	<lastBuildDate>Sat, 07 Jan 2012 09:01:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Get Linux 0.1发布 帮助Windows用户认识Linux</title>
		<link>http://www.1uu2.com/archives/2491</link>
		<comments>http://www.1uu2.com/archives/2491#comments</comments>
		<pubDate>Sat, 07 Jan 2012 09:00:50 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux技巧]]></category>
		<category><![CDATA[Get Linux]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2491</guid>
		<description><![CDATA[Get Linux是一个小型的Windows工具，它可以帮助用户找出多达100种Linux发行版的下载和安装方法，使用非常简单，只需要在列表中找到自己中意的版本然后选择32还是64位就可以开始下载了，同时这款软件还会提供不同Linux的图像和视频，帮助用户转移到Linux平台。 下载:Get Linux 0.1 via:http://www.cnbeta.com/articles/168282.htm]]></description>
			<content:encoded><![CDATA[<p>Get Linux是一个小型的Windows工具，它可以帮助用户找出多达100种Linux发行版的下载和安装方法，使用非常简单，只需要在列表中找到自己中意的版本然后选择32还是64位就可以开始下载了，同时这款软件还会提供不同Linux的图像和视频，帮助用户转移到Linux平台。<span id="more-2491"></span></p>
<p><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/0901006Y8.png" alt="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/0901006Y8.png" /></p>
<p><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/090106ckA.gif" alt="" /><strong>下载:</strong><a href="http://www.downloadcrew.com/article/26552-get_linux" target="_blank">Get Linux 0.1</a></p>
<p>via:<a href="http://www.cnbeta.com/articles/168282.htm" target="_blank">http://www.cnbeta.com/articles/168282.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2491/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>专为国人订制！Linux Deepin新版发布</title>
		<link>http://www.1uu2.com/archives/2479</link>
		<comments>http://www.1uu2.com/archives/2479#comments</comments>
		<pubDate>Sat, 07 Jan 2012 08:57:42 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux资讯]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[Linux Deepin]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2479</guid>
		<description><![CDATA[2011年终，深受国人喜爱的的深度Linux操作系统又发布新版本了，此次发布的是正式版Linux Deepin 11.12。从Linux Deepin 10.12版本开始，深度Linux采用了Gnome桌面系统、Yong输入法、永中Office、永中宋体、文泉驿微米黑。 　　自从发行深度Linux操作系统，深度一直贯彻“免除新手痛苦、节约老手时间”这个口号，力图为用户打造顺畅、舒服的桌面操作系统系统。如今，他们正朝着这个方面不断努力。 &#160; Linux Deepin 11.12桌面 据了解，当年深得国内网友喜爱的Windows XP三大定制版深度、番茄花园、雨林木风，经过2008年底的反盗版风暴而纷纷相继关门。番茄花园自此烟消云散，雨林木风凭借着高仿Windows XP版的Ylmf OS重新踏上了桌面操作系统的行列，目前已经发布了Ylmf OS 4.0，而深度则通过Linux Deepin活动网友的追捧，目前也已经发布到了Linux Deepin 11.12。 今天重点介绍Linux Deepin，这是一款基于国外比较知名的Ubuntu桌面操作系统的衍生版，支持网址linux.deepin.org，其前身为2004年由hiweed发起的hiweed linux项目，这也是国内第一个中文社区发布版。 2009年底，Hiweed Linux并入深度技术社区，更名为Linux Deepin项目。经过开发团队的努力，Linux Deepin获得了广泛的关注和认同，仅主站点的下载量就达到了数十万。 在目前全球Linux发布版Top 100排名中，这在当时是唯一一个由中国人制作并上榜的Linux发行版。 2011年5月28日，Linux Deepin开源社区在武汉召开了 “Linux Deepin 2011开发者和用户大会”。这也是国内首次由开源社区组织的特定Linux发布版用户线下会议。在本次会议中，Linux Deepin团队也宣布未来3年linuxDeepin系统的发展路线，并发布Deepin Linux软件中心测试版本。 另外，2011年，Linux Deepin获得了进一步的投资和赞助，并在武汉建立了专职研发团队，从事linux桌面与系统平台相关的研发工作；并且和武汉相关高校建立了联系，筹备建立联合linux系统研发实验室。该实验室的成立，将进一步提高Linux Deepin的开发和技术支持能力。 简述Deepin Linux安装过程 &#160; &#160; 深度Linux一直是国人非常喜爱的Linux操作系统之一，主要原因还是它得到了国内开发者的大力支持，在很多地方将汉化工作做得很到位。现在，先从深度Linux的安装过程开始了解起吧。 &#160; 安装类型 &#160; 键盘布局设置 注册登录用户和密码 安装过程 新桌面 深度软件中心 截图工具]]></description>
			<content:encoded><![CDATA[<p>2011年终，深受国人喜爱的的深度Linux操作系统又发布新版本了，此次发布的是正式版Linux Deepin 11.12。从Linux Deepin 10.12版本开始，深度Linux采用了Gnome桌面系统、Yong输入法、永中Office、永中宋体、文泉驿微米黑。<span id="more-2479"></span></p>
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085752TMD.jpg" alt="自从发行深度Linux操作系统，深度一直贯彻“免除新手痛苦、节约老手时间”这个口号，力图为用户打造顺畅、舒服的桌面操作系统系统。如今，他们正朝着这个方面不断努力。" width="500" height="667" align="middle" border="1" /></div>
</div>
<p><span>　　自从发行深度Linux操作系统，深度一直贯彻“免除新手痛苦、节约老手时间”这个口号，力图为用户打造顺畅、舒服的桌面操作系统系统。如今，他们正朝着这个方面不断努力。</span></p>
<div align="center">
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085754K3d.jpg" alt="Linux Deepin 11.12桌面" width="500" height="375" align="middle" border="1" /></div>
</div>
<p>&nbsp;</p>
<div align="center"><span><span>Linux Deepin 11.12桌面</span></span></div>
</div>
<p>据了解，当年深得国内网友喜爱的Windows XP三大定制版深度、番茄花园、雨林木风，经过2008年底的反盗版风暴而纷纷相继关门。番茄花园自此烟消云散，雨林木风凭借着高仿Windows XP版的Ylmf OS重新踏上了桌面操作系统的行列，目前已经发布了Ylmf OS 4.0，而深度则通过Linux Deepin活动网友的追捧，目前也已经发布到了Linux Deepin 11.12。</p>
<p>今天重点介绍Linux Deepin，这是一款基于国外比较知名的Ubuntu桌面操作系统的衍生版，支持网址linux.deepin.org，其前身为2004年由hiweed发起的hiweed linux项目，这也是国内第一个中文社区发布版。</p>
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085755aB9.jpg" alt="专为国人订制！Linux Deepin新版发布" width="500" height="292" align="middle" border="1" /></div>
</div>
<p>2009年底，Hiweed Linux并入深度技术社区，更名为Linux Deepin项目。经过开发团队的努力，Linux Deepin获得了广泛的关注和认同，仅主站点的下载量就达到了数十万。 在目前全球Linux发布版Top 100排名中，这在当时是唯一一个由中国人制作并上榜的Linux发行版。</p>
<p>2011年5月28日，Linux Deepin开源社区在武汉召开了 “Linux Deepin 2011开发者和用户大会”。这也是国内首次由开源社区组织的特定Linux发布版用户线下会议。在本次会议中，Linux Deepin团队也宣布未来3年linuxDeepin系统的发展路线，并发布Deepin Linux软件中心测试版本。</p>
<p>另外，2011年，Linux Deepin获得了进一步的投资和赞助，并在武汉建立了专职研发团队，从事linux桌面与系统平台相关的研发工作；并且和武汉相关高校建立了联系，筹备建立联合linux系统研发实验室。该实验室的成立，将进一步提高Linux Deepin的开发和技术支持能力。</p>
<p><strong>简述Deepin Linux安装过程</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>深度Linux一直是国人非常喜爱的Linux操作系统之一，主要原因还是它得到了国内开发者的大力支持，在很多地方将汉化工作做得很到位。现在，先从深度Linux的安装过程开始了解起吧。</p>
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085756RWk.jpg" alt="安装类型" width="500" height="375" align="middle" border="1" /></div>
<p>&nbsp;</p>
<div align="center"><span><span>安装类型</span></span></div>
</div>
<div align="center">
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085757M2d.jpg" alt="键盘布局设置" width="500" height="372" align="middle" border="1" /></div>
</div>
<p>&nbsp;</p>
<div align="center"><span><span>键盘布局设置</span></span></div>
</div>
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085802wkF.jpg" alt="注册登录用户和密码" width="500" height="372" align="middle" border="1" /></div>
<div align="center"><span><span>注册登录用户和密码</span></span></div>
</div>
<div align="center">
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/0858032XP.jpg" alt="安装过程" width="500" height="372" align="middle" border="1" /></div>
</div>
<div align="center"><span><span>安装过程</span></span></div>
</div>
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085805BTG.jpg" alt="新桌面" width="500" height="372" align="middle" border="1" /></div>
<div align="center"><span><span>新桌面</span></span></div>
</div>
<div align="center">
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/085810Ff8.jpg" alt="深度软件中心" width="500" height="372" align="middle" border="1" /></div>
</div>
<div align="center"><span><span>深度软件中心</span></span></div>
</div>
<div align="center">
<div align="center"><img src="http://www.1uu2.com/wp-content/uploads/auto_save_image/2012/01/0858152ce.jpg" alt="截图工具" width="500" height="372" align="middle" border="1" /></div>
<div align="center"><span><span>截图工具</span></span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2479/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux操作系统 openSUSE 12.1 &#8220;Edu Li-f-e&#8221; 发布</title>
		<link>http://www.1uu2.com/archives/2477</link>
		<comments>http://www.1uu2.com/archives/2477#comments</comments>
		<pubDate>Sun, 01 Jan 2012 17:50:55 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux资讯]]></category>
		<category><![CDATA[openSUSE]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2477</guid>
		<description><![CDATA[openSUSE项目是Novell公司资助的社区计划。为在方方面面促进Linux的普及应用，该计划提供了对openSUSE这份完整 Linux发行 的免费、简便的获取访问。openSUSE项目有三个主要目标：让openSUSE成为任何人都能最容易获得且最广泛使用的Linux发行，利用开源软件 的联合来使openSUSE成为世界上可用性最强的Linux发行及新手和资深Linux用户们的桌面环境，显著地简化并开放其开发及打包过程以使 openSUSE成为Linux开发人员及软件提供商所选择的平台。 发行说明：http://news.opensuse.org/2012/01/01/opensuse-edu-li-f-e-12-1-out-now/ 下载地址：openSUSE-Edu-li-f-e-12.1-1-i686.iso (2,929MB, MD5, torrent).]]></description>
			<content:encoded><![CDATA[<p>openSUSE项目是Novell公司资助的社区计划。为在方方面面促进Linux的普及应用，该计划提供了对openSUSE这份完整 Linux发行 的免费、简便的获取访问。openSUSE项目有三个主要目标：让openSUSE成为任何人都能最容易获得且最广泛使用的Linux发行，利用开源软件 的联合来使openSUSE成为世界上可用性最强的Linux发行及新手和资深Linux用户们的桌面环境，显著地简化并开放其开发及打包过程以使 openSUSE成为Linux开发人员及软件提供商所选择的平台。<span id="more-2477"></span></p>
<p>发行说明：<a href="http://news.opensuse.org/2012/01/01/opensuse-edu-li-f-e-12-1-out-now/" target="_blank">http://news.opensuse.org/2012/01/01/opensuse-edu-li-f-e-12-1-out-now/</a></p>
<p>下载地址：<a href="http://downloads.sourceforge.net/opensuse-edu/openSUSE-Edu-li-f-e-12.1-1-i686.iso">openSUSE-Edu-li-f-e-12.1-1-i686.iso</a> (2,929MB, <a href="http://www.opensuse-education.org/download/ISOs/openSUSE-Edu-li-f-e-12.1-latest-i686.iso.md5">MD5</a>, <a href="http://www.opensuse-education.org/download/ISOs/openSUSE-Edu-li-f-e-12.1-latest-i686.iso.torrent">torrent</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2477/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux操作系统进程-进程的退出</title>
		<link>http://www.1uu2.com/archives/2475</link>
		<comments>http://www.1uu2.com/archives/2475#comments</comments>
		<pubDate>Thu, 29 Dec 2011 02:27:26 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux技巧]]></category>
		<category><![CDATA[进程]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2475</guid>
		<description><![CDATA[void _exit(int status) 注意点： 1.status表明了进程终止时的状态。当子进程使用_exit()后，父进程如果在用wait()等待子进程，那么wait()将会返回status状态，注意只有status的低8位(0~255)会返回给父进程。通常，我们使用0，表示进程成功返回，非负值表示进程不成功返回。但是，这种约定不是强制的，每个应用程序都可以自己指定。 2.虽然返回值可以是0~255，但是我们通常使用0~128。因为在shell编程中，如果一个进程被信号打断，shell会返回128+信号编号。在shell中，这两个值是没有区别的(都是当做进程返回值)，如果我们进程中使用了128~255，那么就无法区别到底是信号打断还是进程自己退出了。 void exit(int status) 注意点： 1.在exit()调用后，退出处理函数(exit handler)首先被执行(这些函数使用atexit()和on_exit()注册)。 2.stdio流缓冲区被刷新。(还有其他资源的清理) 3.最后一步才是调用_exit()退出。 4.在main函数中最后调用return n和调用exit()是相同的作用。如果在main函数最后调用return或不调用任何退出函数，调用main的运行时函数会自动的调用exit()，但是status会变得不确定(在C89中，status可能会是栈中的某个值，或CPU寄存器中的某个值，这要看编译器是怎么使用的。在C99中，要求status必须是0)。 注册退出处理函数 在程序退出之前，我们都会主动地做一些清理的动作，比如把程序缓冲区的数据保存在文件上。通常的做法是在exit()之前，调用一些清理函数。但这种做法的弊端是，在每个可能退出的地方都写上一大堆相同的代码。另外一种方式就是让程序中所有可能退出的点，都全部集中在一个地方处理。这样做的问题是会出现大量的判断是否成功语句，让代码显得不清晰。Linux提供了下面的两个函数来解决这种问题，把所有的清理函数注册进lib库中，当任意一处调用exit()时，系统会自动的调用注册上的清理函数。 int atexit(void (*func)(void)) 注意点： 1.可以注册多个函数，并且一个函数也可多次注册。当要调用它们时，是按照FILO顺序执行的。 2.函数注册后，没办法取消注册。 3.清理函数中调用exit()的行为，在SUSv3中没有定义。在linux中，会继续执行剩下的清理函数。但在某些系统中，可能出现死循环。 4.子进程会继承父进程中的清理函数。 #define _BSD_SOURCE int on_exit(void (*func)(int, void *)， void *arg) 注意点： 1. on_exit()是atexit()的改良版。在on_exit()中，可以通过func中的int参数知道exit()的退出状态;同一个func可以根据arg的不同，执行不同的代码。 2.唯一的缺点是并不是每个系统都实行了改函数。 代码分析 int main(int argc, char *argv[]) { printf(“Hello world\n”); Write(STDOUT_FILENO, “CC\n”， 3); if (fork() == -1) [...]]]></description>
			<content:encoded><![CDATA[<p>void _exit(int status)</p>
<p>注意点：</p>
<p>1.status表明了进程终止时的状态。当子进程使用_exit()后，父进程如果在用wait()等待子进程，那么wait()将会返回status状态，注意只有status的低8位(0~255)会返回给父进程。通常，我们使用0，表示进程成功返回，非负值表示进程不成功返回。但是，这种约定不是强制的，每个应用程序都可以自己指定。<span id="more-2475"></span></p>
<p>2.虽然返回值可以是0~255，但是我们通常使用0~128。因为在shell编程中，如果一个进程被信号打断，shell会返回128+信号编号。在shell中，这两个值是没有区别的(都是当做进程返回值)，如果我们进程中使用了128~255，那么就无法区别到底是信号打断还是进程自己退出了。</p>
<p>void exit(int status)</p>
<p>注意点：</p>
<p>1.在exit()调用后，退出处理函数(exit handler)首先被执行(这些函数使用atexit()和on_exit()注册)。</p>
<p>2.stdio流缓冲区被刷新。(还有其他资源的清理)</p>
<p>3.最后一步才是调用_exit()退出。</p>
<p>4.在main函数中最后调用return n和调用exit()是相同的作用。如果在main函数最后调用return或不调用任何退出函数，调用main的运行时函数会自动的调用exit()，但是status会变得不确定(在C89中，status可能会是栈中的某个值，或CPU寄存器中的某个值，这要看编译器是怎么使用的。在C99中，要求status必须是0)。</p>
<p>注册退出处理函数</p>
<p>在程序退出之前，我们都会主动地做一些清理的动作，比如把程序缓冲区的数据保存在文件上。通常的做法是在exit()之前，调用一些清理函数。但这种做法的弊端是，在每个可能退出的地方都写上一大堆相同的代码。另外一种方式就是让程序中所有可能退出的点，都全部集中在一个地方处理。这样做的问题是会出现大量的判断是否成功语句，让代码显得不清晰。Linux提供了下面的两个函数来解决这种问题，把所有的清理函数注册进lib库中，当任意一处调用exit()时，系统会自动的调用注册上的清理函数。</p>
<p>int atexit(void (*func)(void))</p>
<p>注意点：</p>
<p>1.可以注册多个函数，并且一个函数也可多次注册。当要调用它们时，是按照FILO顺序执行的。</p>
<p>2.函数注册后，没办法取消注册。</p>
<p>3.清理函数中调用exit()的行为，在SUSv3中没有定义。在linux中，会继续执行剩下的清理函数。但在某些系统中，可能出现死循环。</p>
<p>4.子进程会继承父进程中的清理函数。</p>
<p>#define _BSD_SOURCE</p>
<p>int on_exit(void (*func)(int, void *)， void *arg)</p>
<p>注意点：</p>
<p>1. on_exit()是atexit()的改良版。在on_exit()中，可以通过func中的int参数知道exit()的退出状态;同一个func可以根据arg的不同，执行不同的代码。</p>
<p>2.唯一的缺点是并不是每个系统都实行了改函数。</p>
<p>代码分析</p>
<p>int main(int argc, char *argv[])</p>
<p>{</p>
<p>printf(“Hello world\n”);</p>
<p>Write(STDOUT_FILENO, “CC\n”， 3);</p>
<p>if (fork() == -1)</p>
<p>exit(1);</p>
<p>exit(0);</p>
<p>}</p>
<p>当在终端执行该程序时，输出入下：</p>
<p>Hello World</p>
<p>CC</p>
<p>当把文字输出到文件时，文件中保存的文字如下：</p>
<p>CC</p>
<p>Hello World</p>
<p>Hello World</p>
<p>分析：当把文字输出到终端时，stdio函数组是按行输出。而输出到文件时，是按照块输出。也就是说，在输出到文件时，printf()函数把”Hello World\n”输入进用户stdio缓冲区，但是没有达到输出块的大小。write函数直接把“CC\n”输出到内核缓冲区，而不是用户进程的缓冲区。接下来fork()出一个子进程，子进程的用户缓冲区是拷贝父进程的，也就是说在子进程中的stdio缓冲区中也存在一个”Hello World\n”，但是内核缓冲区是不会拷贝的。CC出现在Hello World前面是因为执行完write()后，CC已近在内核缓冲区中，而printf()后“Hello World”还在用户stdio缓冲区中，直到执行了exit()，才把“Hello World”刷新到内核缓冲区中。</p>
<p>来源:中国IT实验室  佚名</p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2475/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何克服Unix到Linux迁移的常见问题？</title>
		<link>http://www.1uu2.com/archives/2472</link>
		<comments>http://www.1uu2.com/archives/2472#comments</comments>
		<pubDate>Thu, 29 Dec 2011 02:24:51 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux技巧]]></category>
		<category><![CDATA[Linux迁]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[X86]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2472</guid>
		<description><![CDATA[经过了最初的测试后，你已经打算从Unix迁移到Linux上了，现在您应该注意哪些主要的问题呢?在Unix向Linux迁移的过程中通常会遇到一些什么样的问题或错误?您应该向谁求助?好的规划完全能让您避开这些问题。 确定可能的硬件挑战 在考虑迁移的过程中，最应该注意的问题就是平台依赖性，特别是从RISC迁移到X86平台。这时候，Endianess就能派上用场。 Endianess是指用于显示数据的内存排序。它规定数据元素和字节如何在内存中存储。您可能会遇到的问题就是在x86的计算机系统中很少使用Endian,但是RISC系统中却大量的使用Endian.如果您从RISC迁移到x86,反之亦然，您将需要修改迁移代码。在评估阶段，您就应该清楚的意识到这些问题。 一些厂商已经想出了一些颇有创意的办法去解决这些问题。例如： IBM开发了PowerVM Lx86,这是一个中型规模的虚拟化引擎的部件。它使用特别的软件自动把指令转换成电压信号，从而不用在本机上进行编译。 虽然在Linux运行在IBM Power平台之前，Linux必须在本地运行并重新编译。当然，这个已经不再是个问题。转换器作为PowerVM Lx86的一部分，能把x86 Linux指令很轻松地转换成电压 Linux指令，只需三步：解码、优化和生产代码。这非常适用于Web应用程序，因为有大量重复工作，因为这些频繁使用的代码已经在内存中，所以无需再重新转换。 另一个需要考虑的方面是应用程序需要的内核扩展和设备驱动。为应用程序找到合适的内核扩展和设备驱动并不是一件容易的事情，其中部分原因是大多数的内核API并不严格遵从标准。API指令、参数的数量和调用到内核扩展的过程在新平台上都会有所不同。 另一个要考虑的是需要内核扩展和设备驱动程序的应用程序。这些都不是容易的候选支持，这一部分是因为大多数的内核API不遵循任何严格的标准。 API调用的参数的数量和加载到内核扩展的过程中将所有的功能不同的新的平台上。 评估应用程序对于Linux的适用性和有效性 绝大多数的商业和网络应用程序都能在Linux上运行。但是有效性则是另一回事。 虽然今天几乎所有的生产商都已经把他们的Unix应用程序移到Linux上，但是关键是，在考虑迁移之前，如何确保现有的应用程序已经能很好地支持了这种可能的迁移。否则，您将不得不陷入自己去迁移这些应用程序的困境。对于内部应用程序的开发，您需要的是一个强大的开发团队来帮助完成应用程序的迁移。 向有过此种经验的同事咨询。了解一下您的应用程序迁移到Linux会如何。并且核实这些应用程序现在的运行情况。不用担心，请大胆地向您的生产商请求帮助。Red Hat和SUSE都提供相应的服务帮助您完成移植。 关于部署的问题和错误 当你在做迁移的时候，你可能会遇到什么样的错误或问题?首先，适当的测试非常必要。在迁移过程中，任何一件事情都可能出错，所以在生成环境之前，应该搭建一个测试和实验环境来发现和经历问题。 几年前，我的小组看似非常顺利地完成了一个重要的迁移，但是不久就开始接到电话说工资管理系统不能正常运行。这有点出乎我们的意料，之前我们进行了系统的单元测试、用户测试以及UAT测试。事实证明，问题不是出在迁移方面，而是因为一些PC客户端不能很好的与旧版本的Oracle客户端兼容。 还有一个问题是有关Unix外壳脚本。有人可能想当然的认为，Unix外壳脚本在Linux平台上也一样能很好地运行。不幸的是，这种假设不成立。 任何一个与应用程序有关的Unix脚本都需要仔细测试。Linux的标准外壳是使用Bash外壳，它是建立在Unix最初的Bourne外壳。然而，在我们的例子里，Unix使用的是Korn外壳。所以，肯定有些功能不能正确工作。因此，有必要假设您的外壳脚本在新平台下可能不能正常工作。请测试每一个您需要的外壳脚本。 获取技术支持 技术支持取决于您IT部门的大小和员工的经验。您是否有几个无所不能、经验丰富的Linux管理员呢?或者他们也许是Unix管理员，但是他们是否已经做好准备去接受Linux呢? 技术支持程度取决于您所用于的环境类型。您是否正在运行那些每分钟的故障能导致公司数万美元损失的系统呢 ,如：CRM系统或者工资系统? 来自于生产商的技术支持也是非常重要。Red Hat和Novell都提供24/7的技术支持。一些Unix硬件生产商，如IBM,也提供自己的Linux技术支持。 如果可能，请从您的硬件提供商那里获得技术支持。而且，这对您从操作系统提供商哪里获得技术支持不会产生任何不利的影响。最后还是那句话，您需要仔细考虑您的组织中，系统停机带来的经济影响和您员工的经验和能力。 来源:TechTarget中国]]></description>
			<content:encoded><![CDATA[<p>经过了最初的测试后，你已经打算从Unix迁移到Linux上了，现在您应该注意哪些主要的问题呢?在Unix向Linux迁移的过程中通常会遇到一些什么样的问题或错误?您应该向谁求助?好的规划完全能让您避开这些问题。<span id="more-2472"></span></p>
<p><strong>确定可能的硬件挑战</strong></p>
<p>在考虑迁移的过程中，最应该注意的问题就是平台依赖性，特别是从RISC迁移到X86平台。这时候，Endianess就能派上用场。</p>
<p>Endianess是指用于显示数据的内存排序。它规定数据元素和字节如何在内存中存储。您可能会遇到的问题就是在x86的计算机系统中很少使用Endian,但是RISC系统中却大量的使用Endian.如果您从RISC迁移到x86,反之亦然，您将需要修改迁移代码。在评估阶段，您就应该清楚的意识到这些问题。</p>
<p>一些厂商已经想出了一些颇有创意的办法去解决这些问题。例如： IBM开发了PowerVM Lx86,这是一个中型规模的虚拟化引擎的部件。它使用特别的软件自动把指令转换成电压信号，从而不用在本机上进行编译。</p>
<p>虽然在Linux运行在IBM Power平台之前，Linux必须在本地运行并重新编译。当然，这个已经不再是个问题。转换器作为PowerVM Lx86的一部分，能把x86 Linux指令很轻松地转换成电压 Linux指令，只需三步：解码、优化和生产代码。这非常适用于Web应用程序，因为有大量重复工作，因为这些频繁使用的代码已经在内存中，所以无需再重新转换。</p>
<p>另一个需要考虑的方面是应用程序需要的内核扩展和设备驱动。为应用程序找到合适的内核扩展和设备驱动并不是一件容易的事情，其中部分原因是大多数的内核API并不严格遵从标准。API指令、参数的数量和调用到内核扩展的过程在新平台上都会有所不同。</p>
<p>另一个要考虑的是需要内核扩展和设备驱动程序的应用程序。这些都不是容易的候选支持，这一部分是因为大多数的内核API不遵循任何严格的标准。 API调用的参数的数量和加载到内核扩展的过程中将所有的功能不同的新的平台上。</p>
<p><strong>评估应用程序对于Linux的适用性和有效性</strong></p>
<p>绝大多数的商业和网络应用程序都能在Linux上运行。但是有效性则是另一回事。</p>
<p>虽然今天几乎所有的生产商都已经把他们的Unix应用程序移到Linux上，但是关键是，在考虑迁移之前，如何确保现有的应用程序已经能很好地支持了这种可能的迁移。否则，您将不得不陷入自己去迁移这些应用程序的困境。对于内部应用程序的开发，您需要的是一个强大的开发团队来帮助完成应用程序的迁移。</p>
<p>向有过此种经验的同事咨询。了解一下您的应用程序迁移到Linux会如何。并且核实这些应用程序现在的运行情况。不用担心，请大胆地向您的生产商请求帮助。Red Hat和SUSE都提供相应的服务帮助您完成移植。</p>
<p><strong>关于部署的问题和错误</strong></p>
<p>当你在做迁移的时候，你可能会遇到什么样的错误或问题?首先，适当的测试非常必要。在迁移过程中，任何一件事情都可能出错，所以在生成环境之前，应该搭建一个测试和实验环境来发现和经历问题。</p>
<p>几年前，我的小组看似非常顺利地完成了一个重要的迁移，但是不久就开始接到电话说工资管理系统不能正常运行。这有点出乎我们的意料，之前我们进行了系统的单元测试、用户测试以及UAT测试。事实证明，问题不是出在迁移方面，而是因为一些PC客户端不能很好的与旧版本的Oracle客户端兼容。</p>
<p>还有一个问题是有关Unix外壳脚本。有人可能想当然的认为，Unix外壳脚本在Linux平台上也一样能很好地运行。不幸的是，这种假设不成立。</p>
<p>任何一个与应用程序有关的Unix脚本都需要仔细测试。Linux的标准外壳是使用Bash外壳，它是建立在Unix最初的Bourne外壳。然而，在我们的例子里，Unix使用的是Korn外壳。所以，肯定有些功能不能正确工作。因此，有必要假设您的外壳脚本在新平台下可能不能正常工作。请测试每一个您需要的外壳脚本。</p>
<p><strong>获取技术支持</strong></p>
<p>技术支持取决于您IT部门的大小和员工的经验。您是否有几个无所不能、经验丰富的Linux管理员呢?或者他们也许是Unix管理员，但是他们是否已经做好准备去接受Linux呢?</p>
<p>技术支持程度取决于您所用于的环境类型。您是否正在运行那些每分钟的故障能导致公司数万美元损失的系统呢 ,如：CRM系统或者工资系统?</p>
<p>来自于生产商的技术支持也是非常重要。Red Hat和Novell都提供24/7的技术支持。一些Unix硬件生产商，如IBM,也提供自己的Linux技术支持。</p>
<p>如果可能，请从您的硬件提供商那里获得技术支持。而且，这对您从操作系统提供商哪里获得技术支持不会产生任何不利的影响。最后还是那句话，您需要仔细考虑您的组织中，系统停机带来的经济影响和您员工的经验和能力。</p>
<p>来源:TechTarget中国</p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2472/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 3.3内核将包含Android驱动</title>
		<link>http://www.1uu2.com/archives/2469</link>
		<comments>http://www.1uu2.com/archives/2469#comments</comments>
		<pubDate>Thu, 29 Dec 2011 02:15:58 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux资讯]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2469</guid>
		<description><![CDATA[近日，Greg Kroah-Hartman宣布，Linux Kernel 3.3 将再次包含Android驱动，这意味着。Linux 3.3将无需驱动和补丁，直接在Android设备上运行。 Linux内核维护者Greg Kroah-Hartman于2010年春季把Android驱动移除出了Linux 2.6.33之后，曾一度传言可能近4-5年内都不会再回到Linux内核之中。 &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p>近日，Greg Kroah-Hartman宣布，Linux Kernel 3.3 将再次包含Android驱动，这意味着。Linux 3.3将无需驱动和补丁，直接在Android设备上运行。<span id="more-2469"></span></p>
<p>Linux内核维护者Greg Kroah-Hartman于2010年春季把Android驱动移除出了Linux 2.6.33之后，曾一度传言可能近4-5年内都不会再回到Linux内核之中。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2469/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tiny Core Linux 4.2 发布 最小型的linux</title>
		<link>http://www.1uu2.com/archives/2467</link>
		<comments>http://www.1uu2.com/archives/2467#comments</comments>
		<pubDate>Tue, 27 Dec 2011 16:22:14 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux资讯]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2467</guid>
		<description><![CDATA[Tiny Core Linux是一份10兆字节的图形化Linux桌面。它基于Linux 2.6内核、BusyBox、Tiny X、Fltk、Flwm。其核心完全运行于内存中并且启动非常快。用户对需要支持哪些应用程序和/或额外硬件拥有完全的控制，无论系统是面向台式机、上网 机、应用服务器；这可以从该项目的在线软件仓库中进行选择。 发行说明： http://forum.tinycorelinux.net/index.php/topic,12191.0.html 下载地址： TinyCore-4.2.iso (11.9MB, MD5) CorePlus-4.2.iso (48.0MB, MD5). &#160; &#160; via:http://www.lupaworld.com/article-215238-1.html]]></description>
			<content:encoded><![CDATA[<p>Tiny Core Linux是一份10兆字节的图形化Linux桌面。它基于Linux 2.6内核、BusyBox、Tiny X、Fltk、Flwm。其核心完全运行于内存中并且启动非常快。用户对需要支持哪些应用程序和/或额外硬件拥有完全的控制，无论系统是面向台式机、上网 机、应用服务器；这可以从该项目的在线软件仓库中进行选择。<span id="more-2467"></span></p>
<p>发行说明：<br />
<a href="http://forum.tinycorelinux.net/index.php/topic,12191.0.html" target="_blank">http://forum.tinycorelinux.net/index.php/topic,12191.0.html</a></p>
<p>下载地址：<br />
<a href="http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/4.x/x86/release/TinyCore-4.2.iso">TinyCore-4.2.iso</a> (11.9MB, <a href="http://distrowatch.com/?newsid=07045">MD5</a>)<br />
<a href="http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/4.x/x86/release/CorePlus-4.2.iso">CorePlus-4.2.iso</a> (48.0MB, <a href="http://distro.ibiblio.org/pub/linux/distributions/tinycorelinux/4.x/x86/release/CorePlus-4.2.iso.md5.txt">MD5</a>).</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>via:http://www.lupaworld.com/article-215238-1.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2467/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux平台用C++实现信号量同步线程</title>
		<link>http://www.1uu2.com/archives/2465</link>
		<comments>http://www.1uu2.com/archives/2465#comments</comments>
		<pubDate>Tue, 27 Dec 2011 16:20:46 +0000</pubDate>
		<dc:creator>Linux之友</dc:creator>
				<category><![CDATA[Linux技巧]]></category>
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.1uu2.com/?p=2465</guid>
		<description><![CDATA[使用Linux平台上现有的信号量sem_t相关的一组API，可以方便地进行线程同步。现在用pthread_mutex_t和pthread_cond_t相关的一组API实现信号量机制。这组API包括：pthread_mutex_init，pthread_cond_init，pthread_mutex_lock，pthread_cond_signal，pthread_mutex_unlock，pthread_cond_wait，pthread_cond_timedwait，pthread_cond_destroy和pthread_mutex_destroy，下边，是封装的信号量类，以及测试代码。使用VS2005编辑，在虚拟机 Fedora 13中编译，测试通过。 MySemaphore.h view plain #ifndef Semaphore_Header #define Semaphore_Header #include #include #include #include using namespace std; //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; class CSemaphoreImpl { protected: CSemaphoreImpl(int n, int max); ~CSemaphoreImpl(); void SetImpl(); void WaitImpl(); bool WaitImpl(long lMilliseconds); private: volatile int m_n; int m_max; pthread_mutex_t m_mutex; pthread_cond_t m_cond; }; inline void CSemaphoreImpl::SetImpl() { if (pthread_mutex_lock(&#38;m_mutex)) cout&#60;&#60;&#8221;cannot signal semaphore (lock)&#8221;&#60; [...]]]></description>
			<content:encoded><![CDATA[<p>使用Linux平台上现有的信号量sem_t相关的一组API，可以方便地进行线程同步。现在用pthread_mutex_t和pthread_cond_t相关的一组API实现信号量机制。这组API包括：pthread_mutex_init，pthread_cond_init，pthread_mutex_lock，pthread_cond_signal，pthread_mutex_unlock，pthread_cond_wait，pthread_cond_timedwait，pthread_cond_destroy和pthread_mutex_destroy，下边，是封装的信号量类，以及测试代码。使用VS2005编辑，在虚拟机 Fedora 13中编译，测试通过。<span id="more-2465"></span></p>
<p>MySemaphore.h</p>
<p>view plain</p>
<p>#ifndef Semaphore_Header</p>
<p>#define Semaphore_Header</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>#include</p>
<p>using namespace std;</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>class CSemaphoreImpl</p>
<p>{</p>
<p>protected:</p>
<p>CSemaphoreImpl(int n, int max);</p>
<p>~CSemaphoreImpl();</p>
<p>void SetImpl();</p>
<p>void WaitImpl();</p>
<p>bool WaitImpl(long lMilliseconds);</p>
<p>private:</p>
<p>volatile int m_n;</p>
<p>int m_max;</p>
<p>pthread_mutex_t m_mutex;</p>
<p>pthread_cond_t m_cond;</p>
<p>};</p>
<p>inline void CSemaphoreImpl::SetImpl()</p>
<p>{</p>
<p>if (pthread_mutex_lock(&amp;m_mutex))</p>
<p>cout&lt;&lt;&#8221;cannot signal semaphore (lock)&#8221;&lt;</p>
<p>if (m_n &lt; m_max)</p>
<p>{</p>
<p>++m_n;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>pthread_mutex_unlock(&amp;m_mutex);</p>
<p>cout&lt;&lt;&#8221;cannot signal semaphore: count would exceed maximum&#8221;&lt;&lt;&#8221; m_n = &#8220;&lt;</p>
<p>}</p>
<p>pthread_mutex_unlock(&amp;m_mutex);</p>
<p>}</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>/*</p>
<p>信号量同步机制</p>
<p>信号量提供一个计数值，可以进行原子操作。V 将计数值加1，使得</p>
<p>等待该信号量的线程可以被调用(调用Set())，P 将计数值减1，使</p>
<p>当前线程被挂起，进行睡眠(调用Wait())。</p>
<p>当信号量的计数值被初始化为0时，调用P操作，将挂起当前线程。</p>
<p>当信号量被激活，即调用V操作后，被挂起的线程就有机会被重新调度了。</p>
<p>*/</p>
<p>class CMySemaphore: private CSemaphoreImpl</p>
<p>{</p>
<p>public:</p>
<p>/*</p>
<p>创建一个信号量，信号量计数值当前值为参数n，最大值为max。</p>
<p>如果只有n，则n必须大于0;如果同时有n和max,则n必须不小</p>
<p>于0，且不大于max</p>
<p>*/</p>
<p>CMySemaphore(int n);</p>
<p>CMySemaphore(int n, int max);</p>
<p>/*</p>
<p>销毁一个信号量</p>
<p>*/</p>
<p>~CMySemaphore();</p>
<p>/*</p>
<p>对信号量计数值做加1动作，信号量变为有信号状态，使得</p>
<p>另一个等待该信号量的线程可以被调度</p>
<p>*/</p>
<p>void Set();</p>
<p>/*</p>
<p>对信号量计数值做减1动作，信号量变为无信号状态。若</p>
<p>计数值变得大于0时，信号量才会变为有信号状态。</p>
<p>*/</p>
<p>void Wait();</p>
<p>/*</p>
<p>在给定的时间间隔里等待信号量变为有信号状态，若成功，</p>
<p>则将计数值减1，否则将发生超时。</p>
<p>*/</p>
<p>void Wait(long lMilliseconds);</p>
<p>/*</p>
<p>在给定的时间间隔里等待信号量变为有信号状态，若成功，</p>
<p>则将计数值减1，返回true;否则返回false。</p>
<p>*/</p>
<p>bool TryWait(long lMilliseconds);</p>
<p>private:</p>
<p>CMySemaphore();</p>
<p>CMySemaphore(const CMySemaphore&amp;);</p>
<p>CMySemaphore&amp; operator = (const CMySemaphore&amp;);</p>
<p>};</p>
<p>inline void CMySemaphore::Set()</p>
<p>{</p>
<p>SetImpl();</p>
<p>}</p>
<p>inline void CMySemaphore::Wait()</p>
<p>{</p>
<p>WaitImpl();</p>
<p>}</p>
<p>inline void CMySemaphore::Wait(long lMilliseconds)</p>
<p>{</p>
<p>if (!WaitImpl(lMilliseconds))</p>
<p>cout&lt;&lt;&#8221;time out&#8221;&lt;</p>
<p>}</p>
<p>inline bool CMySemaphore::TryWait(long lMilliseconds)</p>
<p>{</p>
<p>return WaitImpl(lMilliseconds);</p>
<p>}</p>
<p>#endif</p>
<p>MySemaphore.cpp</p>
<p>view plain</p>
<p>#include &#8220;MySemaphore.h&#8221;</p>
<p>#include</p>
<p>CSemaphoreImpl::CSemaphoreImpl(int n, int max): m_n(n), m_max(max)</p>
<p>{</p>
<p>assert (n &gt;= 0 &amp;&amp; max &gt; 0 &amp;&amp; n &lt;= max);</p>
<p>if (pthread_mutex_init(&amp;m_mutex, NULL))</p>
<p>cout&lt;&lt;&#8221;cannot create semaphore (mutex)&#8221;&lt;</p>
<p>if (pthread_cond_init(&amp;m_cond, NULL))</p>
<p>cout&lt;&lt;&#8221;cannot create semaphore (condition)&#8221;&lt;</p>
<p>}</p>
<p>CSemaphoreImpl::~CSemaphoreImpl()</p>
<p>{</p>
<p>pthread_cond_destroy(&amp;m_cond);</p>
<p>pthread_mutex_destroy(&amp;m_mutex);</p>
<p>}</p>
<p>void CSemaphoreImpl::WaitImpl()</p>
<p>{</p>
<p>if (pthread_mutex_lock(&amp;m_mutex))</p>
<p>cout&lt;&lt;&#8221;wait for semaphore failed (lock)&#8221;&lt;</p>
<p>while (m_n &lt; 1)</p>
<p>{</p>
<p>//对互斥体进行原子的解锁工作,然后等待状态信号</p>
<p>if (pthread_cond_wait(&amp;m_cond, &amp;m_mutex))</p>
<p>{</p>
<p>pthread_mutex_unlock(&amp;m_mutex);</p>
<p>cout&lt;&lt;&#8221;wait for semaphore failed&#8221;&lt;</p>
<p>}</p>
<p>}</p>
<p>&#8211;m_n;</p>
<p>pthread_mutex_unlock(&amp;m_mutex);</p>
<p>}</p>
<p>bool CSemaphoreImpl::WaitImpl(long lMilliseconds)</p>
<p>{</p>
<p>int rc = 0;</p>
<p>struct timespec abstime;</p>
<p>struct timeval tv;</p>
<p>gettimeofday(&amp;tv, NULL);</p>
<p>abstime.tv_sec = tv.tv_sec + lMilliseconds / 1000;</p>
<p>abstime.tv_nsec = tv.tv_usec*1000 + (lMilliseconds % 1000)*1000000;</p>
<p>if (abstime.tv_nsec &gt;= 1000000000)</p>
<p>{</p>
<p>abstime.tv_nsec -= 1000000000;</p>
<p>abstime.tv_sec++;</p>
<p>}</p>
<p>if (pthread_mutex_lock(&amp;m_mutex) != 0)</p>
<p>cout&lt;&lt;&#8221;wait for semaphore failed (lock)&#8221;&lt;</p>
<p>while (m_n &lt; 1)</p>
<p>{</p>
<p>//自动释放互斥体并且等待m_cond状态,并且限制了最大的等待时间</p>
<p>if ((rc = pthread_cond_timedwait(&amp;m_cond, &amp;m_mutex, &amp;abstime)))</p>
<p>{</p>
<p>if (rc == ETIMEDOUT) break;</p>
<p>pthread_mutex_unlock(&amp;m_mutex);</p>
<p>cout&lt;&lt;&#8221;cannot wait for semaphore&#8221;&lt;</p>
<p>}</p>
<p>}</p>
<p>if (rc == 0) &#8211;m_n;</p>
<p>pthread_mutex_unlock(&amp;m_mutex);</p>
<p>return rc == 0;</p>
<p>}</p>
<p>CMySemaphore::CMySemaphore(int n): CSemaphoreImpl(n, n)</p>
<p>{</p>
<p>}</p>
<p>CMySemaphore::CMySemaphore(int n, int max): CSemaphoreImpl(n, max)</p>
<p>{</p>
<p>}</p>
<p>CMySemaphore::~CMySemaphore()</p>
<p>{</p>
<p>}</p>
<p>下边是测试代码</p>
<p>view plain</p>
<p>// pthread_semaphore.cpp : 定义控制台应用程序的入口点。</p>
<p>//</p>
<p>#include &#8220;MySemaphore.h&#8221;</p>
<p>//创建一个信号量，其计数值当前值为0，最大值为3</p>
<p>CMySemaphore g_MySem(0, 3);</p>
<p>//线程函数</p>
<p>void * StartThread(void *pParam)</p>
<p>{</p>
<p>//休眠1秒，确保主线程函数main中</p>
<p>//创建工作线程下一句g_MySem.Set();先执行</p>
<p>sleep(1);</p>
<p>g_MySem.Wait(); //信号量计数值减1</p>
<p>cout&lt;&lt;&#8221;Do print StartThread&#8221;&lt;</p>
<p>return (void *)0;</p>
<p>}</p>
<p>int main(int argc, char* argv[])</p>
<p>{</p>
<p>pthread_t thread;</p>
<p>pthread_attr_t attr;</p>
<p>assert ( !g_MySem.TryWait(10) );</p>
<p>g_MySem.Set(); //信号量计数值加1</p>
<p>g_MySem.Wait(); //信号量计数值减1</p>
<p>try</p>
<p>{</p>
<p>g_MySem.Wait(100);</p>
<p>cout&lt;&lt;&#8221;must timeout&#8221;&lt;</p>
<p>}</p>
<p>catch (&#8230;)</p>
<p>{</p>
<p>cout&lt;&lt;&#8221;wrong exception&#8221;&lt;</p>
<p>}</p>
<p>g_MySem.Set();</p>
<p>g_MySem.Set();</p>
<p>assert ( g_MySem.TryWait(0) );</p>
<p>g_MySem.Wait();</p>
<p>assert ( !g_MySem.TryWait(10) );</p>
<p>//创建工作线程</p>
<p>pthread_attr_init(&amp;attr);</p>
<p>pthread_attr_setdetachstate(&amp;attr,PTHREAD_CREATE_JOINABLE);</p>
<p>if (pthread_create(&amp;thread,&amp;attr, StartThread,NULL) == -1)</p>
<p>{</p>
<p>cout&lt;&lt;&#8221;StartThread: create failed&#8221;&lt;</p>
<p>}</p>
<p>g_MySem.Set();</p>
<p>//等待线程结束</p>
<p>void *result;</p>
<p>pthread_join(thread,&amp;result);</p>
<p>assert ( !g_MySem.TryWait(10) ); //若将断言中的 ! 去掉，则会发生断言错误</p>
<p>//关闭线程句柄，释放资源</p>
<p>pthread_attr_destroy(&amp;attr);</p>
<p>int iWait;</p>
<p>cin&gt;&gt;iWait;</p>
<p>return 0;</p>
<p>}</p>
<p>编译，运行。可以看到，与Win32平台上的测试结果相同</p>
<p>由此可见，信号量机制很关键的一点就是计数值 m_n。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.1uu2.com/archives/2465/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

