27
一
Written by KiSSinGGer on 一月 27th, 2010
转自 Xiaoxiao’s Blog
http://home.xxsyzx.com/2197.html
之前以为linux和windows下的socket都是符合posix标准的,在一个环境下能够正常使用在另外一个环境也没问题。但没想到两者还是有那么多不同。
1.最先发现的是在windows上需要调用那个WSAStartup进行初始化才能使用socket。
2.linux下关闭socket用close,而windows上用closesocket。
3.后来发现shutdown的参数名称不同,windows上用SD_BOTH,linux上是SHUT_RDWR。
4.在linux下如果不正常关闭socket会触发SIGPIPE异常,所以我使用signal( SIGPIPE, SIG_IGN );忽略之。
5.linux下可以使用read,write函数操作socket,也可以使用send,recv。windows上只能使用send,recv?(不考虑udp的sendfrom和recvfrom)
今天又发现一个很大的不同点了,造成了homeserver在短时间内生成了一个20GB的日志文件,用完了vps的硬盘空间。如果一个正在使用中的socket使用close来关闭之而不调用shutdown,则该socket还是处于连接中,只是在进程的文件描述符中移除了(right?)所以导致了使用那个socket的线程一直没有收到关闭信号,阻塞在socket的recv上无法被关闭。而在windows上调用closesocket就彻底地断开了连接了。
下面是网上提供的信息:
close—–关闭本进程的socket id,但链接还是开着的,用这个socket id的其它进程还能用这个链接,能读或写这个socket id
shutdown–则破坏了socket 链接,读的时候可能侦探到EOF结束符,写的时候可能会收到一个SIGPIPE信号,这个信号可能直到socket buffer被填充了才收到,shutdown还有一个关闭方式的参数,0 不能再读,1不能再写,2 读写都不能。
所以,以后关闭socket还是同时使用shutdown和close好。
5
一
Written by KiSSinGGer on 一月 5th, 2010
杨沙洲 (pubb@163.net)
线程终止方式
一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。

线程终止时的清理
不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。
最经常出现的情形是资源独占锁的使用:线程为了访问临界资源而为其加上锁,但在访问过程中被外界取消,如果线程处于响应取消状态,且采用异步方式响应,或者在打开独占锁以前的运行路径上存在取消点,则该临界资源将永远处于锁定状态得不到释放。外界取消操作是不可预见的,因此的确需要一个机制来简化用于资源释放的编程。
在POSIX线程API中提供了一个pthread_cleanup_push()/pthread_cleanup_pop()函数对用于自动释放资源–从pthread_cleanup_push()的调用点到pthread_cleanup_pop()之间的程序段中的终止动作(包括调用pthread_exit()和取消点终止)都将执行pthread_cleanup_push()所指定的清理函数。API定义如下:
void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pthread_cleanup_pop(int execute)
pthread_cleanup_push()/pthread_cleanup_pop()采用先入后出的栈结构管理,void routine(void *arg)函数在调用pthread_cleanup_push()时压入清理函数栈,多次对pthread_cleanup_push()的调用将在清理函数栈中形成一个函数链,在执行该函数链时按照压栈的相反顺序弹出。execute参数表示执行到pthread_cleanup_pop()时是否在弹出清理函数的同时执行该函数,为0表示不执行,非0为执行;这个参数并不影响异常终止时清理函数的执行。
pthread_cleanup_push()/pthread_cleanup_pop()是以宏方式实现的,这是pthread.h中的宏定义:
#define pthread_cleanup_push(routine,arg) \
{ struct _pthread_cleanup_buffer _buffer; \
_pthread_cleanup_push (&_buffer, (routine), (arg));
#define pthread_cleanup_pop(execute) \
_pthread_cleanup_pop (&_buffer, (execute)); }
可见,pthread_cleanup_push()带有一个"{",而pthread_cleanup_pop()带有一个"}",因此这两个函数必须成对出现,且必须位于程序的同一级别的代码段中才能通过编译。在下面的例子里,当线程在"do some work"中终止时,将主动调用pthread_mutex_unlock(mut),以完成解锁动作。
pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut);
pthread_mutex_lock(&mut);
/* do some work */
pthread_mutex_unlock(&mut);
pthread_cleanup_pop(0);
必须要注意的是,如果线程处于PTHREAD_CANCEL_ASYNCHRONOUS状态,上述代码段就有可能出错,因为CANCEL事件有可能在pthread_cleanup_push()和pthread_mutex_lock()之间发生,或者在pthread_mutex_unlock()和pthread_cleanup_pop()之间发生,从而导致清理函数unlock一个并没有加锁的mutex变量,造成错误。因此,在使用清理函数的时候,都应该暂时设置成PTHREAD_CANCEL_DEFERRED模式。为此,POSIX的Linux实现中还提供了一对不保证可移植的pthread_cleanup_push_defer_np()/pthread_cleanup_pop_defer_np()扩展函数,功能与以下代码段相当:
{ int oldtype;
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
pthread_cleanup_push(routine, arg);
...
pthread_cleanup_pop(execute);
pthread_setcanceltype(oldtype, NULL);
}


