月度归档:2009年09月

Linux下动态加载链接库

必须包含头文件 dlfcn.h。

使用到dlopen, dlclose, dlsym 3个主要函数,dlerror可以获取加载中遇到的错误的字符串。

下面给出部分代码,来自最新版homeserver:

	DBG("Loading plugin [%s]", name );
#ifdef __WIN32__
	p->handle = LoadLibrary( path );
	if( p->handle ){
		p->entry = (plugin_entry) GetProcAddress( p->handle,"plugin_entry");//
		p->cleanup = (plugin_entry) GetProcAddress( p->handle,"plugin_cleanup");//
	}
	if( !p->handle || p->entry==NULL ){
		DBG("# Loading plugin: %s failed: %d", path, GetLastError() );
#else
//linux
	p->handle = (int)dlopen( path, RTLD_LAZY );
	if( p->handle ){
		p->entry = (plugin_entry) dlsym( (void*)p->handle,"plugin_entry");//
		p->cleanup = (plugin_entry) dlsym( (void*)p->handle,"plugin_cleanup");//
	}
	if( !p->handle || p->entry==NULL ){
		DBG("# Loading plugin: %s failed: %s", path, dlerror() );
#endif

homeserver的源代码下载链接:

homeserver090930

Linux下使用readdir查找文件

在Windows上一直使用_findfirst查找文件,以为是标准库里的,可以在Linux下直接使用。今晚试了一下失败了。
Linux下使用readdir来扫描一个目录下的项目。首先,需要包含头文件dirent.h。然后定义下面搜索需要的结构。

DIR* dir_info; //目录指针
struct dirent* dir_entry; //目录项信息指针

//打开一个待扫描的目录
dir_info = opendir(“./plugins”);
if( dir_info ){
        //打开目录成功
while ( (dir_entry = readdir(dir_info)) != NULL)
{
             //忽略这两个特殊项目
             if(strcmp(dir_entry->d_name, “..”)==0 || strcmp(dir_entry->d_name, “.”)==0)
continue;
             //具体操作。。。
plugin_create( srv, dir_entry->d_name );
} // while
        //使用完毕,关闭目录指针。
        closedir(dir_info);
}

可惜,我没有找到有能够在windows和linux通用的文件扫描函数。所以只好用宏定义不同平台的处理方案。

#ifdef __WIN32__

#else

#endif

博客支持RSS订阅了

花了一个晚上, 终于让我写好了RSS 2.0的生成代码。

具体格式可以参照http://en.wikipedia.org/wiki/RSS。

使用RSS,可以方便大家查看博客的新文章,不需要打开博客地址也可以在RSS Reader里看到更新信息。

其实,我主要是参照ForeverBell(此处提及仅作参考资料,无任何个人崇拜意味)博客的RSS设计。具体地址是:

http://hi.baidu.com/foreverbell_/rss

另外,发表一个大胆的假想:Google Reader订阅的RSS貌似是多个人共享的。例如我订阅了ib的RSS,发现文章Received Time不是当前时间,而是在ib发表文章时间的左右。这可能是已经订阅过的人已经收到这个文章了。嗯,如此共享一个站点的RSS,可以节约很多资源。

《爱在OS前》

转自http://hi.baidu.com/foreverbell_, 有改动!

如果有热心的朋友唱完了下面的歌词,希望能提供mp3,万分感激!

《爱在OS前》

小虾网友颁布了OS大宝典

印在晦涩的chm文件 距今已经ff年

我坐在屏幕前 凝视寄存器的改变

你却在旁静静欣赏我那张憔悴的脸

EAX AX AL AH 是谁的从前

喜欢在MakeFile里寻找只属于我的那代码

经过小虾网友身边

我以成神牛之名许愿 渴望像Flood Fill般蔓延

当古文明只剩下汇编的语言 寄存器成了永垂不朽的诗篇

我给你的爱写在OS前 深埋在VMware的边沿

几十个世纪后出土发现 代码上的注释依然清晰可见

我给你的爱写在OS前 深埋在VMware的边沿

用GCC编译了永远 那已风化千年的文件

一切又重演

EAX AX AL AH 是谁的从前

喜欢在MakeFile里寻找属于我的那画面

经过小虾网友身边

我以成神牛之名许愿 渴望像Flood Fill般蔓延

当古文明只剩下汇编的语言 寄存器成了永垂不朽的诗篇

我给你的爱写在OS前 深埋在VMware的边沿

几十个世纪后出土发现 代码上的注释依然清晰可见

我给你的爱写在OS前 深埋在VMware的边沿

用GCC编译了永远 那已风化千年的文件

一切又重演

我感到很疲倦离0 error还是很远 害怕再也不能回到我的从前

我给你的爱写在OS前 深埋在VMware的边沿

几十个世纪后出土发现 代码上的注释依然清晰可见

我给你的爱写在OS前 深埋在VMware的边沿

用GCC编译了永远 那已风化千年的文件

爱在OS前 爱在OS前

未学会唱歌的我,大胆尝试了高潮的一段。

下载试听

对C大牛的补充说明

前天发表的一篇文章《发现大牛!!》对C大牛描述的有些缺漏。例如大家一定很想知道C大牛现在身处何处了。唉~这种失误怎么容得了我犯呢? 这简直是对大牛形象的蹂躏与魂灵的亵渎啊! 但是,过而能改,善莫大焉。特发此文,补充说明。

继续阅读

The First Math Problem

Show that sqrt(6)+sqrt(3) is irrational.

Proof:

Imagine sqrt(6)+sqrt(3) is rational,

Let p/q=sqrt(6)+sqrt(3), p and q are natural numbers and (p,q)=1,

Then p^2=3*(3+2*sqrt(2))*q^2,

Thus 3|p,

Let p=3m,

Then 3m^2=(3+2*sqrt(2))*q^2,

Thus 3|q, which contradicts our initail condition (p,q)=1,

Hence sqrt(6)+sqrt(3) is irrational.

此语法让我想到Basic。