关于linux c的wait(int *status)函数

上操作系统课的时候,老师举例linux进程时说了wait函数,当时老师说wait(args)函数里面的参数的意思是等待指定时间,过了这个时间之后就不等待了。起初也没什么异议,因为我知道java的线程里面wait()确实是这样用的。但是今天编了一点程序,就发现完全不是这样的。

我编了这么一个程序:

 

那么,如果wait(2)的意思真的是等待3秒的话,在child wakes up语句执行之前,parent应该会被唤醒。但是事实并非如此,在子进程完全执行完毕之后,父进程才被唤醒,而且s的值是-1,也就是失败的意思。

然后看了wait()函数的说明,发现确实里面的参数完全不是等待时间,而是一个int型指针。所以,wait(3)这样的调用根本是不对的。

在此,我发现了一个linux C语言很奇怪的现象,wait函数明明是在<sys/wait.h>里面,但是我根本没有include它,却居然也能用。只不过编译的时候会出现|warning: implicit declaration of function ‘wait’|。也就是说,编译器会自动的隐式的把这个头文件给include进去。这样编译器看起来很智能,可惜编译器智能的还不够,因为它之后就忘了检查函数的参数类型了。于是wait(3)这样的语句居然就通过编译了,而且显然调用是出错的,返回值是-1.

于是我把#include<sys/wait.h>显式地写在文件里,一编译,wait(3)马上报错,参数不对。恩。这个应该是c语言编译器的问题了。

那么wait(int *status)的参数到底是什么呢?经过我查阅资料,大致认为是这样的:

wait()函数应该会返回两个东西,一个是子进程的pid,另外是子进程退出的时候的状态。由于return只可能出一个值,所以另外一个值得通过指针参数对外部变量值修改,由这个status外部变量体现出子进程退出的状态。

比如我子进程是正常退出,而且退出的时候运行的是exit(5).那么在父进程中,有这么一段话:

 

这样,c_pid就等于子进程的id,status是对应于子进程执行exit(5)后的一个值,这个值不是5,因为它不仅要返回exit的值,而且要返回是正常退出还是非正常退出。

从status中,可以判断出很多东西,当然不许要自己判断。linux提供了8个宏来判断这个status代表的意思。

比如要知道子进程exit()的值,就要用WEXITSTATUS(status)这个宏。

接着上面:

 

最后给出完整的测试程序:

 

 

另外,实验书上,有wait(0);这样调用的。这样调用是对的,等同于wait(NULL);,但是wait(非0数)一定是错的。

 

 

 

基于socket(TCP)的聊天程序(C/S结构)

这个是我们网络与通信的作业。当初看作业题的时候感觉这题是要我们熟悉TCP连接,不过后面跟了很多很烦的要求,比如一定要有GUI,要验证用户登录,要给出当前用户的列表,要能给所有人发信息,要能给指定的人发信息。然后我又用java作为语言,socket的类本来就封装好的,所以整个主题就偏掉了,更像是java多线程编程联系。而且我觉得,我整一个编程菜鸟。程序结构乱七八糟,算法乱七八糟,而且编程很磨叽,编了好几天才完成这个程序。多线程的问题确实搞的我头很大,有时候不得不动用一些山寨方法避免问题。

看了别人编的程序,大多只有两个文件,一个server,一个client。我本来为了程序结构清晰一点,多建了几个,结果到了后面越来越烦了。

整个C/S的运作方式是这样的:server建立之后,等待client连接。client启动之后,连接到服务器的socket,第一步是向服务器发送用户名和密码。服务器连接后的第一步是产生一个监听线程,然后监听到客户端发过来的用户名密码做验证,如果验证通过,则向客户端发送connected的信号,然后将该socket加入到一个arraylist中方便以后管理,如果没通过,就向客户端发送failed信号。客户端在接收到connected信号之后,开启新的监听线程监听服务器发来的别的信息。客户端能做到向所有人发送一个信息以及向特定的一个人发送信息。用的方法很山寨,就是在信息前面加个头,比如说sta:或者stu:,分别表示向所有人发送和向某人发送。服务器接收到这个信息之后,先要解析信息的首部,然后再执行相应的操作。

我之前为了让程序层次分明一点,把客户端分为两层,一层是核心层,就是ClientKernel这个文件,它封装了所有客户端的功能,和服务器通信的实体也是它,另外一层是客户端实体,只要调用一下ClientKernel的函数就可以实现功能了,这样做的好处是可移植性,可以做命令行的客户端,也可以做GUI的客户端,其实是模仿twitter4j这样的库,不过后来发现做的很烂啊。另外,为了做到有新用户登录或者用户退出时,所有用户的userlist列表都能自动刷新,而客户端实体又和kernel分离,就用了一个接口起到类似回调函数的作用。