线程终止的同步及其返回值
一般情况下,进程中各个线程的运行都是相互独立的,线程的终止并不会通知,也不会影响其他线程,终止的线程所占用的资源也并不会随着线程的终止而得到释放。正如进程之间可以用wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数。
void pthread_exit(void *retval)
int pthread_join(pthread_t th, void **thread_return)
int pthread_detach(pthread_t th)
pthread_join()的调用者将挂起并等待th线程终止,retval是pthread_exit()调用者线程(线程ID为th)的返回值,如果thread_return不为NULL,则*thread_return=retval。需要注意的是一个线程仅允许唯一的一个线程使用pthread_join()等待它的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。
如果进程中的某个线程执行了pthread_detach(th),则th线程将处于DETACHED状态,这使得th线程在结束运行时自行释放所占用的内存资源,同时也无法由pthread_join()同步,pthread_detach()执行之后,对th请求pthread_join()将返回错误。
一个可join的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收。


关于pthread_exit()和return
理论上说,pthread_exit()和线程宿体函数退出的功能是相同的,函数结束时会在内部自动调用pthread_exit()来清理线程相关的资源。但实际上二者由于编译器的处理有很大的不同。
在进程主函数(main())中调用pthread_exit(),只会使主函数所在的线程(可以说是进程的主线程)退出;而如果是return,编译器将使其调用进程退出的代码(如_exit()),从而导致进程及其所有线程结束运行。
其次,在线程宿主函数中主动调用return,如果return语句包含在pthread_cleanup_push()/pthread_cleanup_pop()对中,则不会引起清理函数的执行,反而会导致segment fault。
17
九
Written by KiSSinGGer on 九月 17th, 2009
你们看,并不是只有我们国家才监视即时通讯工具.所以,心态要平和.
http://www.megapanzer.com/source-code/
As reported by Techworld in October 2006, Ruben Unteregger’s ex-employer, ERA IT Solutions, tasked him with writing a ‘white’ Trojan capable of intercepting, recording and uploading Skype and other VoIP calls – software subsequently used by the Swiss Department of the Environment, Transport, Energy and Communications (UVEK).
29
六
Written by KiSSinGGer on 六月 29th, 2009
福建南平医患冲突 ( 网易新闻 )
http://news.163.com/09/0629/09/5CVFGJ3J0001124J.html
如果记者认为这仅仅是一起医患冲突,未免说得太浅. 这种事情的发生绝非偶然,是积怨的爆发. 首先,当今恶劣的医疗体制,早就注定了医患之间的"双败"结果.其次,农民受到的种种歧视和不公正待遇,是导致社会不稳定的最大原因. 还有,官场环境造成的官员的功利,短视,导致这种事情只会被暂时平息,而绝不会被解决. 如何改变这种江河日下的局面,怎么办大家都知道,办不办只有上面知道. 大家可以看这篇新闻调查里面,上面是如何处理这样的事的. Too simple, always naive!
26
六
Written by KiSSinGGer on 六月 26th, 2009
愿你走好.你本不属于这个混乱肮脏的世界,你只属于天堂,感谢你多年来对这个世界的奉献.

