博文

目前显示的是 十二月, 2008的博文

静态库/动态库 与 单线程/多线程。

假如你正在写一个C/C++的程序,那么通常一定需要链接到libc或glibc或mscvrt.采用哪种方式链接?静态?动态?微软这无耻小儿,原本他提供了8种crt,静态的,动态链接的,单线程的,多线程的,调试的,非调试的,并且干脆禁止混联。可微软在vc 2005及后续版本中完全删除了单线程的crt,强迫大家在多线程的环境下工作。vc并且警告大家不要在dll中静态链接crt,理由是crt的静态变量在每个实例中都有一份,比如你在1.dll中调用了srand(0),那么在2.dll中还得srand一次。谁在写exe的时候不顺手扔两个dll进去呢?于是大多数情况下,对于crt,仅剩的选择就是“debug版的多线程dll”和"release版的多线程dll"?还有,如果我在用C++标准库(vc的全称是vc++,它是一个C++编译器而不是C编译器),那么它强迫我打开RTTI。可是如果一个C的程序员批判C++慢,他一定会先从RTTI开口。solaris也很激进,从SunOS 5.10开始它放弃了libc.a(这个比我年龄还大的东西),并把libpthread合并到libc中。
放弃静态库的理由是:
1、为了使用线程库,必须在main函数开始之前进行一些必要的初始化工作,这个被放在了动态链接的init阶段。静态库没有这个阶段。
2、静态链接的程序不知道自身是否处于多线程的运行环境中,于是编译器不知道以何种方式去实现TSS(thread-specific storage),为此,编译的时候还得加上-D_MT -DXXXXXX
3、如果一个静态链接的程序用dlopen打开一个动态链接库,前者已经装载了libc中pthread的一部分,而后者需要用到pthread于是又要载入libc.so,那么对于符号的解析将产生很大的困难。
4、如果一个单线程的静态库突然dlopen一个需要使用多线程环境的so,那么那些为了多线程而准备的初始化函数怎么办?何时执行它们?单线程自然有单线程的好处,假如我要写一个tcp echo server这样的简单服务,那么我只需要单线程就够了,并且,大多数shell命令也只需要单线程,干嘛引进多余的复杂度?静态链接自然也有静态链接的好处,让chroot变得容易,当系统崩溃时也不至于连个sh都得不到(如果sh在/bin下而libc.so被放在了/usr/l…

rename files

我在win下用automake/libtool等写cgi的时候,遇到一个问题。cygwind的libtool在link和install模式下总是自作聪明的给可执行文件末尾加上.exe(如果以前不是以exe结尾)。而iis的性格也比较孤僻,它继承了win的传统,要求cgi-bin目录的文件必须是以.exe、.cgi等结尾的才被认为是可执行文件,才会被执行。问题是我这套代码是希望在linux下跑的,我不该在html代码中写上/cgi-bin/xxx.exe这样的东西,看起来多别扭啊,我希望我的cgi都是以.cgi为后缀名的(这样也好配置apache规则)。问题是,在Makefile.am中加上EXEEXT=.cgi后,所有的cgi在win下都以.cgi.exe结尾了。怎么办呢?查了下man,发现有个叫作rename的小工具着实好用。D:\cygwin\bin\find cgi-bin -name \*.cgi.exe -exec rename .cgi.exe .cgi {} ; 刷的一下,就解决问题了。

《麻男辣女诱惑你》

上周的时候,在宽度网上我很荣幸被选中观看《麻男辣女诱惑你》的彩排,于是今天一下班就赶紧拎起电脑包往地铁站赶。路上稍稍不顺,到剧场的时候7点20,本来规定是7点半集合,但是无奈饥肠咕咕,就只好先跟组织人沙凡打声招呼然后四处觅食去。呃,可狼狈了。端着肉饼一边啃一边往剧场跑,虽说没有把饭盒带进去,但是满口姜味肉味,亲爱的落花美女、猩红美女,实在是对不住。(顺便托落花的福,今天见着了何掌柜)回正题说。今天的演出整容非常的庞大,完全不是小剧场的风格,大概有7-9个演员吧。尽管是彩排,但是据说每个人演的都很认真。我由于老是分不清背幕的广告和前景的演员(反正不是“背靠背”就是XXX牌),所以一直处于很茫然的状态,神情恍惚。我就记得女主角脚踝很细,黑丝袜很诱人,台上总是在互赞“我爱你的腿”。我右手那边的观众很敬业,每次总是他们先笑,而且很响亮。我一般都是遇得黄段子比如谁谁谁举根黄瓜自得其乐的时候才愣一下发现,啊,该笑了,不对,不能笑。要装无知,不然显的我低俗。哼我很喜欢那个装傻的小胖,但是顺便提些小意见:其它人的情感、动作转换是不是有些太生硬了?剧场是不大但是座位太平了,很多戏都是趴地上演的,我坐第3排,看着都困难。