另外,我的英文很差,所以几乎所有的变量名都是乱起的。另另外,我对java的异常捕获不是很了解,所以都是瞎捕获的。另另另外,在线程方面我可能遇到了一点问题,为了避免这些问题,有些io流创建了就没有关闭,这个实在很难解决。

下面给出代码:

Server.java:

 

UserController.java:

User.java:

 

ClientKernel.java:

 

ClientOpt.java(这个名字起错了,应该是指实体客户端要有的操作):

 

 

 

GUI代码太长,不给出了。

 

 

 

 

[转]驳《划清中国特色社会主义民主同西方资本主义民主的界限》

9月16日《求是》杂志发表文章《中国特色社会主义民·主政治的制度优势与基本特征

——划清中国特色社会主义民·主同西方的界限》(以下简称《划清界限》),强调不照搬西方资本主义民·主模式、真正的人民民·主、人民代表大会制度、共产党领导的多党合作制度、协商民·主和选举民·主相结合等中国特色社会主义民·主特征。

中国当然要走自己的道路,但中国作为一个发展中国家,首先要谦虚地汲取人类文明一切优秀成果,而不是划清什么界限。中国的民·主不管叫什么名字,一定要是真民 ·主,一定要实现真正的人民当家作主。民·主是真是假,民·主是否足够广泛,人民是否实现了真正的当家作主,要认真听听最大多数普通公民的评价。

一、走自己的路,汲取人类文明一切优秀成果

《划清界限》一文强调绝不照搬“西方资本主义民·主模式”。民·主制度各国不尽相同,比如美国实行三权分立,英国实行议会中心制,从来都没有一个统一的“西方资本 主义民·主”模式供中国照搬,即使有人想全盘西化也是不可能的。而且,什么是西方?什么是资本主义?什么是社会主义?这些概念都有争议,把复杂的人类民·主制 度模式用简单的西方或东方、资本主义或社会主义来划分,远远脱离了人类社会今天的现实。

虽然民·主模式有差异,当今世界上绝大多数国家民·主都遵循一些共同原则,比如开放竞争选举、权力分立制衡、公民基本权利保障等。这些基本原则基于基本的人性, 只要是人组成的国家,这些原则都普遍适用。道理很简单,如果没有选举,如果权力是靠枪杆子,怎么可能占领者成为“公仆”而被占领者成为主人?如果选举没有 竞争,选民根本不了解候选人,选民怎么可能表达自己真实的意愿?如果没有权力分立制衡,怎么可能指望那么多官员不贪污腐化?如果公民基本权利和自由没有保障,没有言论、结社等自由,怎么可能保证真正的人民当家作主?

中国当然要走自己的路,因为世上没有任何两个国家走完全同一条路。如果一个公民真爱自己的国家,首先要承认自己民·主制度的不足,而不是从概念到概念,大谈社 会主义民·主比资本主义优越,中国的人权比美国好五倍,等等,以至于让大多数普通公民感到笑话。我们必须承认,中国是一个发展中国家,民·主近些年才刚刚从村 子里起步,不是全世界最先进的。民·主要符合国情,中国民·主可以探索自己的模式,比如中央与地方的权力分配模式,但绝不可以说只有中国人素质低,不适合普.选;中国人都是圣人,不需要权力制衡;中国人都是天生的奴才,不需要权利和自由。

二、真民·主还是假民·主

《划清界限》一文强调民·主“鲜明的阶级性”,认为“资本主义民·主”是金元民·主,虚伪的民·主,社会主义民·主才是真正的民·主。没有一个国家的民·主是完美无缺的,美国民·主也存在很多问题,比如金钱腐蚀,但如果就此把美国民·主贴上金元民·主的标签,甚至斥责其假民·主,恐怕大多数美国普通公民不答应。2008年美国大选确 实花费了二十多亿美元(统计范围和方式不一样结果也有差别),但这不是浪费,而是让选民了解候选人、四年一度全面反思国家内政外交必要的成本,何况这些钱 投入到了广告、旅游等行业,促进了经济增长,还促成了一场持续数月的全民狂欢。美国2002年新修订的竞选法规定,企业和工会不得向候选人捐款;个人对总 统候选人捐款总额在党内初选和大选两个选举中分别不能超过2300美元,就是说在一个选举年份每个选民给一个候选人捐款最多不能超过两次共4600美元, 而且超过200美元以上的捐款都是公开的,任何人都可以通过网络查询。奥巴马2008年竞选募集到了6亿多美元资金,其中85%以上是通过网络募集的,而 其中的绝大部分是100美元以下的小额捐款,也就是说,支持奥巴马当选的,不是所谓大资本家,而是普普通通的美国公民。不是因为奥巴马有钱就当总统,而是 奥巴马受到公众支持才有竞选资金才能当选总统。

