<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[海客]]></title>
	  <link>http://blog.163.com/haike_lyw</link>
	  <description><![CDATA[好好活着，因为我们会死很久很久…… 童年时快乐无忧,少年时历尽曲折,造就了现在的看似外向实际很内向的青年的我！]]></description>
	  <language>zh-CN</language>
	  <pubDate>Fri, 4 Jul 2008 20:45:26 +0800</pubDate>
	  <lastBuildDate>Fri, 4 Jul 2008 20:45:26 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[haike_lyw]]></managingEditor>
	  <webMaster><![CDATA[海客]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[海客]]></title>
	  	<url>http://ava.blog.163.com/photo/fPKWyknwQtzTXP1HHnEKow==/175640385467647317.jpg</url>
	  	<link>http://blog.163.com/haike_lyw</link>
	  </image>
  <item>
  	<title><![CDATA[我曾经的一个创业方案]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200842623311420</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">毕业后的曾经一度我认为我非常适合做服装代理，为此我曾认真的分析过服装市场，并且做过认真的规划。虽然到现在这个理想还没有实现，但是我相信以后会实现的。在这里先把我的规划陈述一下，抛砖引玉。</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp; 做服装代理，我认为主要有一下几个因素需要考虑：代理什么品牌（什么类型，什么价位，什么年龄的消费人群）；什么区域的代理（县级，市级）；代理店的选址；经营的具体方式。</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp; 服装品牌：我打算选择价位在中档的休闲运动类。如 美特斯邦威，以纯，班尼路，生活几何等。这种品牌价格既不是很高，符合中档收入人群的消费水平，又是针对年轻人群，年轻人群很在乎流行款式，会追逐潮流，不会等到一件衣服实在不能穿的时候才去更换。也就是说每个季节都会有不同的流行款式，每个季节都是销售旺季。即使是固定的消费人群也会有很大的消费潜力。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;代理区域：市级代理。虽然市级会比县级代理贵一些，但是市区的购买力远远要比县级的购买力高的多，虽然以上品牌不是什么名牌但是相信城乡的百姓一般也不舍得花100元去买一件衬衣。所以虽然代理费高点但是必然有高的道理。就像在乡下开一个肯德基店相信不会有市场。</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp;代理店选址：服装店的选址其实也就是在选择消费人群，这一点在整个经营中占有重要的地位。打个比方，如果我们公司不提供工作餐，门口有个卖煎饼果子的老太婆，即使他是个哑巴相信也能赚钱啊。所以我考察了一下，在我们日照市（呵呵，我还是很倾向于我们那儿的）值得开店的地方一般也是各大商场青睐的地方：日照市区利群，百货大楼，银座。新市区王府井步行街，银座，新玛特，贵和大厦。石臼利群，海纳超市，友谊超市。还有石臼跟日照各有一个大的商场，主要是杂牌店，针对的中下层的消费人群。经过分析我发现在各大超市中设专柜的话虽然比较能保证销量，会有商场帮助做一些广告，但是租金也非常高，需要很大一部分钱用来租专柜，并且一些经营上的方式会受到商场相关规定的限制。选在商场的话虽然租金便宜，但是销售量太低，那里虽然人来人往挺热闹，但是大部分都是抱着低消费的观念的去的，品牌服装的价位在那里很难被接受。再说，谁会在天江地摊上花一个肯德基汉堡的钱买一个汉堡啊，即使这个汉堡真的是肯德基做的，还热乎。。。呵呵。</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp;&nbsp;&nbsp;在日照有一个非常有潜力的消费市场--大学城。之所以说他有潜力，不止因为这里学校比较多，也因为这里的学校类型。曲阜师范大学，山东体育学院，济宁医学院，山东水利学院，日照经济学院，日照职业技术学院&nbsp;&nbsp;等等。这些学校一般都是非重点学校或是专科。这里的学生一般会把大量的时间花在娱乐打扮上，并且大学城离市区各大商场比较远，交通不是很方便，是一座消费水平还可以的城中城。所以我选择的消费人群主要针对这里的学生。</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp; </P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp; 经营方式：选址在这里，我认为自己具有其他很多代理商不具备的优势就是我刚从大学毕业，对学校的生活方式比较了解，能够比较正确的把握当今在校学生的购买力，兴趣爱好，还有学校的相关规定。说道经营方式，在学校这样一块重视偶像，喜欢模仿的土地上广告是很重要的。在学校里面做广告方式很多，时间有限我只列举一个吧。既然是服装那么当然是选择模特了，像专卖店一样找几个塑料模特摆在那儿我觉得在学校里面不会有很大的吸引力的。在学校这样的沃土上资源实在是太丰富了，随便以勤工俭学的名义发一些广告就会有很多应征者，选几个活泼开朗，形象气质俱佳，人缘又好的女学生做模特会有意想不到的影响力。每次有什么新款式先给她们每人免费发一套（一定要根据她们的特点搭配不同的衣服，能造成最大影响力），想想她们的圈子里会有很大的影响力的，哥哥，姐姐，弟弟，妹妹，男朋友们。当然价位一定要合理，这个要跟你的厂家谈，只要销售量提高了，厂家自然会愿意给你比较低的代理价格。</P>
<P style="TEXT-INDENT: 2em">&nbsp; &nbsp; 再次强调，在学校这样的环境里广告实在是很重要的，广告方式要别出心裁，有吸引力。</P>
<P style="TEXT-INDENT: 2em"></P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200842623311420</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200842623311420</guid>
    <pubDate>Mon, 26 May 2008 14:33:11 +0800</pubDate>
    <dcterms:modified>2008-05-26T14:33:11+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[创业]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200842211654321</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前些天，在网上碰到大学同宿舍朋友，聊天时都感慨现在在中国的企业里，尤其是大型的企业里面论资排辈很严重。像我们刚毕业的大学生在企业里面严重受压制。虽然工作努力，待人和善，但是上面有资历老的前辈，自己几乎没有提升的可能。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 朋友学的是国际贸易专业，在海信销售。几个月前辞去工作到了一家广告媒体公司做市场，几天前聊天时提出想合作开个公司，并且提出了一个 思路比较新颖的方案，这个想法正合我意。现在很多毕业生都希望有份稳定的工作，极力考公务员，到机关工作，或者到公司小心谨慎的工作，努力想达到一个目的：不失业。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 现在，我是一名软件工程师，我始终认为我是一个不笨的人，甚至还比较聪明，我能把现在的工作做的很好，虽然以前没有高过嵌入式开发，但是现在也的心应手。在现在的行业里面软件开发还算是比较好的工作了，但是我所希望的生活不是这样的。我想自由支配自己的生活，想让自己的青春更加激情的释放，我决定放弃软件开发这个行业，进入商业。也许我会头破血流。这是我的选择，我无怨无悔！</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200842211654321</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200842211654321</guid>
    <pubDate>Thu, 22 May 2008 13:16:54 +0800</pubDate>
    <dcterms:modified>2008-05-22T13:16:54+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[经典]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320084151131489</link>
    <description><![CDATA[<div><STRONG><FONT size=2>&nbsp;<FONT color=#0000ff>1、我就像一只趴在玻璃上的苍蝇，前途一片光明，而我却找不到出路。 </FONT></FONT></STRONG>
<P align=left><FONT color=#0000ff size=2><STRONG>　　2、挤在北京，给首都添麻烦了……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　3、心中充满爱，看天下美女都是情人。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　4、台湾一日不收复，我一日不过4级！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　5、啊哦厄依乌迂波坡摸佛得特呢勒哥科喝机奇西知吃尸日资雌思</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　6、好好活着，因为我们会死很久很久……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　7、如果你看到面前的阴影，别怕，那是因为你的背后有阳光。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　8、狂欢是一群人的孤单……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　9、上帝给了我们七情六欲，我们却把它们变成了色情和暴力。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　10、帅有个屁用！到头来还不是被卒吃掉！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　11、让房价涨的再猛烈一些吧！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　12、谁能对偶的感情就像对人民币一样忠诚？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　13、流血了……会不会很疼？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　14、他们说我是BT，让我去做CT，结果我是ET。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　15、做一个徘徊在牛A和牛C之间的人。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　16、白天瞎JB忙，晚上JB瞎忙。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　17、我爱你，并不是因为你是谁，而是在你面前时，我是谁！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　18、一定是我的帅害S了我！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　19、生是她的人，死是她的吉祥物。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　20、如果太阳不出来了，我就不去上班了；如果出来了，我就继续睡觉！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　21、老子误吃了一瓶“乌鸡白凤丸”。这下可好，每个月都要流几天的鼻血。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　22、瞎子点灯，或许不是一种愚蠢，亦或是一种智慧，甚至气度……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　23、24K纯爷们！纯的！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　24、你真是个地道的美人啊。就是说你只有在地道里才算美人，因为地道里没灯。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　25、蹲在厕所里，想着500万……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　26、写什么写，就是写了你会信么？什么？你真信，你怎么那么幼稚啊！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　27、早知道前世的五百次回眸，能换来今生的与你相遇。我就该把头甩断，来换这一辈子与你相遇。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　28、彪悍的人生不需要解释。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　29、我的爱人都叫我第三者！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　30、天啦，我的衣服又瘦了！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　31、青春就像卫生纸。看着挺多的，用着用着就不够了。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　32、我一发怒，冬天就到了；冬天一发怒，我就变成秋裤男了。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　33、爷爷都是从孙子走过来的……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　34、你要是嫁人就先嫁给别人然后再嫁给我，带着他的存款领着他的妹妹，开着那宝马来。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　35、爱像圆周率，无限不循环……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　36、琴棋书画不会，洗衣做饭嫌累。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　37、一山不能容二虎，除非一公和一母。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　38、诚征小MM，共同来灌水；我灌长江头，君灌长江尾。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　39、水能载舟，亦能煮粥！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　40、也许似乎大概是，然而未必不见得。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　41、我喝酒是想把痛苦溺死，但这该死的痛苦却学会了游泳。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　42、不要等到人人都说你丑时才发现自己真的丑。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　43、如果你不能为你心爱的女人穿上嫁衣，请停下你解她衣扣的手。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　44、堕落并不可怕，可怕的是当一个人堕落时非常清醒！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　45、以前，脱下内裤看屁股；现在，拔开屁股看内裤。因为我穿的丁字裤。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　46、送你一份有史以来粪量最重的礼物，你一定会大吃一斤。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　47、我最喜欢的日子：1月31日；我最讨厌的日子：12月1日。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　48、夏天来了，天气热了，一群SB往北飞，一会儿排成个S字，一会儿排成个B字……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　50、你看得见我打在屏幕上的字，却看不到我掉在键盘上的泪……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　51、我是一条赤身裸体的蜈蚣！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　52、不对，就是碗是铁的，里边没饭你吃啥去？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　55、男人靠征服世界来征服女人！女人靠征服男人来征服世界！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　56、现在开始爱你晚不晚？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　57、我死了，但是在烈火中我又站起来了，你猜是涅磐，还是尸变？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　58、我对生命无悔，奈何心中有愧，只要不死……誓将RMB一赚到底！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　59、活着，以死的姿态……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　60、我悄悄的来，悄悄的走，挥一挥匕首，不留一个活口。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　61、如果每个女朋友用一个字来代替的话，我的情史可以写一部长篇小说了。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　62、最浪漫的三个字不是“我爱你”，而是“在一起”。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　63、叶子的离去，是树的不挽留，还是风的追求？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　64、我们虔诚的祈祷：年终的奖金只多不少；领导动情的承诺：新年的工作只少不多。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　65、爱情是骗来的，感情是睡来的。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　66、搞好工作，教好学生，做好网站，当好写手，活好人生……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　67、好想有个太太，和我谈心说爱。现实却很无奈，让我仍需等待！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　68、都是水何必装纯，都是狼何必装羊？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　69、带翅膀的不一定是天使，我妈说，那是鸟人。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　70、我是一只小小小小鸟，想要飞却飞也飞不高……咦？原来没长毛。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　71、有一种沉默叫霸气，有一种内敛叫个性，有一种简单叫深遂，有一种不屑叫自我。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　72、小时候老师给我讲“帅哥”的定义，我百思不得其解，后来同位给我拿出了一面镜子。OY！突然间我明白了。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　73、也因寂寞难耐，谈过几次恋爱。谁知屡战屡败，轻轻松松被踹！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　74、21世纪，什么最重要——我！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　75、错过一个人最可怕的方式就是：坐在她的身旁，你却知道永远都不会拥有她。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　76、生活真他妈好玩，因为生活老他妈玩我。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　77、我床上的不知道是谁媳妇，我媳妇不知道在谁的床上！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　78、以后不要在我面前说英文，OK？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　79、去他妈的爱情！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　80、大家都说我是个演员，是因为我一看见漂亮MM眼就圆……</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　81、林子大了，什么鸟都有。社会复杂了，什么人都有了。我是哪一类人呢，我正琢磨着呢？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　82、有钱男子汉，没钱汉子难！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　83、永远都不要停止微笑，即使是在你难过的时候，说不定有人会因为你的笑容而爱上你。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　84、世界上最遥远的距离不是生与死的离别，而是当我站在你面前你却不知道：我爱你！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　85、穿别人的鞋，走自己的路，让他们找去吧。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　86、我故意学习，故意工作，故意生活，故意活得像个人！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　87、长大了要娶唐僧做老公，想宠幸就宠幸，不想玩了就把他吃掉。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　88、从猴子变成人需要成千上万年，从人变回猴子只用一瓶酒。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　89、是你太坏！不是我不乖！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　90、我可能是太平凡了，没有个性！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　91、据说世界上惟一能维持永恒爱情的动物是刺猬——因为刺猬永远不可能太接近。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　92、网上越嚣张，网下越善良。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　93、在你没上线的时候，我总会看着你的资料发呆。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　94、爱情就像两个拉着橡皮筋的人，受伤的总是不愿意放手的那一个！</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　95、许多梦想被现实拿来充饥。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　96、我叫锄禾，你能叫当午吗？</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　97、我把硬币抛向空中：如果正面朝上，就上MSN，如果背面朝上，就上QQ，如果硬币立起来，我就去自习。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　98、昨天看到一个漂亮女孩，晚上想了她很久，早上就不记得他是什么样了，听说偶这叫一夜情。唉~~~</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　99、人生重要的不是所站的位置，而是所朝的方向。</STRONG></FONT></P>
<P align=left><FONT color=#0000ff size=2><STRONG>　　100、每天早上起床都要看一遍“福布斯”富翁排行榜，如果上面没有我的名字，我就去上班<FONT color=#0000ff size=2>。</FONT></STRONG></FONT></P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320084151131489</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320084151131489</guid>
    <pubDate>Thu, 15 May 2008 13:01:31 +0800</pubDate>
    <dcterms:modified>2008-05-15T13:01:31+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[我爱photo shop]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200841432024797</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在大学的时候为了曾经喜欢的一个女孩交作业，努力的学习了一段时间的photo shop 小有所成，也曾诞生下小范围流传的佳作，甚是得意。前些天帮朋友做了一张合影，朋友非常开心，我也十分高兴。刚好这些天比较有空，如果看到此帖的各位想制作新奇的数码照片，或者对自己的照片想做一些处理的可以给我留言，我会尽量按照大家的要求处理。呵呵</P>
<P>宗旨：&nbsp; 助人为乐！</P>
<P>&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200841432024797</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200841432024797</guid>
    <pubDate>Wed, 14 May 2008 15:20:24 +0800</pubDate>
    <dcterms:modified>2008-05-14T15:20:24+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[生活]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200841275628589</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一年前，满怀工作热情与美好的憧憬我走出了山大校园，来到了天津。踌躇满志，意气风发，决定用尽量最短的时间实现自己的梦想，衣锦还乡。24岁的我是一名软件工程师，有着充沛的体力，精力和想象力。12年的学校生活，让我的血液在体内急速的流淌，被压抑的激情需要急速的释放。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一年后，激情释放后的年轻的身体逐渐感到了生活的无奈，工作的疲惫。。。。。。</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200841275628589</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200841275628589</guid>
    <pubDate>Mon, 12 May 2008 19:56:28 +0800</pubDate>
    <dcterms:modified>2008-05-12T19:56:41+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[转载了一片感人至深的帖子]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200841110545951</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">你见过这么忠诚的战士吗？复员那天最感人一幕！<A href="http://5qbaobei.cn/"> </A></P>
<P style="TEXT-INDENT: 2em"></A>昨天下午，鄙人受命到武警浙江总队警犬班采访行将退伍的武警老兵。对鄙人而言，每年都要遇上有关老兵退伍的报道。事实上，老兵退伍时对部队怀有的那种恋恋不舍的心情每年都会让我感动一次，然而，昨天的那一幕，却令我更为动情。 </P>
<P style="TEXT-INDENT: 2em">昨天下午，浙江武警总队某支队警犬班的战士小鲁就要返乡了，据小鲁的班长王XX说，几天前退伍命令下达后，小鲁训导的两条德国牧羊犬“待发”和“大海”便烦躁不安，胃口不佳，每次小鲁喂食时，“待发”和“大海”不吃不喝，只是围着小鲁转圈。下午3点多，部队接小鲁前往火车站的吉普车到了，为让小鲁和他的两个无言的战友道别，王班长将“待发”和“大海”放了出来。让人既心酸又欣慰的是，“待发”仿佛理解小鲁即将离开，便抢着为小鲁拎包。此时，小鲁还不忘嘱咐“待发”和“大海”：“要听新的训导员的话，好好训练，有空我来看你们！”到了车边，“待发”将包包放入车内，似乎和小鲁一起整理行装。 </P>
<P style="TEXT-INDENT: 2em"></A>终于，载着小鲁的车子启动了，令人意想不到的事情发生了，只见工作犬出生的“待发”象出鞘的利剑，“嗖”的一下窜到车顶，无奈，汽车只好停下，让“待发”和“大海”继续与小鲁道别......我看到小鲁的眼睛里那晶晶亮的东西。在场的人无不唏嘘不已。 </P>
<P style="TEXT-INDENT: 2em">真的，昨天下午我就是这样酸着鼻子拍片的。 </P>
<P style="TEXT-INDENT: 2em"></A>班长在给小鲁整理军装 </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://club.xiaonei.com/upfiles/20070416/club__fghe9rkh249018001176721376.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__0oewtpzt387244001176721408.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__auulhjb3226604001176721418.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__mddjsthb994357001176721424.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__37r6jnzq864041001176721451.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__xnvekz1x722416001176721457.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__e8fty4lq739579001176721512.jpg" border=0> </A></P>
<P style="TEXT-INDENT: 2em"><A href="http://5qbaobei.cn/"><IMG src="http://club.xiaonei.com/upfiles/20070416/club__s3pgx2mf879532001176722111.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__ocnknnli211617001176722128.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__jwp2cns5366711001176722137.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__mhzyvath479237001176722146.jpg" border=0><IMG src="http://club.xiaonei.com/upfiles/20070416/club__mjsaurwj615157001176722175.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em"><A href="http://5qbaobei.cn/">也许这一吻，就成了永别</A></P>
<P style="TEXT-INDENT: 2em"><A href="http://5qbaobei.cn/"><IMG src="http://club.xiaonei.com/upfiles/20070416/club__ezqza5si867499001176722184.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">令人意想不到的事情发生了，只见工作犬出生的“待发”象出鞘的利剑， </P>
<P style="TEXT-INDENT: 2em">“嗖”的一下窜到车顶，无奈，汽车只好停下， </P>
<P style="TEXT-INDENT: 2em">让“待发”和“大海”继续与小鲁道别...... </P>
<P style="TEXT-INDENT: 2em"><A href="http://5qbaobei.cn/">&nbsp;</A></P>
<P style="TEXT-INDENT: 2em"><A href="http://5qbaobei.cn/"><IMG src="http://club.xiaonei.com/upfiles/20070416/club__s0mkkwat530085001176722309.jpg" border=0></A></P>
<P style="TEXT-INDENT: 2em">不知道你看完后是什么感觉，但我真的流泪了。好心酸的场面。。。。。。</P>
<P style="TEXT-INDENT: 2em">人生一世，这种感动又能有几回呢？</P>
<P style="TEXT-INDENT: 2em">如果它们感动了你，请你回帖支持</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200841110545951</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200841110545951</guid>
    <pubDate>Sun, 11 May 2008 10:54:05 +0800</pubDate>
    <dcterms:modified>2008-05-11T10:59:41+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[  无耻超女和光荣武警 看了心寒的                    ]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/660225032008411102752873</link>
    <description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<P style="TEXT-INDENT: 2em">一个当时在场的非粉丝的目击纪录 </P>
<P style="TEXT-INDENT: 2em">　　知道那武警为什么打她不~~~(原话) </P>
<P style="TEXT-INDENT: 2em">　　　　 武警: 对不起,小姐,请出示出入证, </P>
<P style="TEXT-INDENT: 2em">　　　　 唐大小姐回头斜眼一看,不理 </P>
<P style="TEXT-INDENT: 2em">　　　　 武警跑过去:对不起,没有出入证这不可以进入,请出示出入证. </P>
<P style="TEXT-INDENT: 2em">　　　　 唐大小姐:走开,你们这些看门狗,我有急事,误了时间你们这些狗能担当得起吗? </P>
<P style="TEXT-INDENT: 2em">　　　　 武警:请放尊重点,你有再大的事,没有出入证我们都不会让你进去的.（上前拉住她) </P>
<P style="TEXT-INDENT: 2em">　　　　 唐大小姐:拿开你的狗爪子(一脚踢过去) </P>
<P style="TEXT-INDENT: 2em">　　　　武警实在忍不了侮辱了,手抓住她的肩膀往前一推,这一推是成45度角向下推,武警力气都比较大,一推就推的她往地上摔了一跤,脸刚好撞在地上 </P>
<P style="TEXT-INDENT: 2em">一个新浪网友的留言 </P>
<P style="TEXT-INDENT: 2em">打唐笑的战士，山东人，20岁，姓胡。当时唐笑要进入湖南广电大楼，小胡请她出示证件，唐笑不予理睬，继续往里面走，小胡将她挡住，唐笑张口骂了句“看门狗”，并用手中的提包击打小胡，小胡此时仍然只是告诉唐笑没有证件不能进去，这个过程中，小胡挡住唐笑，唐笑又执意要进去，两人不免有身体接触，直到唐笑一腿踢到了小胡的裆部，小胡此时也不冷静扇了唐笑两耳光......事后,对事情的经过,广电保卫部门和武警中队详细询问了两个当事人,唐笑和小胡都在记录上签了字! </P>
<P style="TEXT-INDENT: 2em">　　然而,当面对媒体,面对网络的时候,唐笑摆出了一副弱者的形象!是的,唐笑在体能,力量,性别上是绝对的弱者,但是唐笑拥有舆论的强势,拥有行政权利上的强势,而小胡只是一个小小的武警战士!他所在的部队在舆论的压力下,为了社会的和谐,只能采取息事宁人的态度处理这个事情!小胡面临的很可能是一个不大不小的处分,这个处分,已经足以让他在部队的一切梦想破灭!这就是两者真正的强弱对比. </P>
<P style="TEXT-INDENT: 2em">　　让人悲哀的是,在整个事件中,许多人怀着同情"弱者"的慈悲,或是出于粉丝的狂热,对我们的武警战士进行着口诛笔伐!或许他们觉得是非并不重要,或者因为当前社会面上颠倒是非的事情太多,但是他们在这个事情上的态度已经让所有的军人和曾经身为军人的老兵心寒了——难道我们保卫的就是人民，这就是我们用热血和青春保卫的人民！让我们有所安慰的是：在这场舆论战中，还有许多人公正公平地看待评价了这件事。 </P>
<P style="TEXT-INDENT: 2em">　　我们现在的部队，或许有这样，那样的腐败或者危机，但是当洪水，非典，战争来临的时候，第一个站起来直面危机的，永远是我们的军人，我们最广大的战士胸腔的热血仍在，我们军队80年形成的军魂还在。也许就在这个夏天，小胡就要和许许多多的武警战士一起，走上长沙抗洪抢险的第一线，去保护那些侮辱她，蔑视她，执意要处分他的长沙女人！ </P>
<P style="TEXT-INDENT: 2em">　　商女不知亡国恨,隔江仍唱后庭花，很多事情不能用一种娱乐的态度去轻佻地评论！当许许多多国人不辨是非，仅仅出于自身好恶，指责一位恪尽职守的哨兵的时候，一场民族的危机是不是正在悄然酝酿呢？ </P>
<P style="TEXT-INDENT: 2em">看看他们的帽徽，他们都是武警 </P>
<P style="TEXT-INDENT: 2em">强烈鄙视这种行为，不声讨唐笑对不起自己的良心！ </P>
<P style="TEXT-INDENT: 2em">当天晚上 电视台 高层领导 带着武警战士和中队长还有这名战士竟然到 唐笑住的酒店相唐笑道歉~~~~这是什么 世界 </P>
<P style="TEXT-INDENT: 2em">事后 有关部门 还传出消息说是要开除这名 忠于职守的武警战士 真是可笑 ！！！</P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/227x583_113735.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em">超女算什么啊 </P>
<P style="TEXT-INDENT: 2em">能和咱们中国的军人相比吗 </P>
<P style="TEXT-INDENT: 2em">同意我观点的就顶一下 </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/500x285_141581.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/500x251_163965.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/500x340_182795.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/500x340_182891.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/500x340_191668.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/484x240_132226.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/500x226_121268.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/500x203_120079.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/394x600_276728.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/500x648_339464.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/610x729_89333.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em">看看这幅丑恶的嘴脸．．．．． </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/600x492_196312.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/365x436_128081.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/500x333_227415.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/400x341_125034.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/400x277_200925.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/400x291_123402.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/491x328_19067.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/590x444_56888.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/600x440_33302.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/520x780_132981.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/400x395_136304.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/520x360_104356.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/800x617_134167.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img2.bbs.163.com/school/qi/qiaonan-824/400x238_119338.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img3.bbs.163.com/school/qi/qiaonan-824/400x301_197407.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em"><IMG src="http://img1.bbs.163.com/school/qi/qiaonan-824/500x560_153897.jpg" border=0> </P>
<P style="TEXT-INDENT: 2em">图为外国MM向中国军人敬礼！向五星红旗敬礼！ </P>
<P style="TEXT-INDENT: 2em">我一向不喜欢超女,的.但看了这个叫唐笑的事件,我也就知道,原来超女也就是那么个东西. </P>
<P style="TEXT-INDENT: 2em">正如有人所说的,如果湖南电视台把一群狗拉去弄一个什么超级好狗之类的,应该也能弄出名. 我们中国的军人就不像他们那么爱出名，可是我们的军人不用他们捧也一样的出名，并且是这些所谓的超女们没法比的。 </P>
<P style="TEXT-INDENT: 2em">这几天在网上看了这些事，弄的实在不开心。这超女既然也挑战起武警叔叔来了。 </P>
<P style="TEXT-INDENT: 2em">可笑的是，这个社会太过于病态了，当一位忠诚的战士，尽忠职守的守在自己的岗位上，履行自己的职责，最后却不得不屈辱的向一位看似弱小，实则彪悍的所谓的女名人低头认错。当这位女名人的粉丝们在无情的不分青红皂白的，不明是非道理的指责这位忠诚的战士，炮轰国家的警觉制度，侮辱中国的军人的时候，我不得不感叹这个社会真的病态已经病入膏肓了。不得不说这些所谓的忠诚粉丝他们连最起码的做人的良心都被狗吃了。想想如今洪水四处行虐，险情时时发生，不记得的却正是那些他们所鄙视的武警战士在用生命抗洪，流血抢险，而不是他们眼中的超级无敌女生或是什么鸟的偶像。 </P>
<P style="TEXT-INDENT: 2em">整天变态的喊着“XXX，我爱你。”，我想问一句，你们怎么就不能多爱点你的父母，多爱一点你的国家呢？ </P>
<P style="TEXT-INDENT: 2em">当有一天，战争爆发了，粉丝们，你敢为了保护你的偶像去玩命吗？ </P>
<P style="TEXT-INDENT: 2em">网上曾有一位兄弟写过这样一句诗：“超女不知亡国恨，隔江任唱后庭花。”其用描述超女的实质性真的可谓是入骨三分&nbsp; </P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/660225032008411102752873</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/660225032008411102752873</guid>
    <pubDate>Sun, 11 May 2008 10:27:52 +0800</pubDate>
    <dcterms:modified>2008-05-11T10:57:34+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[强诗]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320084511411481</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">怒&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">何故&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">昨日暮&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">偶遇见她&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">把纤纤玉手&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">交那衰人牵住&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">盈盈笑语左右顾</A></P>
<P style="TEXT-INDENT: 2em"><A href="http://www.5qbaobei.cn/">&nbsp;&nbsp;&nbsp; </A></P>
<P style="TEXT-INDENT: 2em">神采飞扬凌波微步&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">美眸中一片深情倾注&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">似前年与我同在湖畔路&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">也这般附耳交顾低语倾诉&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">如今见我头也不点形同陌路&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">我发现自己旧情难忘六神无主&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">两眼痴呆双脚生根心内如被汤煮&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">像我这么优秀的男子她总嫌我老土&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">那土鳖相貌恶心行止猥琐她爱他粗鲁&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">女孩子搞不清她想什么我越琢磨越胡涂&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">明知道她与自己不合适想忘记她另起灶炉&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">到头来都只能是剪不断理还乱最终于事无补&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">兄弟我长这么大从来没怕过谁却栽给了这个主&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">看来是上辈子欠她很多钱早知如此就不该和她堵&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">碰上她算我倒霉下次说什么也得找个温柔姑娘相处&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">总算明白这世上漂亮不能当饭吃往往还让你难堪重负&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">从现在起踏踏实实勤勤恳恳谦虚谨慎待人有礼爱护公物&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">切记过马路左右看要走人行斑马线要想富少生孩子多种树&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">化悲痛为力量一边努力学习一边时刻准备着开发祖国大西部&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">大丈夫何患无妻没有了你虽然孤独但也使我从此不再一叶障目&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">这也使我好好反思为什么会失败总结经验教训继续探索革命道路&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">我会遇上好姑娘没命地追她想她爱她决不放过她不管她属虎还属兔&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">回贴&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">这个有志青年是个好同志失恋了不失魂落魄自暴自弃颇有男儿气度</A></P>
<P style="TEXT-INDENT: 2em"><A href="http://www.5qbaobei.cn/">&nbsp;</A></P>
<P style="TEXT-INDENT: 2em">他虽然遭遇了现代女陈世美被无情抛弃但没有怪命也不埋怨愤怒&nbsp; </P>
<P style="TEXT-INDENT: 2em">反而擦亮眼睛激发斗志将其丑恶行径卑鄙嘴脸进行了深刻揭露&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">再次论证了阶级斗争将会在一定范围内长期存在的精辟论述&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">展望了初级阶段革命尚未成功同志仍需努力这条基本道路&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">尤其难能可贵的是该同志认真反省自己并触动灵魂深处&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">认识到过去在湖畔漫步是小资产阶级情调的严重错误&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">险些为漂亮的外表所迷惑中了糖衣炮弹的惯用招数&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">理论联系实际痛定思痛如梦方醒才知道差点迷途&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">漂亮不能当饭吃漂亮不是本质不是革命的全部&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">语言虽然通俗但体现了有志青年的朴实感悟&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">批评与自我批评言辞感人真可谓发自肺腑&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">并萌发修身齐家治国平天下的远大抱负&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">体现了由此及彼由表及里的思想反复&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">像他这么优秀的青年怎么能说他土&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">自然是徒具外表的女人有眼无珠&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">天涯何处无芳草佳丽不问出处&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">好马不吃回头草旧情勿枉顾&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">兔子不吃窝边草以为三窟&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">百步之内必有芳草无数&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">也许有天她变成弃妇&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">才会想起你的好处&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">再回来找你倾诉&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">一切已经太晚&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">你也有今天&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">一屑不顾&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">不理她&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">扮帅&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">酷 </A></P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320084511411481</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320084511411481</guid>
    <pubDate>Mon, 5 May 2008 13:14:11 +0800</pubDate>
    <dcterms:modified>2008-05-11T10:57:12+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[老师经典语录]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/660225032008451108594</link>
    <description><![CDATA[<div><FONT size=4><FONT color=#ff00ff>&nbsp;1.</FONT><FONT color=#99cc00>男同学站在我左边，女同学站在我右边，其他人原地不动...结果就他没动。 </FONT></FONT>
<P><FONT color=#99cc00 size=4>　<FONT color=#ff00ff>　2.</FONT>有一天外面下大雨，老师满脸雨水的走进教室，在讲桌前不知道找着什么东西，找了一会就问前排的同学:“我擦纸的脸呢?”</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>3.</FONT>线段a是线段b的一半，那线段b是线段a的多少呢？(全班皆静，候高论，半晌后)线段b就是线段a的两半。（晕）</FONT></P>
<P><FONT color=#99cc00 size=4>　<FONT color=#ff00ff>　4.</FONT>初中，某数学老师讲方程式变换，在讲台上袖子一挽大声喝道：同学们注意！我要变形了！……</FONT></P>
<P><FONT color=#99cc00 size=4>　<FONT color=#ff00ff>　5.</FONT>一同学在下面闹，我们老师说：“你给我站到黑板上面去！！” 高难度啊。</FONT></P>
<P><FONT color=#99cc00 size=4>　<FONT color=#ff00ff>　6.</FONT>我初中老师讲题目喜欢用投身其中……“我的底面半径是20CM，我的高是50CM，那么我……”下面有人说“是饭桶……”全班爆笑……</FONT></P>
<P><FONT color=#99cc00 size=4>　<FONT color=#ff00ff>　7.</FONT>初中英语老师是个秃子，一天上课，他问一个同学：“what day is today?’（我的头是秃头？）同学想了一下，回答：“Yes.”</FONT></P>
<P><FONT color=#99cc00 size=4>　<FONT color=#ff00ff>　8.</FONT>高三数学摸底一男生问：老师，画图没有铅笔，是借一支还是用钢笔？老师（老年妇女）答：随你的大小便吧。</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>9.</FONT>高中的代数老师：“说话不许出声音。”</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>10.</FONT>高中一化学老师兼教导主任做题时故意做错，然后让某同学找出其中的错误。该同学艰难的答出之后，老师赞许而很严肃地说：“很好，你看出了老师的破腚（绽）。”众皆木然，下课后，老师刚走出去，全班哄堂大笑。</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>11.</FONT>某日，我们高中数学老师跟我们讲函数周期表时，讲到“周期”二字时激动地走下讲台，对着全班同学说：“你们还不了解周期啊，真的是猪都比你们聪明些。”然后他指着第一排的一个女生说：“你知道什么是周期吗？你跟他们解释一下。”全班均晕倒。</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>12.</FONT>我们初中时候规定升国旗时候要穿校服，结果总有一些人没有穿校服或者是单只穿裤子或者是衣服。然后每次升旗之前校长都拿着一个扩音喇叭在那里说：“有的同学不穿衣服，有的同学不穿裤子，有的就干脆衣服裤子都不穿” </FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>13.</FONT>语文老师教赤壁的课文，说起曹兵在华容道互相践踏，感慨道：人流是可怕的……</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>14.</FONT>某天上数学偶看到偶们数学老师牙上有片绿叶子（老师中午估计是吃韭菜馅的饺子了）过了一会发现叶子没了………下课的时候发现在我们班某女生的脖子上……</FONT></P>
<P><FONT color=#99cc00 size=4>　　<FONT color=#ff00ff>15.</FONT>初中语文课的女老师刚从师大毕业，什么都好，就是喜欢突击式地抽同学上黑板默写名词解释。方法是，老师口述某个词，同学默写，并加解释。 记得有一次，抽到一个不爱听讲的男生。老师一遍一遍地重复念“间或”，那男生抓着头皮在黑板前熬了好几分钟，突然刷刷刷地写下： 贱货：下流呸，不是好东西。全班暴笑，女老师气得面红耳赤，一句话都讲不出。 </FONT></P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/660225032008451108594</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/660225032008451108594</guid>
    <pubDate>Mon, 5 May 2008 13:10:08 +0800</pubDate>
    <dcterms:modified>2008-05-05T13:10:08+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[fedora 中smb的配置]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200832562342930</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">将光盘中三个RPM包安装后。。。。。启动SMB服务后</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">一般会出现要求登陆用户名和密码&nbsp;&nbsp; 的问题</P>
<P style="TEXT-INDENT: 2em">解决方法：给SMB添加用户，譬如LEVI的话</P>
<P style="TEXT-INDENT: 2em">#addusr levi</P>
<P style="TEXT-INDENT: 2em">#smbpasswd –a levi</P>
<P style="TEXT-INDENT: 2em">然后会要求输入密码，，，，输入即可</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">这样的用户可能很多权限没有，把root设为SMB用户就没有问题了</P>
<P style="TEXT-INDENT: 2em">#smbpasswd –a root</P>
<P style="TEXT-INDENT: 2em">哈哈&nbsp; 没有问题了</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">接下来进去了&nbsp; 但是提示没有权限啊</P>
<P style="TEXT-INDENT: 2em">方法：把security=share&nbsp; </P>
<P style="TEXT-INDENT: 2em">还是不行 在共享选项里</P>
<P style="TEXT-INDENT: 2em">public=yes</P>
<P style="TEXT-INDENT: 2em">guest ok=yes</P>
<P style="TEXT-INDENT: 2em">这样就可以了</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">对共享的那个文件夹进行权限修改</P>
<P style="TEXT-INDENT: 2em">#chmod 777 –R /home</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200832562342930</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200832562342930</guid>
    <pubDate>Fri, 25 Apr 2008 18:23:42 +0800</pubDate>
    <dcterms:modified>2008-04-25T18:23:42+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[学习sip的心得]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200832231129592</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">１．系统的组成</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; 一个ＳＩＰ系统主要由两部分组成：用户代理和网络服务器。用户代理有用户代理客户机（ＵＡＣ打电话者）和用户代理服务器（ＵＡＳ接电话者），其中用户代理客户机用于发起呼叫，而用户代理服务器则用于响应呼叫。用户代理客户机和用户代理服务器构成了用户端必备的应用程序，由这两个应用程序完成呼叫的发起和接收（两者角色是可以互换的）。网络服务器也有两类，它们是代理服务器（ｐｒｏｘｙ）和重定位服务器（ｒｅｄｉｒｅｃｔ）。代理服务器有点像中继器，它本身并不对用户请求进行响应，只是转发用户的中继器，然后将自身地址加入该消息的路径头部分，以保证将响应按原路返回并防止环路的发生。重定位服务器非常类似于ＤＮＡ，它收到用户的请求后，若判定自身不是目的地址，则向用户响应下一个应访问服务器的地址，而不是转发请求报文。</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">2网络</P>
<P style="TEXT-INDENT: 2em">SIP 将网络复杂环节推向网络边缘，即终端部分。ＳＩＰ协议需要相对智能的终端，即终端需要包含用户代理客户机构和用户代理服务器两部分，由这两部分实现呼叫请求、呼叫答应和一些用户的特定需要，正是因为ＳＩＰ系统有了相对智能的终端系统，所以它才有可能实现用户个性化的需要</P>
<P style="TEXT-INDENT: 2em">其中ＩＰ网络包含ＳＩＰ系统所必需的各种网络服务器。一次正常接续的流程是：</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; １）ＵＡＣ向网络服务器（ｐｒｏｘｙ或ｒｅｄｉｒｅｃｔ）发出呼叫请求；</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ２）网络服务器（ｐｒｏｘｙ或ｒｅｄｉｒｅｃｔ）通过名字查找，用户定位，最终找到被叫ＵＡＳ；</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ３）被叫ＵＡＳ响应用户请求（拒绝或接受请求），该响应沿原路返回；</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ４）主叫ＵＡＣ收到响应后，接通被叫或者终止这次呼叫请求；</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; 对于用户终端是非智能终端的场合（如PSTN电话），也可以使用ＳＩＰ协议作为呼叫信令，但这将大大削弱ＳＩＰ协议特有的优势。</P>
<P style="TEXT-INDENT: 2em">网关设备应兼有ＵＡＣ和ＵＡＳ的功能，相当于将智能用户终端向网络中间推移，由网关实现智能终端的功能。但在这种情况下，ＳＩＰ协议所支持的用户个性化特点将大大被削弱，因为网关需要为多个用户而不是为单个用户服务。因此我们认为ＳＩＰ协议更适用于智能用户终端，以现有的松散型Ｉｎｔｅｒｎｅｔ为基础，和现有的Ｉｎｔｅｒｎｅｔ上使用的协议紧密结合。另外可以考虑在用户电话机前加前置机的办法来取代网关设备，由前置机来实现ＵＡＣ和ＵＡＳ的功能，这样做的代价是将增加用户购买前置机的开销。</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">３．ＳＩＰ消息</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＳＩＰ协议主要有六类消息，它们分别是ＩＮＶＩＴＥ、ＢＹＥ、ＯＰＴＩＯＮ、ＡＣＫ、ＲＥＧＩＳＴＥＲ和ＣＡＮＣＥＬ消息。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＩＮＶＩＴＥ：ＩＮＶＩＴＥ消息用于发起呼叫请求。ＩＮＶＩＴＥ消息包括消息头和数据区两部分。ＩＮＶＩＴＥ消息头包含主、被呼叫的地址信息，呼叫主题和呼叫优先级等信息；数据区则是关于会话媒体的信息，可由会话描述协议ＳＤＰ来实现，ＳＤＰ和Ｈ．２４５协议具有类似的功能，主要用于描述终端的媒体处理能力。由于数据区对于ＳＩＰ协议是不可见的，因此ＳＩＰ协议也可以和Ｈ．２４５协议相结合使用。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＢＹＥ：当一个用户决定中止会话时，可以使用ＢＹＥ表示会话结束。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＯＰＴＩＯＮＳ：用于询问被叫端的能力信息，但ＯＰＴＩＯＮＳ本身并不能发起呼叫。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＡＣＫ：对已收到的消息进行确认回答。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＲＥＧＩＳＴＥＲ：用于用户向ＳＩＰ服务器传送位置信息或地址信息。</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＣＡＮＣＥＬ：取消当前的请求，但它并不能中止已经建立的连接。</P>
<P style="TEXT-INDENT: 2em">４．ＳＩＰ的特点 </P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; ＳＩＰ协议具有简单、扩展性好以及和现有的Ｉｎｔｅｒｎｅｔ应用紧密的特点。简单是指仅用三条消息ＩＮＶＩＴＥ、ＢＹＥ和ＡＣＫ与四个头（Ｔｏ， Ｆｏｒｍ，Ｃａｌｌ－ＩＤ，ＣＳｅｑ）就能实现简单的Ｉｎｔｅｒｎｅｔ电话</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200832231129592</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200832231129592</guid>
    <pubDate>Tue, 22 Apr 2008 15:11:29 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:11:29+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[虚拟机下挂载u盘]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320083223935911</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">在使用中需要和宿主系统WindowsXP交换信息。除了配置共享文件夹外，还可以使用U盘。 插入U盘，在虚拟机识别出USB之后，进入root用户，用fdisk -l /dev/sdb 或 fdisk -l /dev/hdb 查看，会看到U盘被识别为sdb1，执行完以上命令后，如果没有任何信息显示,你需要先执行以下这此命令 </P>
<P style="TEXT-INDENT: 2em">cat /proc/scsi/scsi </P>
<P style="TEXT-INDENT: 2em">这个文件是否存在，和是否有usb-storage </P>
<P style="TEXT-INDENT: 2em">(USB硬盘对应的设备文件是什么?)lsmod查看一下是否有usb-storage scsi_mod sd_mod </P>
<P style="TEXT-INDENT: 2em">没有就 </P>
<P style="TEXT-INDENT: 2em">modprobe usb-storage </P>
<P style="TEXT-INDENT: 2em">modprobe scsi_mod </P>
<P style="TEXT-INDENT: 2em">modprobe sd_mod </P>
<P style="TEXT-INDENT: 2em">然后再试,就可以了 先在/mnt建一个新的文件夹，例如usb</P>
<P style="TEXT-INDENT: 2em">mkdir /mnt/usb使用mount命令挂载即可:mount -t vfat /dev/sdb1 /mnt/usb挂载上了U盘。使用完了别忘了卸载：</P>
<P style="TEXT-INDENT: 2em">umount /dev/sda1</P>
<P style="TEXT-INDENT: 2em">或者</P>
<P style="TEXT-INDENT: 2em">umount /mnt/usb</P>
<P style="TEXT-INDENT: 2em">还要保证当前路径不再在usb里面，否则可能会得到device busy的警告信息。&nbsp;</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320083223935911</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320083223935911</guid>
    <pubDate>Tue, 22 Apr 2008 15:09:35 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:09:35+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[OnOk和OnCancle  按钮决定DoModal的返回值  ]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320083223839796</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">CDialog::OnOk和CDialog::OnCancle&nbsp; 按钮决定了DoModal的返回值&nbsp; </P>
<P style="TEXT-INDENT: 2em">如果是CDialog::OnOk回值是(1) </P>
<P style="TEXT-INDENT: 2em">如果是CDialog::OnCancle则返回值是(2)&nbsp; </P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320083223839796</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320083223839796</guid>
    <pubDate>Tue, 22 Apr 2008 15:08:39 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:08:39+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[qt手动定义槽]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320083223236475</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">用文本的方式添加一个槽&nbsp; 要用到moc工具&nbsp; </P>
<P style="TEXT-INDENT: 2em">现在以一个简单的例子mytest为例&nbsp;&nbsp; 讲讲这个过程</P>
<P style="TEXT-INDENT: 2em">一 先写头文件mytest.h</P>
<P style="TEXT-INDENT: 2em">#include&lt;qpushbutton.h&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;stdlib.h&gt;&nbsp;&nbsp; 后面用到close()函数</P>
<P style="TEXT-INDENT: 2em">#include &lt;qwidget.h&gt;&nbsp; 框架函数</P>
<P style="TEXT-INDENT: 2em">class Test: public QWidget</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">Q_OBJECT&nbsp; 用moc定义自己的槽时&nbsp; 必需用到这个东西</P>
<P style="TEXT-INDENT: 2em">public:&nbsp;&nbsp;&nbsp; 构造函数</P>
<P style="TEXT-INDENT: 2em">Test();</P>
<P style="TEXT-INDENT: 2em">public slots:&nbsp;&nbsp; &nbsp;&nbsp;声明自己的槽&nbsp; (必须有类型)</P>
<P style="TEXT-INDENT: 2em">void levi-exit();&nbsp;&nbsp; 槽名&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">private:</P>
<P style="TEXT-INDENT: 2em">QPushButton * btn ;&nbsp;&nbsp; 定义一个按钮指针</P>
<P style="TEXT-INDENT: 2em">};</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">二&nbsp;&nbsp; 上面是头文件&nbsp; 下面来写mytest.cpp 文件</P>
<P style="TEXT-INDENT: 2em">#include “mytest.h”&nbsp; </P>
<P style="TEXT-INDENT: 2em">Test::Test()</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">QFont font(“Times”,14,QFont::Bold)&nbsp;;&nbsp; 定义字体(字体,字号,加粗)</P>
<P style="TEXT-INDENT: 2em">btn=new QPushButton(“button”,this);&nbsp;&nbsp;&nbsp; (给指针分配内存)</P>
<P style="TEXT-INDENT: 2em">btn-&gt;setGeometry(10,10,100,20);&nbsp;&nbsp;&nbsp; 给按钮定位 和 大小</P>
<P style="TEXT-INDENT: 2em">btn-&gt;setMiniSize(100,20);&nbsp; 设置最小和最大值 也就是 大小不变了</P>
<P style="TEXT-INDENT: 2em">btn-&gt;setMaxiSize(100,20);</P>
<P style="TEXT-INDENT: 2em">btn-&gt;setFont(font);&nbsp;&nbsp;&nbsp; 应用字体</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">connect(btn,SIGNAL(clicked),this,SLOT(levi-exit));&nbsp; 连接(按钮名,信号,接收物槽)</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">void&nbsp; Test::levi-exit()&nbsp; 定义槽</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">qWarning(“test here”);&nbsp;&nbsp; 测试一下 能不能接收到</P>
<P style="TEXT-INDENT: 2em">close();&nbsp;&nbsp; 关闭窗口</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">到此&nbsp; 已经完成程序了&nbsp;&nbsp; 下面 写一下主函数main.cpp</P>
<P style="TEXT-INDENT: 2em">#include &lt;qapplication&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;mytest.h&gt;</P>
<P style="TEXT-INDENT: 2em">#define Q_NO_WIZARD</P>
<P style="TEXT-INDENT: 2em">int main(int argc ,char **argv)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">Test&nbsp; dlg:</P>
<P style="TEXT-INDENT: 2em">QApplication a(argc,argv);&nbsp; 实现对象&nbsp; </P>
<P style="TEXT-INDENT: 2em">a.setMainWidget(&amp;dlg);&nbsp;&nbsp; 设置主框</P>
<P style="TEXT-INDENT: 2em">dlg.show();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示</P>
<P style="TEXT-INDENT: 2em">return a.exec();</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">现在 程序都全了&nbsp;&nbsp; 下一步我们生成工程</P>
<P style="TEXT-INDENT: 2em">#progen –t app.t –o&nbsp; mytest.pro</P>
<P style="TEXT-INDENT: 2em">会生成mytest.pro 文件</P>
<P style="TEXT-INDENT: 2em">#tmake –o Makefile&nbsp; mytest.pro</P>
<P style="TEXT-INDENT: 2em">会生成Makefile文件</P>
<P style="TEXT-INDENT: 2em">将makefile 头文件和库的路径修改后&nbsp; 执行 make 命令 可以生成可执行文件</P>
<P style="TEXT-INDENT: 2em">mytest</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">#qvfb –width 600&nbsp; -height 480 &amp;&nbsp;&nbsp; 生成虚拟框</P>
<P style="TEXT-INDENT: 2em">#./mytest&nbsp;&nbsp; -qws&nbsp; 可以运行&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">此时点击&nbsp; button按扭&nbsp; 框会退出</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320083223236475</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320083223236475</guid>
    <pubDate>Tue, 22 Apr 2008 15:02:36 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:02:36+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[静态、共享和动态库的使用]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320083223131590</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp; 
<TABLE cellSpacing=1 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top>
<P></P>
<P style="TEXT-INDENT: 2em">静态、共享和动态库的使用</P></TD></TR>
<TR>
<TD vAlign=top>
<P></P>
<P style="TEXT-INDENT: 2em">　　C语言中有一些函数不需要进行编译，有一些函数也可以在多个文件中使用。一般来说，这些函数都会执行一些标准任务，如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译，然后将它们放置在一些特殊的目标代码文件中，这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。 </P>
<P style="TEXT-INDENT: 2em">　　不同类型的应用程序将会使用不同的函数库。例如：libdbm库中组包含了对数据库文件进行访问的dbm函数，需要对数据库进行操作的程序就会与该库进行连接。数学应用程序将使用数学库libm，X-Windows应用程序将使用Xlib库，libX11。另外，所有的程序都将使用标准的C函数库。libc，该库中包含了诸好内存管理或输入输出操作的基本函数，这些库都存放在/usr/lib这些系统公用的目录中，系统中的任何用户都可以利用这些库。当然用户也可以建立自己专用的库函数，供自己或其它指定的人员使用。 </P>
<P style="TEXT-INDENT: 2em">　　库可以有三种使用的形式：静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中，而共享库只是在程序开始运行时才载入，在编译时，只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入，但与共享库不同的是，使用的库函数不是在程序运行开始，而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存，腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容，只是包含了对库函数的引用，因此代码的规模比较小。 </P>
<P style="TEXT-INDENT: 2em">　　已经开发的大多数库都采取共享库的方式。ELF格式的可执行文件使得共享库能够比较容易地实现，当然使用旧的a.out模式也可以实现库的共享。Linux系统中目前可执行文件的标准格式为ELF格式。 </P>
<P style="TEXT-INDENT: 2em">　　GNU库的使用必须遵守Library GNU Public License(LGPL许可协议)。该协议与GNU许可协议略有不同，开发人员可以免费使用GNU库进行软件开发，但必须保证向用户提供所用的库函数的源代码。 </P>
<P style="TEXT-INDENT: 2em">　　系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同，后缀名也不一样。共享库的后缀名由.so和版本号组成，静态库的后缀名为.a。采用旧的a.out格式的共享库的后缀名为.sa。 </P>
<P style="TEXT-INDENT: 2em">　　libname.so.major.minor </P>
<P style="TEXT-INDENT: 2em">　　libname.a </P>
<P style="TEXT-INDENT: 2em">　　这里的name可以是任何字符串，用来唯一标识某个库。该字符串可以是一个单字、几个字符、甚至一个字母。数学共享库的库名为libm.so.5，这里的标识字符为m，版本号为5。libm.a则是静态数学库。X-Windows库名为libX11.so.6，这里使用X11作为库的标识，版本号为6。 </P>
<P style="TEXT-INDENT: 2em">　　使用gcc编译器就可以将库与自己开发的程序连接起来，例如：libc.so.5中包含了标准的输入输出函数，当连接程序进行目标代码连接时会自动搜索该程序并将其连接到生成的可执行文件中。标准的输入输出库中包含了许多基本的输入输出函数，如printf函数等。也可以连接其它的一些系统函数库，如数学库等，但与libc.so.5不同，大部分其它的系统库需要在命令行中显式指定所用的库名。 </P>
<P style="TEXT-INDENT: 2em">　　在/usr/lib和/lib目录中可以找到绝大多数的共享库。连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中，在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序也会对列出的这些目录进行搜索。在默认情况下，Linux将首先搜索指定库的共享版本，如果找不到，才会去搜索静态版本。在对共享库进行更新或安装新库后，必须运行ldconfig命令更新/etc/ld.conf文件中相应的项(如果使用RPM进行安装，一般会自动进行更新，不过也不能保证这一点)。 </P>
<P style="TEXT-INDENT: 2em">　　在gcc编译器中引用可搜索到的目录中的库文件时，需要使用-l选项和库名。在gcc命令行上输入-lm可以在程序中连接标准算术库，-l将首先使用libname.so进行搜索，这里是libm.so。下面的例子将使用算术库创建bookrecs程序，请注意这里的-lm选项。 </P>
<P style="TEXT-INDENT: 2em">　　$ gcc main.c io.c -o bookrecs -lm </P>
<P style="TEXT-INDENT: 2em">　　系统中还有一些其它可用的库，常用的是libncurses.a库，包含了一些简单的鼠标移动例程。在命令行中使用-lncurses选项引用libncurses.so库。下面的例子同时调用了数学和光标库。 </P>
<P style="TEXT-INDENT: 2em">　　$ gcc mian.c io.c -o bookrecs -lm -lncurses </P>
<P style="TEXT-INDENT: 2em">　　在引用其它目录中的库时，需要使用-ldir选项指定该目录。该选项指定了搜索库函数时其它路径。在下面的例子中，用户在连接时使用了mydir目录中的myio.so库文件。 </P>
<P style="TEXT-INDENT: 2em">　　$ gcc main.c -o bookrecs -lmydir -lmyio </P>
<P style="TEXT-INDENT: 2em">　　.a的是为了支持较老的a.out格式的可执行文件的 </P>
<P style="TEXT-INDENT: 2em">　　.so的是支持elf格式的可执行文件的库。 </P>
<P style="TEXT-INDENT: 2em">　　静态库是指编译连接时，把库文件的代码全部加入到可执行文件中，所以生成的文件较大， 但运行时，就不再需要库文件了。动态库正好相反，在编译连接时，没有把库文件的代码加入到可执行文件中，所以生成的文件较小，但运行时，仍需要加载库文件 </P>
<P style="TEXT-INDENT: 2em">　　.a是静态库文件，可以用ar 命令生成。 </P>
<P style="TEXT-INDENT: 2em">　　.so是动态库文件，编译时加上指定的选项即可生成，具体选项看相应的系统文档了。。。。 </P>
<P style="TEXT-INDENT: 2em">　　IBM AIX下如下： </P>
<P style="TEXT-INDENT: 2em">　　$(CC) $(SHOPT) $(SHLIBS) a.o b.o -o lib$@$(DBBUILDTAIL) </P>
<P style="TEXT-INDENT: 2em">　　假设你有test1.c test2.c test3.c , 编写成动态链接库 </P>
<P style="TEXT-INDENT: 2em">　　1. 先编译成test1.o test2.o test3.o </P>
<P style="TEXT-INDENT: 2em">　　2. gcc -shared -W1, -soname,libvTest.so.1 -o libvTest.so.1.0 *.o</P></TD></TR>
<TR>
<TD vAlign=top>
<P></P>
<P style="TEXT-INDENT: 2em">静态、共享和动态库的使用</P></TD></TR>
<TR>
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=0 width=250 align=right border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></TD></TR></TBODY></TABLE>
<P></P>
<P style="TEXT-INDENT: 2em">　　C语言中有一些函数不需要进行编译，有一些函数也可以在多个文件中使用。一般来说，这些函数都会执行一些标准任务，如数据库输入/输出操作或屏幕控制等。可以事先对这些函数进行编译，然后将它们放置在一些特殊的目标代码文件中，这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。 </P>
<P style="TEXT-INDENT: 2em">　　不同类型的应用程序将会使用不同的函数库。例如：libdbm库中组包含了对数据库文件进行访问的dbm函数，需要对数据库进行操作的程序就会与该库进行连接。数学应用程序将使用数学库libm，X-Windows应用程序将使用Xlib库，libX11。另外，所有的程序都将使用标准的C函数库。libc，该库中包含了诸好内存管理或输入输出操作的基本函数，这些库都存放在/usr/lib这些系统公用的目录中，系统中的任何用户都可以利用这些库。当然用户也可以建立自己专用的库函数，供自己或其它指定的人员使用。 </P>
<P style="TEXT-INDENT: 2em">　　库可以有三种使用的形式：静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中，而共享库只是在程序开始运行时才载入，在编译时，只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入，但与共享库不同的是，使用的库函数不是在程序运行开始，而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存，腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容，只是包含了对库函数的引用，因此代码的规模比较小。 </P>
<P style="TEXT-INDENT: 2em">　　已经开发的大多数库都采取共享库的方式。ELF格式的可执行文件使得共享库能够比较容易地实现，当然使用旧的a.out模式也可以实现库的共享。Linux系统中目前可执行文件的标准格式为ELF格式。 </P>
<P style="TEXT-INDENT: 2em">　　GNU库的使用必须遵守Library GNU Public License(LGPL许可协议)。该协议与GNU许可协议略有不同，开发人员可以免费使用GNU库进行软件开发，但必须保证向用户提供所用的库函数的源代码。 </P>
<P style="TEXT-INDENT: 2em">　　系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同，后缀名也不一样。共享库的后缀名由.so和版本号组成，静态库的后缀名为.a。采用旧的a.out格式的共享库的后缀名为.sa。 </P>
<P style="TEXT-INDENT: 2em">　　libname.so.major.minor </P>
<P style="TEXT-INDENT: 2em">　　libname.a </P>
<P style="TEXT-INDENT: 2em">　　这里的name可以是任何字符串，用来唯一标识某个库。该字符串可以是一个单字、几个字符、甚至一个字母。数学共享库的库名为libm.so.5，这里的标识字符为m，版本号为5。libm.a则是静态数学库。X-Windows库名为libX11.so.6，这里使用X11作为库的标识，版本号为6。 </P>
<P style="TEXT-INDENT: 2em">　　使用gcc编译器就可以将库与自己开发的程序连接起来，例如：libc.so.5中包含了标准的输入输出函数，当连接程序进行目标代码连接时会自动搜索该程序并将其连接到生成的可执行文件中。标准的输入输出库中包含了许多基本的输入输出函数，如printf函数等。也可以连接其它的一些系统函数库，如数学库等，但与libc.so.5不同，大部分其它的系统库需要在命令行中显式指定所用的库名。 </P>
<P style="TEXT-INDENT: 2em">　　在/usr/lib和/lib目录中可以找到绝大多数的共享库。连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中，在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序也会对列出的这些目录进行搜索。在默认情况下，Linux将首先搜索指定库的共享版本，如果找不到，才会去搜索静态版本。在对共享库进行更新或安装新库后，必须运行ldconfig命令更新/etc/ld.conf文件中相应的项(如果使用RPM进行安装，一般会自动进行更新，不过也不能保证这一点)。 </P>
<P style="TEXT-INDENT: 2em">　　在gcc编译器中引用可搜索到的目录中的库文件时，需要使用-l选项和库名。在gcc命令行上输入-lm可以在程序中连接标准算术库，-l将首先使用libname.so进行搜索，这里是libm.so。下面的例子将使用算术库创建bookrecs程序，请注意这里的-lm选项。 </P>
<P style="TEXT-INDENT: 2em">　　$ gcc main.c io.c -o bookrecs -lm </P>
<P style="TEXT-INDENT: 2em">　　系统中还有一些其它可用的库，常用的是libncurses.a库，包含了一些简单的鼠标移动例程。在命令行中使用-lncurses选项引用libncurses.so库。下面的例子同时调用了数学和光标库。 </P>
<P style="TEXT-INDENT: 2em">　　$ gcc mian.c io.c -o bookrecs -lm -lncurses </P>
<P style="TEXT-INDENT: 2em">　　在引用其它目录中的库时，需要使用-ldir选项指定该目录。该选项指定了搜索库函数时其它路径。在下面的例子中，用户在连接时使用了mydir目录中的myio.so库文件。 </P>
<P style="TEXT-INDENT: 2em">　　$ gcc main.c -o bookrecs -lmydir -lmyio </P>
<P style="TEXT-INDENT: 2em">　　.a的是为了支持较老的a.out格式的可执行文件的 </P>
<P style="TEXT-INDENT: 2em">　　.so的是支持elf格式的可执行文件的库。 </P>
<P style="TEXT-INDENT: 2em">　　静态库是指编译连接时，把库文件的代码全部加入到可执行文件中，所以生成的文件较大， 但运行时，就不再需要库文件了。动态库正好相反，在编译连接时，没有把库文件的代码加入到可执行文件中，所以生成的文件较小，但运行时，仍需要加载库文件 </P>
<P style="TEXT-INDENT: 2em">　　.a是静态库文件，可以用ar 命令生成。 </P>
<P style="TEXT-INDENT: 2em">　　.so是动态库文件，编译时加上指定的选项即可生成，具体选项看相应的系统文档了。。。。 </P>
<P style="TEXT-INDENT: 2em">　　IBM AIX下如下： </P>
<P style="TEXT-INDENT: 2em">　　$(CC) $(SHOPT) $(SHLIBS) a.o b.o -o lib$@$(DBBUILDTAIL) </P>
<P style="TEXT-INDENT: 2em">　　假设你有test1.c test2.c test3.c , 编写成动态链接库 </P>
<P style="TEXT-INDENT: 2em">　　1. 先编译成test1.o test2.o test3.o </P>
<P style="TEXT-INDENT: 2em">　　2. gcc -shared -W1, -soname,libvTest.so.1 -o libvTest.so.1.0 *.o</P></TD></TR></TBODY></TABLE></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320083223131590</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320083223131590</guid>
    <pubDate>Tue, 22 Apr 2008 15:01:31 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:03:30+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Linux下的多线程编程]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320083223041622</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">
<TABLE cellSpacing=0 cellPadding=0 width=560 border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">Linux下的多线程编程</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em"></P>
<HR align=center width="100%" SIZE=1>

<P></P>
<P style="TEXT-INDENT: 2em"></P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">作者：姚继锋 2001-08-11 09:05:00 来自：http://www.china-pub.com</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></TD></TR>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">1 引言</P>
<P style="TEXT-INDENT: 2em">　　线程（thread）技术早在60年代就被提出，但真正应用多线程到操作系统中去，是在80年代中期，solaris是这方面的佼佼者。传统的Unix也支持线程的概念，但是在一个进程（process）中只允许有一个线程，这样多线程就意味着多进程。现在，多线程技术已经被许多操作系统所支持，包括Windows/NT，当然，也包括Linux。</P>
<P style="TEXT-INDENT: 2em">　　为什么有了进程的概念后，还要再引入线程呢？使用多线程到底有哪些好处？什么的系统应该选用多线程？我们首先必须回答这些问题。</P>
<P style="TEXT-INDENT: 2em">　　使用多线程的理由之一是和进程相比，它是一种非常"节俭"的多任务操作方式。我们知道，在Linux系统下，启动一个新的进程必须分配给它独立的地址空间，建立众多的数据表来维护它的代码段、堆栈段和数据段，这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程，它们彼此之间使用相同的地址空间，共享大部分数据，启动一个线程所花费的空间远远小于启动一个进程所花费的空间，而且，线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计，总的说来桓鼋痰目笤际且桓鱿叱炭?0倍左右，当然，在具体的系统上，这个数据可能会有较大的区别。</P>
<P style="TEXT-INDENT: 2em">　　使用多线程的理由之二是线程间方便的通信机制。对不同进程来说，它们具有独立的数据空间，要进行数据的传递只能通过通信的方式进行，这种方式不仅费时，而且很不方便。线程则不然，由于同一进程下的线程之间共享数据空间，所以一个线程的数据可以直接为其它线程所用，这不仅快捷，而且方便。当然，数据的共享也带来其他一些问题，有的变量不能同时被两个线程所修改，有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击，这些正是编写多线程程序时最需要注意的地方。</P>
<P style="TEXT-INDENT: 2em">　　除了以上所说的优点外，不和进程比较，多线程程序作为一种多任务、并发的工作方式，当然有以下的优点：</P>
<P style="TEXT-INDENT: 2em">　　1) 提高应用程序响应。这对图形界面的程序尤其有意义，当一个操作耗时很长时，整个系统都会等待这个操作，此时程序不会响应键盘、鼠标、菜单的操作，而使用多线程技术，将耗时长的操作（time consuming）置于一个新的线程，可以避免这种尴尬的情况。</P>
<P style="TEXT-INDENT: 2em">　　2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时，不同的线程运行于不同的CPU上。</P>
<P style="TEXT-INDENT: 2em">　　3) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程，成为几个独立或半独立的运行部分，这样的程序会利于理解和修改。</P>
<P style="TEXT-INDENT: 2em">　　下面我们先来尝试编写一个简单的多线程程序。</P>
<P style="TEXT-INDENT: 2em">2 简单的多线程编程</P>
<P style="TEXT-INDENT: 2em">　　Linux系统下的多线程遵循POSIX线程接口，称为pthread。编写Linux下的多线程程序，需要使用头文件pthread.h，连接时需要使用库libpthread.a。顺便说一下，Linux下pthread的实现是通过系统调用clone（）来实现的。clone（）是Linux所特有的系统调用，它的使用方式类似fork，关于clone（）的详细情况，有兴趣的读者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序example1.c。 </P>
<P style="TEXT-INDENT: 2em">/* example.c*/</P>
<P style="TEXT-INDENT: 2em">#include &lt;stdio.h&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;pthread.h&gt;</P>
<P style="TEXT-INDENT: 2em">void thread(void)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">int i;</P>
<P style="TEXT-INDENT: 2em">for(i=0;i&lt;3;i++)</P>
<P style="TEXT-INDENT: 2em">printf("This is a pthread.\n");</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">int main(void)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">pthread_t id;</P>
<P style="TEXT-INDENT: 2em">int i,ret;</P>
<P style="TEXT-INDENT: 2em">ret=pthread_create(&amp;id,NULL,(void *) thread,NULL);</P>
<P style="TEXT-INDENT: 2em">if(ret!=0){</P>
<P style="TEXT-INDENT: 2em">printf ("Create pthread error!\n");</P>
<P style="TEXT-INDENT: 2em">exit (1);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">for(i=0;i&lt;3;i++)</P>
<P style="TEXT-INDENT: 2em">printf("This is the main process.\n");</P>
<P style="TEXT-INDENT: 2em">pthread_join(id,NULL);</P>
<P style="TEXT-INDENT: 2em">return (0);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">我们编译此程序：</P>
<P style="TEXT-INDENT: 2em">gcc example1.c -lpthread -o example1</P>
<P style="TEXT-INDENT: 2em">运行example1，我们得到如下结果：</P>
<P style="TEXT-INDENT: 2em">This is the main process.</P>
<P style="TEXT-INDENT: 2em">This is a pthread.</P>
<P style="TEXT-INDENT: 2em">This is the main process.</P>
<P style="TEXT-INDENT: 2em">This is the main process.</P>
<P style="TEXT-INDENT: 2em">This is a pthread.</P>
<P style="TEXT-INDENT: 2em">This is a pthread.</P>
<P style="TEXT-INDENT: 2em">再次运行，我们可能得到如下结果：</P>
<P style="TEXT-INDENT: 2em">This is a pthread.</P>
<P style="TEXT-INDENT: 2em">This is the main process.</P>
<P style="TEXT-INDENT: 2em">This is a pthread.</P>
<P style="TEXT-INDENT: 2em">This is the main process.</P>
<P style="TEXT-INDENT: 2em">This is a pthread.</P>
<P style="TEXT-INDENT: 2em">This is the main process.</P>
<P style="TEXT-INDENT: 2em">　　前后两次结果不一样，这是两个线程争夺CPU资源的结果。上面的示例中，我们使用到了两个函数，　　pthread_create和pthread_join，并声明了一个pthread_t型的变量。</P>
<P style="TEXT-INDENT: 2em">　　pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义：</P>
<P style="TEXT-INDENT: 2em">　　typedef unsigned long int pthread_t;</P>
<P style="TEXT-INDENT: 2em">　　它是一个线程的标识符。函数pthread_create用来创建一个线程，它的原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,</P>
<P style="TEXT-INDENT: 2em">　　void *(*__start_routine) (void *), void *__arg));</P>
<P style="TEXT-INDENT: 2em">　　第一个参数为指向线程标识符的指针，第二个参数用来设置线程属性，第三个参数是线程运行函数的起始地址，最后一个参数是运行函数的参数。这里，我们的函数thread不需要参数，所以最后一个参数设为空指针。第二个参数我们也设为空指针，这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时，函数返回0，若不为0则说明创建线程失败，常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程，例如线程数目过多了；后者表示第二个参数代表的线程属性值非法。创建线程成功后，新创建的线程则运行参数三和参数四确定的函数，原来的线程则继续运行下一行代码。</P>
<P style="TEXT-INDENT: 2em">　　函数pthread_join用来等待一个线程的结束。函数原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_join __P ((pthread_t __th, void **__thread_return));</P>
<P style="TEXT-INDENT: 2em">　　第一个参数为被等待的线程标识符，第二个参数为一个用户定义的指针，它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数，调用它的函数将一直等待到被等待的线程结束为止，当函数返回时，被等待线程的资源被收回。一个线程的结束有两种途径，一种是象我们上面的例子一样，函数结束了，调用它的线程也就结束了；另一种方式是通过函数pthread_exit来实现。它的函数原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));</P>
<P style="TEXT-INDENT: 2em">　　唯一的参数是函数的返回代码，只要pthread_join中的第二个参数thread_return不是NULL，这个值将被传递给thread_return。最后要说明的是，一个线程不能被多个线程等待，否则第一个接收到信号的线程成功返回，其余调用pthread_join的线程则返回错误代码ESRCH。</P>
<P style="TEXT-INDENT: 2em">　　在这一节里，我们编写了一个最简单的线程，并掌握了最常用的三个函数pthread_create，pthread_join和pthread_exit。下面，我们来了解线程的一些常用属性以及如何设置这些属性。</P>
<P style="TEXT-INDENT: 2em">3 修改线程的属性</P>
<P style="TEXT-INDENT: 2em">　　在上一节的例子里，我们用pthread_create函数创建了一个线程，在这个线程中，我们使用了默认参数，即将该函数的第二个参数设为NULL。的确，对大多数程序来说，使用默认属性就够了，但我们还是有必要来了解一下线程的有关属性。</P>
<P style="TEXT-INDENT: 2em">　　属性结构为pthread_attr_t，它同样在头文件/usr/include/pthread.h中定义，喜欢追根问底的人可以自己去查看。属性值不能直接设置，须使用相关函数进行操作，初始化的函数为pthread_attr_init，这个函数必须在pthread_create函数之前调用。属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。</P>
<P style="TEXT-INDENT: 2em">　　关于线程的绑定，牵涉到另外一个概念：轻进程（LWP：Light Weight Process）。轻进程可以理解为内核线程，它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的，一个轻进程可以控制一个或多个线程。默认状况下，启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的，这种状况即称为非绑定的。绑定状况下，则顾名思义，即某个线程固定的"绑"在一个轻进程之上。被绑定的线程具有较高的响应速度，这是因为CPU时间片的调度是面向轻进程的，绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。</P>
<P style="TEXT-INDENT: 2em">　　设置线程绑定状态的函数为pthread_attr_setscope，它有两个参数，第一个是指向属性结构的指针，第二个是绑定类型，它有两个取值：PTHREAD_SCOPE_SYSTEM（绑定的）和PTHREAD_SCOPE_PROCESS（非绑定的）。下面的代码即创建了一个绑定的线程。</P>
<P style="TEXT-INDENT: 2em">#include &lt;pthread.h&gt;</P>
<P style="TEXT-INDENT: 2em">pthread_attr_t attr;</P>
<P style="TEXT-INDENT: 2em">pthread_t tid;</P>
<P style="TEXT-INDENT: 2em">/*初始化属性值，均设为默认值*/</P>
<P style="TEXT-INDENT: 2em">pthread_attr_init(&amp;attr);</P>
<P style="TEXT-INDENT: 2em">pthread_attr_setscope(&amp;attr, PTHREAD_SCOPE_SYSTEM);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;tid, &amp;attr, (void *) my_function, NULL);</P>
<P style="TEXT-INDENT: 2em">　　线程的分离状态决定一个线程以什么样的方式来终止自己。在上面的例子中，我们采用了线程的默认属性，即为非分离状态，这种情况下，原有的线程等待创建的线程结束。只有当pthread_join（）函数返回时，创建的线程才算终止，才能释放自己占用的系统资源。而分离线程不是这样子的，它没有被其他的线程所等待，自己运行结束了，线程也就终止了，马上释放系统资源。程序员应该根据自己的需要，选择适当的分离状态。设置线程分离状态的函数为pthread_attr_setdetachstate（pthread_attr_t *attr, int detachstate）。第二个参数可选为PTHREAD_CREATE_DETACHED（分离线程）和 PTHREAD _CREATE_JOINABLE（非分离线程）。这里要注意的一点是，如果设置一个线程为分离线程，而这个线程运行又非常快，它很可能在pthread_create函数返回之前就终止了，它终止以后就可能将线程号和系统资源移交给其他的线程使用，这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施，最简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数，让这个线程等待一会儿，留出足够的时间让函数pthread_create返回。设置一段等待时间，是在多线程编程里常用的方法。但是注意不要使用诸如wait（）之类的函数，它们是使整个进程睡眠，并不能解决线程同步的问题。</P>
<P style="TEXT-INDENT: 2em">　　另外一个可能常用的属性是线程的优先级，它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放，一般说来，我们总是先取优先级，对取得的值修改后再存放回去。下面即是一段简单的例子。</P>
<P style="TEXT-INDENT: 2em">#include &lt;pthread.h&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;sched.h&gt;</P>
<P style="TEXT-INDENT: 2em">pthread_attr_t attr;</P>
<P style="TEXT-INDENT: 2em">pthread_t tid;</P>
<P style="TEXT-INDENT: 2em">sched_param param;</P>
<P style="TEXT-INDENT: 2em">int newprio=20;</P>
<P style="TEXT-INDENT: 2em">pthread_attr_init(&amp;attr);</P>
<P style="TEXT-INDENT: 2em">pthread_attr_getschedparam(&amp;attr, &amp;param);</P>
<P style="TEXT-INDENT: 2em">param.sched_priority=newprio;</P>
<P style="TEXT-INDENT: 2em">pthread_attr_setschedparam(&amp;attr, &amp;param);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;tid, &amp;attr, (void *)myfunction, myarg);</P>
<P style="TEXT-INDENT: 2em">　　</P>
<P style="TEXT-INDENT: 2em">4 线程的数据处理</P>
<P style="TEXT-INDENT: 2em">　　和进程相比，线程的最大优点之一是数据的共享性，各个进程共享父进程处沿袭的数据段，可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的，即同时不能运行一个函数的多个拷贝（除非使用不同的数据段）。在函数中声明的静态变量常常带来问题，函数的返回值也会有问题。因为如果返回的是函数内部静态声明的空间的地址，则在一个线程调用该函数得到地址后使用该地址指向的数据时，别的线程可能调用此函数并修改了这一段数据。在进程中共享的变量必须用关键字volatile来定义，这是为了防止编译器在优化时（如gcc中使用-OX参数）改变它们的使用方式。为了保护变量，我们必须使用信号量、互斥等方法来保证我们对变量的正确使用。下面，我们就逐步介绍处理线程数据时的有关知识。</P>
<P style="TEXT-INDENT: 2em">4.1 线程数据</P>
<P style="TEXT-INDENT: 2em">　　在单线程的程序里，有两种基本的数据：全局变量和局部变量。但在多线程程序里，还有第三种数据类型：线程数据（TSD: Thread-Specific Data）。它和全局变量很象，在线程内部，各个函数可以象使用全局变量一样调用它，但它对线程外部的其它线程是不可见的。这种数据的必要性是显而易见的。例如我们常见的变量errno，它返回标准的出错信息。它显然不能是一个局部变量，几乎每个函数都应该可以调用它；但它又不能是一个全局变量，否则在A线程里输出的很可能是B线程的出错信息。要实现诸如此类的变量，我们就必须使用线程数据。我们为每个线程数据创建一个键，它和这个键相关联，在各个线程里，都使用这个键来指代线程数据，但在不同的线程里，这个键代表的数据是不同的，在同一个线程里，它代表同样的数据内容。</P>
<P style="TEXT-INDENT: 2em">　　和线程数据相关的函数主要有4个：创建一个键；为一个键指定线程数据；从一个键读取线程数据；删除键。</P>
<P style="TEXT-INDENT: 2em">　　创建键的函数原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_key_create __P ((pthread_key_t *__key,</P>
<P style="TEXT-INDENT: 2em">　　void (*__destr_function) (void *)));</P>
<P style="TEXT-INDENT: 2em">　　第一个参数为指向一个键值的指针，第二个参数指明了一个destructor函数，如果这个参数不为空，那么当每个线程结束时，系统将调用这个函数来释放绑定在这个键上的内存块。这个函数常和函数pthread_once ((pthread_once_t*once_control, void (*initroutine) (void)))一起使用，为了让这个键只被创建一次。函数pthread_once声明一个初始化函数，第一次调用pthread_once时它执行这个函数，以后的调用将被它忽略。</P>
<P style="TEXT-INDENT: 2em">　　在下面的例子中，我们创建一个键，并将它和某个数据相关联。我们要定义一个函数createWindow，这个函数定义一个图形窗口（数据类型为Fl_Window *，这是图形界面开发工具FLTK中的数据类型）。由于各个线程都会调用这个函数，所以我们使用线程数据。</P>
<P style="TEXT-INDENT: 2em">/* 声明一个键*/</P>
<P style="TEXT-INDENT: 2em">pthread_key_t myWinKey;</P>
<P style="TEXT-INDENT: 2em">/* 函数 createWindow */</P>
<P style="TEXT-INDENT: 2em">void createWindow ( void ) {</P>
<P style="TEXT-INDENT: 2em">Fl_Window * win;</P>
<P style="TEXT-INDENT: 2em">static pthread_once_t once= PTHREAD_ONCE_INIT;</P>
<P style="TEXT-INDENT: 2em">/* 调用函数createMyKey，创建键*/</P>
<P style="TEXT-INDENT: 2em">pthread_once ( &amp; once, createMyKey) ;</P>
<P style="TEXT-INDENT: 2em">/*win指向一个新建立的窗口*/</P>
<P style="TEXT-INDENT: 2em">win=new Fl_Window( 0, 0, 100, 100, "MyWindow");</P>
<P style="TEXT-INDENT: 2em">/* 对此窗口作一些可能的设置工作，如大小、位置、名称等*/</P>
<P style="TEXT-INDENT: 2em">setWindow(win);</P>
<P style="TEXT-INDENT: 2em">/* 将窗口指针值绑定在键myWinKey上*/</P>
<P style="TEXT-INDENT: 2em">pthread_setpecific ( myWinKey, win);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">/* 函数 createMyKey，创建一个键，并指定了destructor */</P>
<P style="TEXT-INDENT: 2em">void createMyKey ( void ) {</P>
<P style="TEXT-INDENT: 2em">pthread_keycreate(&amp;myWinKey, freeWinKey);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">/* 函数 freeWinKey，释放空间*/</P>
<P style="TEXT-INDENT: 2em">void freeWinKey ( Fl_Window * win){</P>
<P style="TEXT-INDENT: 2em">delete win;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">　　这样，在不同的线程中调用函数createMyWin，都可以得到在线程内部均可见的窗口变量，这个变量通过函数pthread_getspecific得到。在上面的例子中，我们已经使用了函数pthread_setspecific来将线程数据和一个键绑定在一起。这两个函数的原型如下：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer));</P>
<P style="TEXT-INDENT: 2em">　　extern void *pthread_getspecific __P ((pthread_key_t __key));</P>
<P style="TEXT-INDENT: 2em">　　这两个函数的参数意义和使用方法是显而易见的。要注意的是，用pthread_setspecific为一个键指定新的线程数据时，必须自己释放原有的线程数据以回收空间。这个过程函数pthread_key_delete用来删除一个键，这个键占用的内存将被释放，但同样要注意的是，它只释放键占用的内存，并不释放该键关联的线程数据所占用的内存资源，而且它也不会触发函数pthread_key_create中定义的destructor函数。线程数据的释放必须在释放键之前完成。</P>
<P style="TEXT-INDENT: 2em">4.2 互斥锁</P>
<P style="TEXT-INDENT: 2em">　　互斥锁用来保证一段时间内只有一个线程在执行一段代码。必要性显而易见：假设各个线程向同一个文件顺序写入数据，最后得到的结果一定是灾难性的。</P>
<P style="TEXT-INDENT: 2em">　　我们先看下面一段代码。这是一个读/写程序，它们公用一个缓冲区，并且我们假定一个缓冲区只能保存一条信息。即缓冲区只有两个状态：有信息或没有信息。</P>
<P style="TEXT-INDENT: 2em">void reader_function ( void );</P>
<P style="TEXT-INDENT: 2em">void writer_function ( void ); </P>
<P style="TEXT-INDENT: 2em">char buffer;</P>
<P style="TEXT-INDENT: 2em">int buffer_has_item=0;</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_t mutex;</P>
<P style="TEXT-INDENT: 2em">struct timespec delay;</P>
<P style="TEXT-INDENT: 2em">void main ( void ){</P>
<P style="TEXT-INDENT: 2em">pthread_t reader;</P>
<P style="TEXT-INDENT: 2em">/* 定义延迟时间*/</P>
<P style="TEXT-INDENT: 2em">delay.tv_sec = 2;</P>
<P style="TEXT-INDENT: 2em">delay.tv_nec = 0;</P>
<P style="TEXT-INDENT: 2em">/* 用默认属性初始化一个互斥锁对象*/</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_init (&amp;mutex,NULL);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;reader, pthread_attr_default, (void *)&amp;reader_function), NULL);</P>
<P style="TEXT-INDENT: 2em">writer_function( );</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">void writer_function (void){</P>
<P style="TEXT-INDENT: 2em">while(1){</P>
<P style="TEXT-INDENT: 2em">/* 锁定互斥锁*/</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_lock (&amp;mutex);</P>
<P style="TEXT-INDENT: 2em">if (buffer_has_item==0){</P>
<P style="TEXT-INDENT: 2em">buffer=make_new_item( );</P>
<P style="TEXT-INDENT: 2em">buffer_has_item=1;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">/* 打开互斥锁*/</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_unlock(&amp;mutex);</P>
<P style="TEXT-INDENT: 2em">pthread_delay_np(&amp;delay);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">void reader_function(void){</P>
<P style="TEXT-INDENT: 2em">while(1){</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_lock(&amp;mutex);</P>
<P style="TEXT-INDENT: 2em">if(buffer_has_item==1){</P>
<P style="TEXT-INDENT: 2em">consume_item(buffer);</P>
<P style="TEXT-INDENT: 2em">buffer_has_item=0;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_unlock(&amp;mutex);</P>
<P style="TEXT-INDENT: 2em">pthread_delay_np(&amp;delay);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">　　这里声明了互斥锁变量mutex，结构pthread_mutex_t为不公开的数据类型，其中包含一个系统分配的属性对象。函数pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁，须调用函数pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared，它有两个取值，PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步，后者用于同步本进程的不同线程。在上面的例子中，我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型，可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制，一般情况下，选用最后一个默认属性。</P>
<P style="TEXT-INDENT: 2em">　　pthread_mutex_lock声明开始用互斥锁上锁，此后的代码直至调用pthread_mutex_unlock为止，均被上锁，即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时，如果该锁此时被另一个线程使用，那此线程被阻塞，即程序将等待到另一个线程释放此互斥锁。在上面的例子中，我们使用了pthread_delay_np函数，让线程睡眠一段时间，就是为了防止一个线程始终占据此函数。</P>
<P style="TEXT-INDENT: 2em">　　上面的例子非常简单，就不再介绍了，需要提出的是在使用互斥锁的过程中很有可能会出现死锁：两个线程试图同时占用两个资源，并按不同的次序锁定相应的互斥锁，例如两个线程都需要锁定互斥锁1和互斥锁2，a线程先锁定互斥锁1，b线程先锁定互斥锁2，这时就出现了死锁。此时我们可以使用函数pthread_mutex_trylock，它是函数pthread_mutex_lock的非阻塞版本，当它发现死锁不可避免时，它会返回相应的信息，程序员可以针对死锁做出相应的处理。另外不同的互斥锁类型对死锁的处理不一样，但最主要的还是要程序员自己在程序设计注意这一点。</P>
<P style="TEXT-INDENT: 2em">4.3 条件变量</P>
<P style="TEXT-INDENT: 2em">　　前一节中我们讲述了如何使用互斥锁来实现线程间数据的共享和通信，互斥锁一个明显的缺点是它只有两种状态：锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足，它常和互斥锁一起使用。使用时，条件变量被用来阻塞一个线程，当条件不满足时，线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量，它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来，条件变量被用来进行线承间的同步。</P>
<P style="TEXT-INDENT: 2em">　　条件变量的结构为pthread_cond_t，函数pthread_cond_init（）被用来初始化一个条件变量。它的原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));</P>
<P style="TEXT-INDENT: 2em">　　其中cond是一个指向结构pthread_cond_t的指针，cond_attr是一个指向结构pthread_condattr_t的指针。结构pthread_condattr_t是条件变量的属性结构，和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用，默认值是PTHREAD_ PROCESS_PRIVATE，即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。释放一个条件变量的函数为pthread_cond_ destroy（pthread_cond_t cond）。　</P>
<P style="TEXT-INDENT: 2em">　　函数pthread_cond_wait（）使线程阻塞在一个条件变量上。它的函数原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_cond_wait __P ((pthread_cond_t *__cond,</P>
<P style="TEXT-INDENT: 2em">　　pthread_mutex_t *__mutex));</P>
<P style="TEXT-INDENT: 2em">　　线程解开mutex指向的锁并被条件变量cond阻塞。线程可以被函数pthread_cond_signal和函数pthread_cond_broadcast唤醒，但是要注意的是，条件变量只是起阻塞和唤醒线程的作用，具体的判断条件还需用户给出，例如一个变量是否为0等等，这一点我们从后面的例子中可以看到。线程被唤醒后，它将重新检查判断条件是否满足，如果还不满足，一般说来线程应该仍阻塞在这里，被等待被下一次唤醒。这个过程一般用while语句实现。</P>
<P style="TEXT-INDENT: 2em">　　另一个用来阻塞线程的函数是pthread_cond_timedwait（），它的原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond,</P>
<P style="TEXT-INDENT: 2em">　　pthread_mutex_t *__mutex, __const struct timespec *__abstime));</P>
<P style="TEXT-INDENT: 2em">　　它比函数pthread_cond_wait（）多了一个时间参数，经历abstime段时间后，即使条件变量不满足，阻塞也被解除。</P>
<P style="TEXT-INDENT: 2em">　　函数pthread_cond_signal（）的原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int pthread_cond_signal __P ((pthread_cond_t *__cond));</P>
<P style="TEXT-INDENT: 2em">　　它用来释放被阻塞在条件变量cond上的一个线程。多个线程阻塞在此条件变量上时，哪一个线程被唤醒是由线程的调度策略所决定的。要注意的是，必须用保护条件变量的互斥锁来保护这个函数，否则条件满足信号又可能在测试条件和调用pthread_cond_wait函数之间被发出，从而造成无限制的等待。下面是使用函数pthread_cond_wait（）和函数pthread_cond_signal（）的一个简单的例子。</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_t count_lock;</P>
<P style="TEXT-INDENT: 2em">pthread_cond_t count_nonzero;</P>
<P style="TEXT-INDENT: 2em">unsigned count;</P>
<P style="TEXT-INDENT: 2em">decrement_count　() {</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_lock (&amp;count_lock);</P>
<P style="TEXT-INDENT: 2em">while(count==0) </P>
<P style="TEXT-INDENT: 2em">pthread_cond_wait( &amp;count_nonzero, &amp;count_lock);</P>
<P style="TEXT-INDENT: 2em">count=count -1;</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_unlock (&amp;count_lock);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">increment_count(){</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_lock(&amp;count_lock);</P>
<P style="TEXT-INDENT: 2em">if(count==0)</P>
<P style="TEXT-INDENT: 2em">pthread_cond_signal(&amp;count_nonzero);</P>
<P style="TEXT-INDENT: 2em">count=count+1;</P>
<P style="TEXT-INDENT: 2em">pthread_mutex_unlock(&amp;count_lock);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">　　count值为0时，decrement函数在pthread_cond_wait处被阻塞，并打开互斥锁count_lock。此时，当调用到函数increment_count时，pthread_cond_signal（）函数改变条件变量，告知decrement_count（）停止阻塞。读者可以试着让两个线程分别运行这两个函数，看看会出现什么样的结果。</P>
<P style="TEXT-INDENT: 2em">　　函数pthread_cond_broadcast（pthread_cond_t *cond）用来唤醒所有被阻塞在条件变量cond上的线程。这些线程被唤醒后将再次竞争相应的互斥锁，所以必须小心使用这个函数。</P>
<P style="TEXT-INDENT: 2em">4.4 信号量</P>
<P style="TEXT-INDENT: 2em">　　信号量本质上是一个非负的整数计数器，它被用来控制对公共资源的访问。当公共资源增加时，调用函数sem_post（）增加信号量。只有当信号量值大于０时，才能使用公共资源，使用后，函数sem_wait（）减少信号量。函数sem_trywait（）和函数pthread_ mutex_trylock（）起同样的作用，它是函数sem_wait（）的非阻塞版本。下面我们逐个介绍和信号量有关的一些函数，它们都在头文件/usr/include/semaphore.h中定义。</P>
<P style="TEXT-INDENT: 2em">　　信号量的数据类型为结构sem_t，它本质上是一个长整型的数。函数sem_init（）用来初始化一个信号量。它的原型为：</P>
<P style="TEXT-INDENT: 2em">　　extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));</P>
<P style="TEXT-INDENT: 2em">　　sem为指向信号量结构的一个指针；pshared不为０时此信号量在进程间共享，否则只能为当前进程的所有线程共享；value给出了信号量的初始值。</P>
<P style="TEXT-INDENT: 2em">　　函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时，调用这个函数会使其中的一个线程不在阻塞，选择机制同样是由线程的调度策略决定的。</P>
<P style="TEXT-INDENT: 2em">　　函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0，解除阻塞后将sem的值减一，表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait（）的非阻塞版本，它直接将信号量sem的值减一。</P>
<P style="TEXT-INDENT: 2em">　　函数sem_destroy(sem_t *sem)用来释放信号量sem。</P>
<P style="TEXT-INDENT: 2em">　　下面我们来看一个使用信号量的例子。在这个例子中，一共有4个线程，其中两个线程负责从文件读取数据到公共的缓冲区，另两个线程从缓冲区读取数据作不同的处理（加和乘运算）。</P>
<P style="TEXT-INDENT: 2em">/* File sem.c */</P>
<P style="TEXT-INDENT: 2em">#include &lt;stdio.h&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;pthread.h&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;semaphore.h&gt;</P>
<P style="TEXT-INDENT: 2em">#define MAXSTACK 100</P>
<P style="TEXT-INDENT: 2em">int stack[MAXSTACK][2];</P>
<P style="TEXT-INDENT: 2em">int size=0;</P>
<P style="TEXT-INDENT: 2em">sem_t sem;</P>
<P style="TEXT-INDENT: 2em">/* 从文件1.dat读取数据，每读一次，信号量加一*/</P>
<P style="TEXT-INDENT: 2em">void ReadData1(void){</P>
<P style="TEXT-INDENT: 2em">FILE *fp=fopen("1.dat","r");</P>
<P style="TEXT-INDENT: 2em">while(!feof(fp)){</P>
<P style="TEXT-INDENT: 2em">fscanf(fp,"%d %d",&amp;stack[size][0],&amp;stack[size][1]);</P>
<P style="TEXT-INDENT: 2em">sem_post(&amp;sem);</P>
<P style="TEXT-INDENT: 2em">++size;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">fclose(fp);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">/*从文件2.dat读取数据*/</P>
<P style="TEXT-INDENT: 2em">void ReadData2(void){</P>
<P style="TEXT-INDENT: 2em">FILE *fp=fopen("2.dat","r");</P>
<P style="TEXT-INDENT: 2em">while(!feof(fp)){</P>
<P style="TEXT-INDENT: 2em">fscanf(fp,"%d %d",&amp;stack[size][0],&amp;stack[size][1]);</P>
<P style="TEXT-INDENT: 2em">sem_post(&amp;sem);</P>
<P style="TEXT-INDENT: 2em">++size;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">fclose(fp);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">/*阻塞等待缓冲区有数据，读取数据后，释放空间，继续等待*/</P>
<P style="TEXT-INDENT: 2em">void HandleData1(void){</P>
<P style="TEXT-INDENT: 2em">while(1){</P>
<P style="TEXT-INDENT: 2em">sem_wait(&amp;sem);</P>
<P style="TEXT-INDENT: 2em">printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1],</P>
<P style="TEXT-INDENT: 2em">stack[size][0]+stack[size][1]);</P>
<P style="TEXT-INDENT: 2em">--size;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">void HandleData2(void){</P>
<P style="TEXT-INDENT: 2em">while(1){</P>
<P style="TEXT-INDENT: 2em">sem_wait(&amp;sem);</P>
<P style="TEXT-INDENT: 2em">printf("Multiply:%d*%d=%d\n",stack[size][0],stack[size][1],</P>
<P style="TEXT-INDENT: 2em">stack[size][0]*stack[size][1]);</P>
<P style="TEXT-INDENT: 2em">--size;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">int main(void){</P>
<P style="TEXT-INDENT: 2em">pthread_t t1,t2,t3,t4;</P>
<P style="TEXT-INDENT: 2em">sem_init(&amp;sem,0,0);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;t1,NULL,(void *)HandleData1,NULL);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;t2,NULL,(void *)HandleData2,NULL);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;t3,NULL,(void *)ReadData1,NULL);</P>
<P style="TEXT-INDENT: 2em">pthread_create(&amp;t4,NULL,(void *)ReadData2,NULL);</P>
<P style="TEXT-INDENT: 2em">/* 防止程序过早退出，让它在此无限期等待*/</P>
<P style="TEXT-INDENT: 2em">pthread_join(t1,NULL);</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">　　在Linux下，我们用命令gcc -lpthread sem.c -o sem生成可执行文件sem。 我们事先编辑好数据文件1.dat和2.dat，假设它们的内容分别为1 2 3 4 5 6 7 8 9 10和 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ，我们运行sem，得到如下的结果：</P>
<P style="TEXT-INDENT: 2em">Multiply:-1*-2=2</P>
<P style="TEXT-INDENT: 2em">Plus:-1+-2=-3</P>
<P style="TEXT-INDENT: 2em">Multiply:9*10=90</P>
<P style="TEXT-INDENT: 2em">Plus:-9+-10=-19</P>
<P style="TEXT-INDENT: 2em">Multiply:-7*-8=56</P>
<P style="TEXT-INDENT: 2em">Plus:-5+-6=-11</P>
<P style="TEXT-INDENT: 2em">Multiply:-3*-4=12</P>
<P style="TEXT-INDENT: 2em">Plus:9+10=19</P>
<P style="TEXT-INDENT: 2em">Plus:7+8=15</P>
<P style="TEXT-INDENT: 2em">Plus:5+6=11</P>
<P style="TEXT-INDENT: 2em">　　从中我们可以看出各个线程间的竞争关系。而数值并未按我们原先的顺序显示出来这是由于size这个数值被各个线程任意修改的缘故。这也往往是多线程编程要注意的问题。</P>
<P style="TEXT-INDENT: 2em">5 小结</P>
<P style="TEXT-INDENT: 2em">　　多线程编程是一个很有意思也很有用的技术，使用多线程技术的网络蚂蚁是目前最常用的下载工具之一，使用多线程技术的grep比单线程的grep要快上几倍，类似的例子还有很多。希望大家能用多线程技术写出高效实用的好程序来。</P></TD></TR></TBODY></TABLE></P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320083223041622</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320083223041622</guid>
    <pubDate>Tue, 22 Apr 2008 15:00:41 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:04:13+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[shell 双引号，单引号，和反引号]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200832225955720</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">shell 编程中，引号有 双引号，单引号，和反引号&nbsp; 今天小有认识</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">双引号&nbsp; “”</P>
<P style="TEXT-INDENT: 2em">#BOY=”boy”&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置变量</P>
<P style="TEXT-INDENT: 2em">#echo “the $BOY did well”&nbsp;&nbsp;&nbsp;&nbsp; 系统碰到$后 会自动当成变量来对待。。</P>
<P style="TEXT-INDENT: 2em">#the boy did well&nbsp;&nbsp;&nbsp; 输出结果</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">#BOY=”boy”&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置变量</P>
<P style="TEXT-INDENT: 2em">#echo “the “$BOY” did well”&nbsp;&nbsp;&nbsp;&nbsp; 系统碰到$后 会自动当成变量对待，不管几个双引号</P>
<P style="TEXT-INDENT: 2em">#the boy did well&nbsp;&nbsp;&nbsp; 输出结果</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">单引号&nbsp;&nbsp; ‘’</P>
<P style="TEXT-INDENT: 2em">跟双引号差不多。。。少有区别</P>
<P style="TEXT-INDENT: 2em">#BOY=`boy`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置变量</P>
<P style="TEXT-INDENT: 2em">#echo “the `$BOY ` did well”&nbsp;&nbsp;&nbsp;&nbsp; 这里碰到单引号，会带上单引号。。。</P>
<P style="TEXT-INDENT: 2em">#the `boy` did well&nbsp;&nbsp;&nbsp; 输出结果</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">反引号 ‘’</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">反引号的内容 是系统的命令&nbsp; 若不是系统的命令会报错</P>
<P style="TEXT-INDENT: 2em">#echo `hello`</P>
<P style="TEXT-INDENT: 2em">#command&nbsp; hello&nbsp; is not found </P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">但是系统命令 date 就不一样了&nbsp; </P>
<P style="TEXT-INDENT: 2em">#echo `date`</P>
<P style="TEXT-INDENT: 2em">#Sat Dec 22 23:50:48 HKT 2007</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">反斜线&nbsp;&nbsp;&nbsp; \</P>
<P style="TEXT-INDENT: 2em">反斜线，作用是屏蔽一些特殊符号如&nbsp;&nbsp;&nbsp;&nbsp; &amp; * + ^ $ ` " | ?</P>
<P style="TEXT-INDENT: 2em">#echo “my home direction is $HOME”</P>
<P style="TEXT-INDENT: 2em">#my home direction is /root</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">但是屏蔽以后呢</P>
<P style="TEXT-INDENT: 2em">#echo “my home direction is \$HOME”</P>
<P style="TEXT-INDENT: 2em">#my home direction is $HOME</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200832225955720</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200832225955720</guid>
    <pubDate>Tue, 22 Apr 2008 14:59:55 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:04:49+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[linux shell]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/660225032008322259357</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">本来因为看makefile文件看不懂才想学习一下shell编程，今天看了一天竟然发现如此引人入胜。。平时用到的好多东西都是这里面的内容，虽然刚开始但觉得收获颇多</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">echo&nbsp; “字符串”&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出字符串&nbsp;&nbsp; 像是puts()函数</P>
<P style="TEXT-INDENT: 2em">要想输出后不换行&nbsp; 则要加入-n参数</P>
<P style="TEXT-INDENT: 2em">echo&nbsp; -n&nbsp;&nbsp; “字符串”</P>
<P style="TEXT-INDENT: 2em">要用转义符的话&nbsp; （如\n 换行&nbsp; \t 为TAB符号 \c不换行 ） 要加入-e参数</P>
<P style="TEXT-INDENT: 2em">echo&nbsp; -e&nbsp;&nbsp; “字符串”</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">重定向符号&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">echo&nbsp; “hello world“ &gt;myfile&nbsp; 则向myfile 中写入hello world 字符串</P>
<P style="TEXT-INDENT: 2em">echo&nbsp; “hello world“ &gt;&gt;myfile&nbsp;&nbsp;&nbsp; 则向myfile 中追加hello world 字符串</P>
<P style="TEXT-INDENT: 2em">echo “$HOME add them on `date`“ &gt;&gt;myfile 其中$HOME&nbsp; 和`date` 都是系统变量，`` 为抑音符 不是单引号</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">Read可以设定变量</P>
<P style="TEXT-INDENT: 2em">#read name&nbsp;&nbsp;&nbsp;&nbsp; 定义变量 name</P>
<P style="TEXT-INDENT: 2em">hello world&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给变量赋值</P>
<P style="TEXT-INDENT: 2em">#echo&nbsp; $name&nbsp;&nbsp;&nbsp; 显示变量值</P>
<P style="TEXT-INDENT: 2em">hello world&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">其中read也可以设定多个变量</P>
<P style="TEXT-INDENT: 2em">#read&nbsp; name1&nbsp; name2&nbsp; name3&nbsp;&nbsp;&nbsp; 设定了三个变量</P>
<P style="TEXT-INDENT: 2em">lyw&nbsp; haike&nbsp; bayou&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给三个变量赋值</P>
<P style="TEXT-INDENT: 2em">#echo $name1&nbsp; $name2&nbsp; $name3&nbsp;&nbsp; 显示三个变量</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">echo&nbsp; -e&nbsp; “firsr name is:\c”&nbsp; ; read name</P>
<P style="TEXT-INDENT: 2em">#first name is:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 知道什么意思吧</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">Cat&nbsp; 功能强大&nbsp; </P>
<P style="TEXT-INDENT: 2em">#cat myfile |&nbsp; more&nbsp; 分页查看myfile文件&nbsp; 相当于 more</P>
<P style="TEXT-INDENT: 2em">用重定义符对文件写操作</P>
<P style="TEXT-INDENT: 2em">#cat &gt;newfile</P>
<P style="TEXT-INDENT: 2em">输入&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车</P>
<P style="TEXT-INDENT: 2em">输入&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车</P>
<P style="TEXT-INDENT: 2em">ctrl+d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结束输入</P>
<P style="TEXT-INDENT: 2em">则会新建一个文件myfile&nbsp; 然后对它写入两行（用&gt;&gt;追加写入）</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">将文件合并&nbsp;&nbsp;&nbsp; -----------à太方便了</P>
<P style="TEXT-INDENT: 2em">#cat&nbsp; file1&nbsp; file2&nbsp; file3 &gt;&gt;file&nbsp; 将三个文件file1 file2 file3 合并为一个文件file</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">管道是个好东西</P>
<P style="TEXT-INDENT: 2em"># locat&nbsp;&nbsp; test | tee file&nbsp; 搜索名为test的文件&nbsp; 将结果写入新文件&nbsp; file (tee的功能)</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">#sort&nbsp; file&nbsp; 对file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件内容进行排序</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">非常有用的重定义符</P>
<P style="TEXT-INDENT: 2em">一直输入&nbsp; 直到碰到结束符&nbsp; EOF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (EOF可以任意)</P>
<P style="TEXT-INDENT: 2em">#cat&nbsp; &gt;&gt;file &lt;&lt; EOF</P>
<P style="TEXT-INDENT: 2em">&gt;hello world </P>
<P style="TEXT-INDENT: 2em">&gt;this is the second line</P>
<P style="TEXT-INDENT: 2em">&gt;bye</P>
<P style="TEXT-INDENT: 2em">&gt;EOF</P>
<P style="TEXT-INDENT: 2em">结果</P>
<P style="TEXT-INDENT: 2em">#echo&nbsp; file</P>
<P style="TEXT-INDENT: 2em">hello world </P>
<P style="TEXT-INDENT: 2em">this is the second line</P>
<P style="TEXT-INDENT: 2em">bye</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">与的行为</P>
<P style="TEXT-INDENT: 2em">rm&nbsp; haike&amp;&amp;&nbsp; echo “you are succeed”</P>
<P style="TEXT-INDENT: 2em">只有左边成功才会执行右边命令</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">或的行为</P>
<P style="TEXT-INDENT: 2em">rm&nbsp; haike|| echo “the left command is not exculated”</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">grep的使用</P>
<P style="TEXT-INDENT: 2em">参数 </P>
<P style="TEXT-INDENT: 2em">-c&nbsp; 只输出匹配行的计数</P>
<P style="TEXT-INDENT: 2em">-h&nbsp; 查询多个文件时不显示文件名</P>
<P style="TEXT-INDENT: 2em">-l&nbsp;&nbsp; 查询多个文件时只显示匹配的文件名</P>
<P style="TEXT-INDENT: 2em">-n&nbsp;&nbsp; 匹配行及行号</P>
<P style="TEXT-INDENT: 2em">-v&nbsp;&nbsp; 显示不包含匹配字符的所有行</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">例子</P>
<P style="TEXT-INDENT: 2em">grep&nbsp; -n&nbsp; ‘c’&nbsp;&nbsp;&nbsp; file&nbsp; 在file 中找字符’c’</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">grep&nbsp; ‘[Ss]ept’&nbsp; file&nbsp; |&nbsp; grep 483&nbsp; 知道什么意思吧</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">grep&nbsp; -E&nbsp; ‘256|278’&nbsp;&nbsp; file&nbsp;&nbsp; 在文件查找包含256或278的行</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">其中grep&nbsp; -E&nbsp; 等于&nbsp; egrep</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">要在当前目录中查找所有的目录文件</P>
<P style="TEXT-INDENT: 2em">ls&nbsp;&nbsp; -l&nbsp; |grep&nbsp; ‘^d’&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d 是目录的意思</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">ps&nbsp; x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ps&nbsp; ax&nbsp;&nbsp; 显示进程</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/660225032008322259357</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/660225032008322259357</guid>
    <pubDate>Tue, 22 Apr 2008 14:59:03 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:05:21+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[linux 驱动模块]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/66022503200832225757806</link>
    <description><![CDATA[<div><P>前段时间学习linux内核模块的编写，依照范例编写的第一个驱动模块，将过程跟大家分享一下</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">通用的开始范例&nbsp; hello world</P>
<P style="TEXT-INDENT: 2em">第一步</P>
<P style="TEXT-INDENT: 2em">写出hello.c&nbsp; 程序</P>
<P style="TEXT-INDENT: 2em">#include &lt;linux/init.h&gt;</P>
<P style="TEXT-INDENT: 2em">#include &lt;linux/module.h&gt;</P>
<P style="TEXT-INDENT: 2em">MODULE_LICENSE("Dual BSD/GPL");</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">static int hello_init(void)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk(KERN_ALERT "Hello, world\n");</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">static void hello_exit(void)</P>
<P style="TEXT-INDENT: 2em">{</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;printk(KERN_ALERT "Goodbye, cruel world\n");</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">module_init(hello_init);&nbsp; 加载模块时调用hello_init函数</P>
<P style="TEXT-INDENT: 2em">module_exit(hello_exit);&nbsp; 卸载模块时调用hello_exit函数</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;在头文件&lt;linux/kernel.h&gt;中共定义了八个可用的记录级；我们下面按其严重性倒序列出：&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_EMERG</P>
<P style="TEXT-INDENT: 2em">用于突发性事件的消息，通常在系统崩溃之前报告此类消息。&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_ALERT</P>
<P style="TEXT-INDENT: 2em">在需要立即操作的情况下使用此消息。&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_CRIT</P>
<P style="TEXT-INDENT: 2em">用于临界条件下，通常遇到严重的硬软件错误时使用此消息。&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_ERR</P>
<P style="TEXT-INDENT: 2em">用于报告错误条件；设备驱动经常使用KERN_ERR报告硬件难题。&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_WARNING</P>
<P style="TEXT-INDENT: 2em">是关于问题状况的警告，一般这些状况不会引起系统的严重问题。&nbsp;</P>
<P style="TEXT-INDENT: 2em"></P>
<P style="TEXT-INDENT: 2em">KERN_NOTICE&nbsp;</P>
<P style="TEXT-INDENT: 2em">该级别较为普通，但仍然值得注意。许多与安全性相关的情况会在这个级别被报告。&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_INFO</P>
<P style="TEXT-INDENT: 2em">信息消息。许多驱动程序在启动时刻用它来输出获得的硬件信息。&nbsp;</P>
<P style="TEXT-INDENT: 2em">KERN_DEBUG&nbsp;</P>
<P style="TEXT-INDENT: 2em">用于输出调试信息&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每一个字符串（由宏扩展而成）表示了尖括号内的一个整数。数值范围从0到7，数值越小，优先级越高。&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">第二步</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">自己写一个Makefile 文件</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">ifneq ($(KERNELRELEASE),)</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp; obj-m := hello.o</P>
<P style="TEXT-INDENT: 2em">else</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp; KERNELDIR ?= /lib/modules/$(shell uname -r)/build</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp; PWD := $(shell pwd)</P>
<P style="TEXT-INDENT: 2em">default:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(MAKE) -C $(KERNELDIR) M=$(PWD) modules</P>
<P style="TEXT-INDENT: 2em">endif</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">clean:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rm hello*.*o*</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">运行</P>
<P style="TEXT-INDENT: 2em">加载 insmod&nbsp; hello.ko&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">卸载&nbsp; rmmod&nbsp; hello.ko</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">如果不显示的话&nbsp;&nbsp; 进入纯文本界面&nbsp; ctrl+alt+F1~F6</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/66022503200832225757806</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/66022503200832225757806</guid>
    <pubDate>Tue, 22 Apr 2008 14:57:57 +0800</pubDate>
    <dcterms:modified>2008-04-22T15:06:00+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[redhat 图形和密码]]></title>	
    <link>http://blog.163.com/haike_lyw/blog/static/6602250320082256433870</link>
    <description><![CDATA[<div><P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">新装redhat 的时候，最后一步可能让配置显示器，如果选不配置的话，最后可能进不了图形界面。</P>
<P style="TEXT-INDENT: 2em">解决办法：在命令行里面运行redhat-config-xfree86</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后配置一下显示器</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行startx</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就ok 了</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">&nbsp;</P>
<P style="TEXT-INDENT: 2em">如果忘记了root 密码。不要着急</P>
<P style="TEXT-INDENT: 2em">你可以使用单用户 Linux 模式来登录，然后创建一个新的根口令。 </P>
<P style="TEXT-INDENT: 2em">要进入单用户模式，重新引导计算机。如果你使用的是默认的引导装载程序 GRUB，你可以执行下列步骤来进入单用户模式：</P>
<P style="TEXT-INDENT: 2em">1. 在引导装载程序菜单上，键入 [e] 来进入编辑模式。 </P>
<P style="TEXT-INDENT: 2em">2. 你会面对一个引导项目列表。查找其中类似以下输出的那一行：
<TABLE cellPadding=0 width="90%" border=1>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">kernel /vmlinuz-2.4.18-0.4 ro root=/dev/hda2</P></TD></TR></TBODY></TABLE></P>
<P style="TEXT-INDENT: 2em">3. 按箭头键直到这一行被突出显示，然后按 [e]。</P>
<P style="TEXT-INDENT: 2em">4. 按一下空格键来添加一个空格，然后添加 single 来通知 GRUB 引导单用户 Linux 模式。按 [Enter] 键来使编辑结果生效。</P>
<P style="TEXT-INDENT: 2em">5. 你会被带回编辑模式屏幕，从这里，按 [b]，GRUB 就会引导单用户 Linux 模式。载入结束后，你会面对一个类似以下的 shell 提示：
<TABLE cellPadding=0 width="90%" border=1>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">sh-2.05#</P></TD></TR></TBODY></TABLE></P>
<P style="TEXT-INDENT: 2em">6. 现在，你便可以改变根命令，键入： 
<TABLE cellPadding=0 width="90%" border=1>
<TBODY>
<TR>
<TD>
<P></P>
<P style="TEXT-INDENT: 2em">bash# passwd root</P></TD></TR></TBODY></TABLE>你会被要求重新键入口令来校验。结束后，口令就会被改变，你便可以在提示下键入 reboot 来重新引导；然后，象平常一样登录为</P></div>]]></description>
	    <author><![CDATA[海客]]></author>
	    <comments>http://blog.163.com/haike_lyw/blog/static/6602250320082256433870</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/haike_lyw/blog/static/6602250320082256433870</guid>
    <pubDate>Tue, 25 Mar 2008 18:43:03 +0800</pubDate>
    <dcterms:modified>2008-03-25T18:43:03+08:00</dcterms:modified>
  </item>    
 </channel>
</rss>