19
六
Written by KiSSinGGer on 六月 19th, 2009
公积金政策应尽快取消
转自:中国经济学人
原文地址:http://chinaeconomist.org/archives/705.html
周克成
铅笔经济研究社
我知道政府建立住房公积金的本意要改善百姓的居住水平,至少他们声称的目标应该是这样,但一直不知道他们是如何保证住房公积金制度是能够实现这个目标的。不过,今天我在广州住房公积金管理中心的网站上看到了答案。
广州住房公积金管理中心的网站上,一篇题为《国家建立住房公积金的目的》的文章介绍:
“住房公积金是国家强制性建立互助性储备金。它通过增加单位缴存部分及减免个人所得税来提高缴存人的购买住房的支付能力。同时,通过低利息贷款减轻使用者购房成本的支出,……因此,这是一项利国利民的实惠政策。”
很清楚,住房公积金政策的制定者相信天底下有免费的午餐,他们以为通过一部法律,通过一个强制措施,通过一个住房公积金管理中心把老百姓的钱捣来捣去一番,就能改善老百姓的居住条件。
但我自己是万万不信的。
首先,政府无法通过颁布法律提高人们的工资、福利水平。在公积金制度下,政府是可以强制用工单位为职工“缴纳”一部分公积金,但用工单位公积金缴纳上多掏了腰包,那在发工资、发奖金的时候,必然就得减少一点。因为如果一个员工无法创造那么多价值的话,资本家根本不可能也不会有能力为之提供那么多的福利。
其次,说什么“通过减免个人所得税来提高缴存人的购买住房的支付能力”,不过是政府为强制推行其公积金政策讴歌粉饰而已。减免税收是能提高人们的购买力,但如果政府真正关心的是人们的购房能力,那么直接减免税收好了,何必搞出一个蹩脚的住房公积金制度?
第三,政府声称可以为公积金使用者提供低息贷款。但这一做法显然无法持续。住房公积金管理中心本身并不能创造财富,政府也不大可能为之不断注入资金,而每个借款人的最终贷款金额必然大于他们的缴存金额。当一定的时间到来,每个缴纳公积金的人都向住房公积金伸手的时候,公积金管理中心的钱从哪里来?
这一天的到来一点都不遥远。广州目前的情况就已经是这样。据广州公积金管理中心主任夏卫兵介绍,“广州公积金当前每个月的归集额约为17亿元,但是每个月的提取额为12亿-13亿元,外加每月10亿元的贷款额,当期月差约6亿元。”目前广州公积金还有前些年积累下来的资金可支撑一段时间,但那笔钱花完之后怎么办呢?而其他城市,终究也会走到这一天,到时候怎么办呢?
广州想出了一个办法,就是搞什么“公积金留存半年”的政策,即以后所有人的公积金都将有半年的缴存额会留存在帐户中,无法提出,等于这笔属于老百姓自己的钱,确确实实只能当做一串数字摆在那供公积金缴存者看着心痛了。况且,即使这个政策得以顺利出台,那也只能暂缓目前的紧张局面。因为随着公积金贷款额的增加,公积金缺口还会再次打开,公积金入不敷出的局面必将再次出现。
当然,政府有办法在表面上继续维持住房公积金政策,而当他们这样干的时候,老百姓只会更亏。那就是严格限制提取公积金的自由,大幅减少公积金贷款额度。这样一来,公积金缺口是不会大,账户是没有“亏空”。但是,人们光能交钱,不能取钱、不能贷款,那这公积金除了具有侵占百姓财产的功能之外,还能有什么用处呢?还能实现政府当初声称要提高百姓购房能力的目标吗?
所以,对于公积金政策而言,政府目前最好的应对办法,就是马上废除住房公积金政策,不再强制要求个人、企业缴纳住房公积金,并把之前已经缴纳的公积金如数退还所有缴存人。否则,公积金迟早难以持续,迟早沦为骗局。 (2009年6月18日星期四)
19
六
Written by KiSSinGGer on 六月 19th, 2009
1.胡锦涛深情俯身献菊花
2.莱昂纳多与女友恋情告吹,只因对方逼太紧。(搜狐)
3.放松操,让女兵笑容更灿烂(网易)
4.三大全国性交易市场布局渝中(新浪)
5.干了112天终于湿了 (南方都市报)
9
六
Written by KiSSinGGer on 六月 9th, 2009
近年每年的两会都会有人提到财政预算公开的话题。其实讨论“是不是要公开”是纯他妈扯。这钱是我们交上去的,怎么个花法难道也成为国家机密?这些钱的去处至少应该公开到每一个项目的粒度。这样一来,至少给我一点点时间做个心理准备,来年准备逃税多少多少。否则,当我在有些新闻上看到政府花了大把的钞票去买些个极其二逼的东西,我会很伤心。
绿色上网过滤软件试点测试启动仪式在郑州举行
关于“绿色上网过滤软件产品一年使用权及相关服务采购”竞争性谈判结果的公告
7月起新电脑将预装上网过滤软件
你们看,就这不入流的东西,4000万;一个本科毕业设计水平的玩意儿,4000万。你妈逼的,有那钱老子不会自己花?有那闲工夫老子不会自己做? 还还还鸡巴试点测试启动仪式……
1
六
Written by KiSSinGGer on 六月 1st, 2009
今天:
国家提高成品油价格 汽柴油6月1日起每吨涨400元
近日,国家发展改革委发出通知,决定自6月1日零时起将汽、柴油价格每吨均提高400元。
自今年3月25日国内汽、柴油价格上调以来,WTI原油期货价格由每桶53.98美元上涨到66.31美元,国内成品油价格调整参考的国际市场原油价格由每桶45美元左右上涨至目前的57美元左右。根据完善后的成品油价格形成机制,决定上调汽、柴油价格,并综合考虑相关因素,适当缩小了价格调整的幅度。
通知要求,中石油、中石化两大公司要努力做好成品油生产和调运的衔接,确保市场供应。各级价格主管部门要加强价格监督检查,严厉打击各种价格违法行为,切实维护成品油市场的稳定。
而在此之前,是这样的:
国家发改委辟谣:近期成品油价格不会上调
中广网北京5月27日消息(记者冯雅)据中国之声《央广新闻》17时01分报道,中国之声记者刚刚从国家发改委有关部门了解到:近期成品油价格不会上调。
今天有多家媒体纷纷预测成品油零售价格可能在今天晚上上调。大家对成品油价上调的预期非常大,一是因为近日国际油价持续上涨;另外一方面中石化的老总估计最迟5月28号油价会有所上调。
国家发改委有关部门今天明确表示,近期不会上调油价,也希望大家减弱对油价上调的预期,过一个快乐的端午节。
引申阅读:
请注意,以上网易新闻,无法评论。原因是:专你妈逼家分析,这个现象,原因是受股市继续上行的预期影响,导致整个债券市场交易不太活跃。而别有用心之人将此现象归结为政鸡巴府的信用等级降至冰点。不用多说,居心叵测之人看了这几条新闻心中自有定论。