我国宪法第35条确实规定了公民不分种族、性别、宗教等因素享有平等的选举权与被选举权,这样的条款是全人类普适的,绝大多数国家的宪法都有基本相同的内 容。但是,我们的民·主制度形式和实质差的很远。以人大选举为例,只有区县和乡镇两级人大实行直接选举,其他各级人大代表是间接选举,普通公民根本不知道自 己的人大代表是谁,怎么可能要求代表服务选民?即使基层直选,由于选举缺乏开放竞争,导致大量官员代表,自己怎么可能监督得了自己?根据宪法,人民代表大 会是国家最高权力机关,人大代表却是兼职。同样根据宪法,国家各级政府首脑由同级人大选举产生,而现实中人大几乎对官员的任命几乎没有发言权,这是中国人 都知道的常识。

三、人民代表大会制度更有效率?

《划清界限》一文说“西方资本主义”两院制决策效率低,而我国人民代表大会制度成功实现了民·主和效率的统一。权力分立制衡确实会带来某些决策的低效率,比如, 福利多一些还是少一些,税收多一些还是少一些,等等,有些争议甚至持续多年。和专制相比,真正的民·主决策效率必然要低。即使我们国家实行一院制,即单一的 人民代表大会,如果各个代表真正代表自己的选民,为自己的选民利益据理力争,三千人讨论起来肯定要比众多国家几百人的议会效率低。而如果他们不代表自己的 选民,不为自己的选民争取利益,让举手就举手,让画圈就画圈,那还叫什么民·主?

两院制确实看起来有更多扯皮,但是,两院制大都符合本国国情,一院代表人口数量,一院代表行政区域,这是比较科学的代表机制。而且,两院制不是所有的决策效 率都低,1941年日本偷袭珍珠港,美国国会迅速通过了宣战决议,涉及到国家重大利益时,不是每个人都扯皮。反观那些决策效率低的议题,往往都是因为争议 比较大,如果争议比较大的议题却以高效率的方式通过决策,必然会留下隐患。中国文化大革命时期决策效率最高,然而,出现了大量错误决策。

人民代表大会制度从来不是中国的创造,它来自苏联,更早还是来自“西方资本主义”,因为封建专制从来没有过什么议会民·主。它跟当今世界绝大部分国家议会的理 念一样,都是通过选举产生,都是为人民当家作主,都拥有财政预决算、选举、重大事项决定等权力。如果说,人民代表大会制度和绝大多数国家议会有本质区别的 话,不是前者决策效率更高,而是它从没有充分讨论过问题,也没有实际决策权力。

四、政~党不能高于国家

《划清界限》一文强调一党执政和多党合作是中国特色。人类社会有一个基本的常识——垄断必然损害消费者的利益,政治领域也一样,如果某个政~党垄断了权力,人民 不可能当家作主。政~党轮替虽然也存在这样那样的问题,但普通公民总还是有个选择,候选人还会过来讨好选民,退一万步讲,即使贿选,选民手中的选票总还算有 点价值。如果一党垄断权力,人民根本没有选择的权利,怎么可能是人民当家作主?

现代文明社会,政~党只是一个服务者团队,尽管参选目标可能是为了权力职位,但获得权力职位的过程不是暴力革命,而是公平竞争。国家是全体人民的,宪法和法律 是全体人民的,公共服务的职位比如总统是全体人民的,军队和警察是全体人民的,各种公用设施是全体人民的。而政~党,不过是服务提供商,人民招标,服务商竞 聘服务岗位,就像家里聘保姆一样。也许看起来只有少数几个政~党轮替,但并不等于这几个党合谋把持了国家权力,他们的“轮流”本质上不是他们几个说了算,不 是少数资本家说了算(有严格的法律限制有钱人给政治家捐助),而是人民说了算,人民一人一票选出来的。

没有一个政~党会永远执政,就像秦王朝不可能万世一样。权力应当来为人民所赋,而不是“打江山坐江山”。一个政~党是不是最先进,能不能代表人民利益,应该有全体公民来评价,来选择。执政~党的执政能力不在于用枪杆子维护自己的江山,而是在竞争中胜出,成为服务的最佳提供者。

