Search This Blog

Thursday, September 28, 2006

vmplayer的小问题

vmplayer是免费的,当然就不需要去做那些找序列号之类的猥琐事了,不过在gentoo里emerge了vmplayer以后普通用户无法正常执行:
VMware Player Error:
VMware Player must be set-UID root, "/opt/vmware/player/lib/bin/vmware-vmx" is not. Are you running /opt/vmware/player/lib/bin/vmware-vmx from its distribution directory? That copy of the program is not set-UID root.
又google,找到答案:
#chmod 4755 /opt/vmware/player/lib/bin/vmware-vmx
再运行,没有报错了
这个4表示可以set-uid root

Wednesday, September 27, 2006

64-bit环境下C语言的变量类型长度

受了16bit和32bit环境的影响,以为在我的gentoo 2006.1 amd64上int肯定是64bit的,结果发现是32bit,很是奇怪,难道是“伪64bit”,于是google之,找到资料,原文在这里
原来还有个model的问题,有三个model可选择,ILP64 LP64 LLP64
在ILP64下,int long pointer都是64bit,而LP64下int是32bit,long和pointer是64bit,LLP64的int和long都是32bit,pointer是64bit,要表达64bit的数据,要用long long来表示(非标准)
又说三个model里LP64的过渡最平滑,在64bit环境里写的代码不需要经过多大修改就能运行在32bit环境中,而其他两个model不是需要借助非标准的类型就是太依赖于环境,使得移植困难。

Tuesday, September 26, 2006

避免全局变量

全局变量是方便,但是在多线程/进程环境下是不安全的,所以在有潜在多线程/进程应用的情况下应该尽量避免全局变量。事实上,全局变量也不利于程序的模块化。
举个例子,一个自己遇到的小问题。
我有一个结构体:
typedef struct _gtalk_user{
gtalk_user_data_ptr gudp;
gtalk_buddy_ptr gbp;
gtalk_connection_ptr gcp;
gtalk_handlers_ptr ghp;
XML_Parser parser;
int errorno;

}gtalk_user;

结构体的成员包括了四个结构体指针,一个expat的解析器,还有一个错误号变量,这个程序可以让用户选择是否进行tls连接,所以gudp->use_tls是根据用户的输入赋值的,这相当于一个用户的偏好,而事实上真正要用到这个值的是在连接的时候。由于某种原因,我不想让网络连接的模块知道gtalk_user里除gcp以外的信息,又不想让调用网络连接模块里的函数的用户知道gtalk_user里的信息,难道只能把use_tls声明为全局变量吗?
我是这么做的:
void gtalk_connection_init (gtak_user_ptr)是连接初始化函数,这是对外的接口,而事实上我把它定义成了
#define gtalk_connection_init(gup) _connection_init(gup->gcp,gup->gudp->use_tls)
真正办实事的函数_connection_init的原型为
void _connection_init (gtalk_connection_ptr gcp,int use_tls);
这样,对于用户来说,只管对gup所代表的gtalk_user这个抽象的对象调用gtalk_connection_init函数,它不需要了解gtalk_user内部的细节
对于_connection_init函数来说,它也不需要了解gcp以外的信息。
其实质是我用宏定义把给_connection_init函数传递use_tls参数的过程对用户屏蔽了,于是达到了我的目的。

一点体会,有错误欢迎指正。

Saturday, September 16, 2006

gentoo 2006.1 amd64

第三次装gentoo了,只用了一天时间就把基本系统装好了,算是相当顺利了。
这次弄明白了一些问题:
lcd的刷新率太高,用gtf生成的modeline根本就不起作用,后来知道nvidia的驱动提供了刷新率的设置,如下:
Section "Device"
Identifier "Nvidia Geforce 7600GS"
Driver "nvidia"
Option "VertRefresh" "60" #####这一行设置刷新率
Option "NvAGP" "1"
Option "RenderAccel" "true"
Option "CursorShadow" "true"
Option "AllowGLXWithComposite" "true"
Option "Coolbits" "1"
VideoRam 262144
EndSection

另外是搞定了gensplash,非常pp,原来是要在编译内核的时候加上FB_VESA的支持,内核加上参数vga=795是让控制台的分辨率为1280x1024,791是1024x768,以下是截图


说说2006.1的livecd
已经可以直接显示中文,查资料的时候方便了很多,而且中文显示效果很不错
软件包的版本倒是没什么好惊奇的
不过那个图形化的系统安装工具我还是不敢试,自从第一次它带的分区工具把我整块硬盘都格式化之后我就打算老老实实手动安装,也没什么不好的