2009-09-10 02:43:35
涉及的技术内容包括:ASM、C、.NET/C#、Python、Linux/Ubuntu 等。
记录读书笔记、生活点滴。关注基础理论和开发……
除特别标注外,所有文章均为作者原创,转载请注明出处。谢谢!

  查看 "推荐文章目录"。  


  雨痕内部技术交流群,欢迎熟识的朋友参与。 将 添加为您的 MSN 联系人即可。
  承接搜索引擎开发项目;寻求搜索引擎商业合作伙伴。
  为杜绝垃圾广告的侵扰,只有注册用户可以发表评论和留言。
  如果有什么问题,可以单击右侧图标给雨痕发消息。( 绿色: 在线; 灰色: 脱机)
浏览模式: 普通 | 列表

libconfig - Configuration File Library

[ 2010-03-13 21:39:14 | 作者: yuhen ]
配置文件很重要,INI 太弱,XML 太繁复,Linux *.conf 很酷。

找了好几种相关的类库,发觉还是 hyperrealm libconfig 最强大最好用,相关细节可参考 官方手册

源中的版本是 1.3.2-1,也可以去官方文章下载最新版本。
$ sudo apt-get install libconfig8 libconfig8-dev

完全类脚本化的配置语法,支持注释、包含、简单配置、数组、列表以及非常像类的组。

test.conf
# Example
...

阅读全文…

分析 "静态存储区操作分析"

[ 2010-03-13 16:48:19 | 作者: yuhen ]
今天从 ChinaUnix 上看到的一个帖子,感觉有点意思,做个简单的分析。

原帖 内容如下:

写一个小程序时,偷懒使用了静态字符数组,但是对于程序执行结果却想不太明白,大家帮忙分析一下:
#include <stdio.h>
#include <string.h>

char * form_string (int c)
{
  static char buf[64];
  memset (buf, 0, sizeof (buf));
  snprintf (buf, sizeof (buf), "%d", c);
...

阅读全文…

libmm - Shared Memory library

[ 2010-03-12 20:34:38 | 作者: yuhen ]
本文的 Share Memory 又可称为 Memory Pool,就是在匿名内存映射区(mmap) 预先划出一大块内存,以后的分配操作都可以在这块内存内部进行,包括 malloc、calloc、free 等等。Memory Pool 的好处是不在堆(Heap)和栈(CallStack)上分配,可以重复使用,避免多次向内核请求分配和释放内存,一定程度上提高了性能。另外只需释放整个 Pool 即可完成所有的内存释放,避免内存泄露的发生。

安装 libmm 库:
$ sudo apt-get libmm14 libmm-dev libmm-dbg

头文件: /usr/include/mm.h
/* Standard Malloc-Style API */
MM *mm_create(size_t, const char *);
...

阅读全文…

GCC 常用参数

[ 2010-03-12 14:37:49 | 作者: yuhen ]
1. 预处理

输出预处理结果到文件。
$ gcc -E main.c -o main.i

保留文件头注释。
$ gcc -C -E main.c -o main.i

参数 -Dname 定义宏(源文件中不能定义该宏),-Uname 取消 GCC 设置中定义的宏。
$ tail -n 10 main.c
int main(int argc, char* argv[])
{
  #if __MY__
  printf("a");
  #else
  printf("b");
  #endif
 return EXIT_SUCCESS;
}

$ gcc -E main.c -D__MY__ | tail -n 10

int main(int argc, char* argv[])
{
  printf("a");
  return 0;
...

阅读全文…

Dynamic Linking Loader

[ 2010-03-12 00:33:37 | 作者: yuhen ]
在运行时动态载入库(.so),并调用其中的函数。

1. 动态库

我们调用的目标函数就是 testfunc() 。

mylib.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void testfunc(const char* s, int x)
{
  printf("testfunc call.\n");
  printf("%s, %d\n", s, x);
}

编译成动态库。
$ gcc -fPIC -shared -o libmy.so mylib.c

$ nm libmy.so

... ...
000004ac T testfunc

符号表中包含了目标函数名称。

2. 调用

...

阅读全文…

8086 寻址方式

[ 2010-03-11 14:10:25 | 作者: yuhen ]
1. 立即寻址方式

直接将操作数存放在指令中。该操作数是为常数,通常用来初始化寄存器。
-a
1396:0100 mov ax, 1234
1396:0103

-t
AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1396 ES=1396 SS=1396 CS=1396 IP=0103 NV UP EI PL NZ NA PO NC
1396:0103 0000 ADD [BX+SI],AL DS:0000=CD

2. 寄存器寻址方式

操作数存放于寄存器中,通过寄存器名完成操作。
-a 100
1396:0100 mov ax, 5555
...

阅读全文…

Python Library: DataStruct

[ 2010-03-10 21:03:35 | 作者: yuhen ]
Python 标准库里提供了很多稀奇古怪的数据类型,摘录几个看着正常且常用的试试。

1. Array

和 list 很像,但仅能保存同一类型的的数据,更接近传统数组 (C# Array)。
>>> from array import array

>>> a = array('i', range(10))
>>> a
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a[3]
3
>>> a[3] = 99
>>> a
array('i', [0, 1, 2, 99, 4, 5, 6, 7, 8, 9])

>>> a.insert(2, 100)
>>> a
array('i', [0, 1, 100, 2, 99, 4, 5, 6, 7, 8, 9])

类型代码: [list][/list]...

阅读全文…

Python Library: Serialize

[ 2010-03-10 16:31:52 | 作者: yuhen ]
利用 marshal 模块,我们可以对一些内置类型对象进行序列化操作。marshal 序列化结果是专用格式但与平台无关。
Only None, integers, long integers, floats, complex numbers, strings, Unicode strings, tuples, lists, dictionaries, and code objects are supported. Lists, tuples, and
dictionaries can only contain supported objects. Class instances and recursive references in lists, tuples, and dictionaries are not supported.

序列化成字节数组。
[code][/code]...

阅读全文…