五、民·主从来离不开协商

《划清界限》一文强调协商民·主与选举民·主相结合的中国特色。真正的民·主从来离不开协商,也离不开公民参与。绝大部分国家选民享有的民·主权利不只是几年一次投票,还包括通过媒体、给议员打电话写信等多种途径参与公共决策。在一个开放社会中,公民参与政治是社会常态,只有专制社会里,公民参与政治才成为一种奢望。

民·主决策过程中常常会有协商,比如多党联合执政必须要有协商,即使一个具体的经济政策不同党派之间也会协商,毫不夸张地说,协商是议会民·主的常态。所以,协商绝不是中国民·主的特色,而是真实民·主的常态。

协商的前提是参与协商的党派或者公民有表决权,如果没有表决权,那就不叫协商,那叫提建议,甚至叫奏折。如果只有一个政~党说了算,其他政~党无权参与表决,那党派之间就不存在真正的政治协商。所以说,中国特色社会主义民·主恰恰没有真正的协商。

总揽当今世界各国,民·主模式有差别,但民·主不分东西,更不分主义。如果非要在不同国家之间划分出民·主的本质区别的话,民·主有真假之分,即人民是否真正实现了当家作主,人民有没有权利选择执政者。

每一个国家的民·主都有自己的特色,但这些民·主也有普世的原则,比如选举、权力制衡、公民权利保障等。中国人也是人,具有普遍的人性,在此人性基础上建立的民·主制度也必然要遵循人类社会普遍的法则。今天中国的宪法里,民·主无论从理念还是具体的制度设计上,都没有超出议会民·主制度的框架和基本原则,至于人民代表 大会制度、政治协商制度、多党合作等制度如果非要说有什么中国特色的话,主要是因为他们没有实际运作,一旦真正落实宪法,各项民·主制度运作起来,就会发 现,我们的制度设计在科学性方面还很欠缺。

在社会主义概念本身已经存在巨大争议的今天,把民·主贴上主义的标签,然后陷于自己的概念游戏,已经没有任何实际意义。听听普通中国公民的呼声,顺应历史的潮流,开始政治改革,实现真正的民·主法治公平正义,才是人间正道。



 

真理掌握在少数人手中,道德掌握在多数人手中

    前不久很多人说,上海气象局谎报气温,明明40+了,却报39度。怀疑这是一种行政性目的的欺骗。甚至有人实地测量了一下温度,显示40+甚至是50+,认为这是决定性的证据证明气象局欺骗。但是,无论气象局有没有真的在搞行政性的欺骗,有一点网友肯定搞错了,气象站测温不是测露天太阳直射情况下地面附近的温度的,而是将温度计放在通风的百叶箱里,百叶箱离地面也有一定的距离。这样测温不是欺骗,而是气象台温度测量的标准形式,无论在哪里都是这样的。我之所以知道这些,是因为我小时候去参观过舟山市的气象台,这些都让我印象深刻。而在普通民众当中,又有多少人参观过气象台测温呢?
这几天,我也碰到一些类似的事情。最近android 2.2系统基本上已经移植到hero上面了,但是标准的android 2.2系统是x.32内核的,现在所有hero用的内核都是基于x.29的。于是hiapk上面很多人在说,x.29的android2.2不是2.2,而是2.1改的。甚至很多网友都是用专家的口气跟别人在说。我想,这种话被XDA上面辛辛苦苦移植系统的GEEK们看到,一定要吐血了。显然,这些网友根本不清楚android系统的结构层次。内核对于android来说并不是最重点内容,android的第二层虚拟机、中间件和第三层应用层才是重点。现在for hero的2.2系统,虽然内核还是x.29的,但是上面两层软件层已经全部是从android2.2的源码编译过来的了,那么它就是2.2系统。当然,不能指望所有用hero的用户都得知道android的结构层次,否则android系统也太失败了(geek only的系统肯定不能赚钱)。
从上面两个例子可以看出,真理往往是掌握在少数人手中的,因为每个领域的专家都只有少数的人,除了这些人之外,别的人对于这个领域往往会出现偏见,导致事实被歪曲。当然,这是正常不过的现象。
然而,这跟道德掌握在多数人手中是不相矛盾的。因为道德这个东西其实是感性元素组成的,只是感觉而已,不存在进一步的专业判断。多数人认为骗人是不对的,所以会对气象站的测温和现实感觉存在的偏差愤愤不平。多数人认为假的东西都是不好的,所以对于x.29内核的android2.2表现出拒绝的态度。虽然他们在专业判断上是错误的,但是在道德方面是正确的。