<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-8648637</id><updated>2009-09-24T15:23:03.925+08:00</updated><title type='text'>超越无限的blog</title><subtitle type='html'>心中无敌，天下无敌</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default?start-index=26&amp;max-results=25'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8648637.post-3873759653644538270</id><published>2007-12-26T12:01:00.000+08:00</published><updated>2007-12-26T12:10:58.107+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>在Gentoo上构建windows交叉编译环境</title><content type='html'>最近公司开发一款跨平台的产品，主要支持的平台包括linux和windows，由于我的日常工作操作系统是linux，因此要调试windows部分代码极其不方便，要么在linux下安装一个虚拟机跑windows，要么双系统重启机器进入windows，总之是比较费时且麻烦。于是不安份的情绪让我折腾了一上午时间，终于成功地在我的Gentoo Linux上构建好了windows交叉编译环境。&lt;br /&gt;&lt;br /&gt;其实在Gentoo Linux上构建交叉编译环境非常方便，crossdev一行命令就搞定一切，关于crossdev的用法很简单，可以参考Gentoo官方网站或者Gentoo-Wiki网站上的相关文档。构建windows交叉编译环境直接执行crossdev i686-mingw32即可。&lt;br /&gt;&lt;br /&gt;构建好交叉编译环境之后可以写个hello world程序尝试一下，i686-mingw32-gcc -o test.exe test.c，然后file test.exe即可看到文件类型为“MS-DOS executable PE  for MS Windows (console) Intel 80386 32-bit”，你也可以用wine test.exe执行一下看看结果。&lt;br /&gt;&lt;br /&gt;似乎到此就圆满结束了？为了更方便地进行交叉编译，继续往下看吧。。。&lt;br /&gt;&lt;br /&gt;开源软件大多数采用autotools来完成项目的自动构造，我们能不能利用autotools来方便地进行管理规模稍大的项目呢？答案是肯定的，今天上午为了测试交叉编译写了一个简单的win32 service，可以通过以下链接下载：&lt;a href="http://lidaibin.googlepages.com/SMQService-1.0.2.tar.bz2"&gt;SMQService&lt;/a&gt;，方便懒人们快速尝试交叉编译，不过你可能马上就会遇到挫折，来看看结果吧。&lt;br /&gt;&lt;br /&gt;debianl@ldb /data/codes/test/win32service $ ./configure --target=i686-mingw32 --host=i686-mingw32 --build=i686-mingw32 --prefix=/usr/i686-mingw32/usr&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking whether build environment is sane... yes&lt;br /&gt;checking for a thread-safe mkdir -p... /usr/bin/mkdir -p&lt;br /&gt;checking for gawk... gawk&lt;br /&gt;checking whether make sets $(MAKE)... yes&lt;br /&gt;checking for i686-mingw32-gcc... i686-mingw32-gcc&lt;br /&gt;checking for C compiler default output file name... a.exe&lt;br /&gt;checking whether the C compiler works... configure: error: cannot run C compiled programs.&lt;br /&gt;If you meant to cross compile, use `--host'.&lt;br /&gt;See `config.log' for more details.&lt;br /&gt;&lt;br /&gt;仔细看一下config.log即可看出configure会采用编译器编译一个测试程序并执行，在这儿会产生一个a.exe并直接执行，在linux直接执行exe文件如果不做点工作是不行的，直接执行a.exe报错configure也就停下了，告诉你"cannot run C compiled programs"，其实compiler工作得好好的，那么我们现在只要解决直接在linux下运行exe文件就可以让autotools顺利地工作了。&lt;br /&gt;&lt;br /&gt;其实要实现这个功能很简单，编译内核时注意选上Executable file formats-&gt;Kernel support for MISC binaries，如果编译成模块modprobe binfmt_misc即可加载，然后给你的/etc/fstab里加上一行“none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0”，在系统引导完成之后执行"echo ':DOSWin:M::MZ::/usr/bin/wine:' &gt; /proc/sys/fs/binfmt_misc/register"，在Gentoo下可以将这行指令写到/etc/conf.d/local.start文件，现在再试应该就好了。&lt;br /&gt;&lt;br /&gt;以下是我的编译日志：&lt;br /&gt;debianl@ldb /data/codes/test/win32service $ ./configure --target=i686-mingw32 --host=i686-mingw32 --build=i686-mingw32 --prefix=/usr/i686-mingw32/usr&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking whether build environment is sane... yes&lt;br /&gt;checking for a thread-safe mkdir -p... /usr/bin/mkdir -p&lt;br /&gt;checking for gawk... gawk&lt;br /&gt;checking whether make sets $(MAKE)... yes&lt;br /&gt;checking for style of include used by make... GNU&lt;br /&gt;checking for i686-mingw32-gcc... i686-mingw32-gcc&lt;br /&gt;checking for C compiler default output file name... a.exe&lt;br /&gt;checking whether the C compiler works... yes&lt;br /&gt;checking whether we are cross compiling... no&lt;br /&gt;checking for suffix of executables... .exe&lt;br /&gt;checking for suffix of object files... o&lt;br /&gt;checking whether we are using the GNU C compiler... yes&lt;br /&gt;checking whether i686-mingw32-gcc accepts -g... yes&lt;br /&gt;checking for i686-mingw32-gcc option to accept ISO C89... none needed&lt;br /&gt;checking dependency style of i686-mingw32-gcc... gcc3&lt;br /&gt;checking how to run the C preprocessor... i686-mingw32-gcc -E&lt;br /&gt;checking for grep that handles long lines and -e... /bin/grep&lt;br /&gt;checking for egrep... /bin/grep -E&lt;br /&gt;checking for ANSI C header files... yes&lt;br /&gt;checking for sys/types.h... yes&lt;br /&gt;checking for sys/stat.h... yes&lt;br /&gt;checking for stdlib.h... yes&lt;br /&gt;checking for string.h... yes&lt;br /&gt;checking for memory.h... yes&lt;br /&gt;checking for strings.h... yes&lt;br /&gt;checking for inttypes.h... yes&lt;br /&gt;checking for stdint.h... yes&lt;br /&gt;checking for unistd.h... yes&lt;br /&gt;checking for stdlib.h... (cached) yes&lt;br /&gt;checking for string.h... (cached) yes&lt;br /&gt;checking stdio.h usability... yes&lt;br /&gt;checking stdio.h presence... yes&lt;br /&gt;checking for stdio.h... yes&lt;br /&gt;checking windows.h usability... yes&lt;br /&gt;checking windows.h presence... yes&lt;br /&gt;checking for windows.h... yes&lt;br /&gt;checking for an ANSI C-conforming const... yes&lt;br /&gt;checking for inline... inline&lt;br /&gt;checking for size_t... yes&lt;br /&gt;checking for stdlib.h... (cached) yes&lt;br /&gt;checking for GNU libc compatible malloc... yes&lt;br /&gt;checking for stdlib.h... (cached) yes&lt;br /&gt;checking for GNU libc compatible realloc... yes&lt;br /&gt;configure: creating ./config.status&lt;br /&gt;config.status: creating Makefile&lt;br /&gt;config.status: creating src/Makefile&lt;br /&gt;config.status: creating src/config.h&lt;br /&gt;config.status: executing depfiles commands&lt;br /&gt;&lt;br /&gt;debianl@ldb /data/codes/test/win32service $ make&lt;br /&gt;Making all in src&lt;br /&gt;make[1]: Entering directory `/data/codes/test/win32service/src'&lt;br /&gt;make  all-am&lt;br /&gt;make[2]: Entering directory `/data/codes/test/win32service/src'&lt;br /&gt;i686-mingw32-gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c&lt;br /&gt;mv -f .deps/main.Tpo .deps/main.Po&lt;br /&gt;i686-mingw32-gcc  -g -O2   -o SMQService.exe main.o &lt;br /&gt;make[2]: Leaving directory `/data/codes/test/win32service/src'&lt;br /&gt;make[1]: Leaving directory `/data/codes/test/win32service/src'&lt;br /&gt;make[1]: Entering directory `/data/codes/test/win32service'&lt;br /&gt;make[1]: Nothing to be done for `all-am'.&lt;br /&gt;make[1]: Leaving directory `/data/codes/test/win32service'&lt;br /&gt;&lt;br /&gt;debianl@ldb /data/codes/test/win32service $ file src/SMQService.exe&lt;br /&gt;src/SMQService.exe: MS-DOS executable PE  for MS Windows (console) Intel 80386 32-bit&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-3873759653644538270?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/3873759653644538270/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=3873759653644538270' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3873759653644538270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3873759653644538270'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/12/gentoowindows.html' title='在Gentoo上构建windows交叉编译环境'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-6357433546902264503</id><published>2007-07-26T10:29:00.000+08:00</published><updated>2007-07-26T10:30:31.927+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='asm'/><title type='text'>汇编学习之系统调用</title><content type='html'>最近工作比较闲散，因此抽空看了看汇编，基本上从头开始，看了前面几章不知不觉也学会了“Hello world”，刚好看的这本书基本上都是以GNU的开发工具为开发环境的，这比较适合我的兴趣。其实看的这几章也就只有一章(这一章还没看完^_^)才是汇编语言的基础，刚学会了点AT&amp;T的汇编语法，知道了跟Intel的汇编语法的区别，另外这一章用不同的方式实现了cpuid的调用，学会了如何调用系统调用以及如何调用C函数库中的函数。&lt;br /&gt;&lt;br /&gt;先看看下面通过系统调用实现的hello world代码：&lt;br /&gt;&lt;pre style="color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;.section&lt;/font&gt; .data&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;msg&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;        &lt;font color="#fa8072"&gt;.ascii&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Hello world!\n"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;.section&lt;/font&gt; .text&lt;br /&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;.globl&lt;/font&gt; _start&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;_start&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;        &lt;font color="#fa8072"&gt;movl&lt;/font&gt; $4, &lt;font color="#7fffd4"&gt;&lt;b&gt;%eax&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;movl&lt;/font&gt; $1, &lt;font color="#7fffd4"&gt;&lt;b&gt;%ebx&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;movl&lt;/font&gt; $msg, &lt;font color="#7fffd4"&gt;&lt;b&gt;%ecx&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;movl&lt;/font&gt; $13, &lt;font color="#7fffd4"&gt;&lt;b&gt;%edx&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;int&lt;/font&gt; $0x80&lt;br /&gt;        &lt;font color="#fa8072"&gt;movl&lt;/font&gt; $1, &lt;font color="#7fffd4"&gt;&lt;b&gt;%eax&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;movl&lt;/font&gt; $0, &lt;font color="#7fffd4"&gt;&lt;b&gt;%ebx&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;int&lt;/font&gt; $0x80&lt;br /&gt;        &lt;/pre&gt;&lt;br /&gt;系统调用是通过int 0x80来实现的，eax寄存器中为调用的功能号，ebx、ecx、edx、esi等等寄存器则依次为参数，从/usr/include/asm/unistd.h中可以看到exit的功能号_NR_exit为1，write(_NR_write)功能号为4，因此第一个int $0x80调用之前eax寄存器值为4，ebx为文件描述符，stdout的文件描述符为1，ecx则为buffer的内存地址，edx为buffer长度。第二个int $0x80之前eax为1表示调用exit，ebx为0表示返回0。编译链接步骤如下所示：&lt;br /&gt;as -o helloworld.o helloworld.s&lt;br /&gt;ld -o helloworld helloworld.o&lt;br /&gt;&lt;br /&gt;再看看调用C函数的代码：&lt;br /&gt;&lt;pre style="color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;.section&lt;/font&gt; .data&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;output&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;        &lt;font color="#fa8072"&gt;.asciz&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Hello world!\n"&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;.section&lt;/font&gt; .text&lt;br /&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;.globl&lt;/font&gt; _start&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;_start&lt;/b&gt;&lt;/font&gt;:&lt;br /&gt;        &lt;font color="#fa8072"&gt;pushl&lt;/font&gt; $output&lt;br /&gt;        &lt;font color="#fa8072"&gt;call&lt;/font&gt; printf&lt;br /&gt;        &lt;font color="#fa8072"&gt;addl&lt;/font&gt; $8, &lt;font color="#7fffd4"&gt;&lt;b&gt;%esp&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#fa8072"&gt;pushl&lt;/font&gt; $0&lt;br /&gt;        &lt;font color="#fa8072"&gt;call&lt;/font&gt; exit&lt;br /&gt;        &lt;/pre&gt;&lt;br /&gt;这个例子相对来说看起来简单得多，将参数压入堆栈调用相应的函数即可，不过要注意的是：1、C函数需要调用的字符串参数必须以asciz声明，而不是ascii，这样才会给字符串后面加'\0'。2、压栈顺序刚好与C函数顺序相反，最后的参数应最先入栈。3、链接的时候需要链接libc.so库并指定动态链接库加载器/lib/ld-linux.so.2，步骤如下：&lt;br /&gt;as -o helloworld2.o helloworld2.s&lt;br /&gt;ld -dynamic-linker /lib/ld-linux.so.2 -lc -o helloworld2 helloworld2.o&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-6357433546902264503?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/6357433546902264503/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=6357433546902264503' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/6357433546902264503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/6357433546902264503'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/07/blog-post.html' title='汇编学习之系统调用'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-5131335485661939053</id><published>2007-07-11T12:50:00.000+08:00</published><updated>2007-07-11T12:51:18.135+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='iptables'/><title type='text'>iptables端口映射</title><content type='html'>一个简单的应用：我的机器IP是192.168.1.240，期望访问另一个局域网的web服务器其IP为192.168.0.109，中间有台双网卡的服务器用来做透明代理，该服务器eth0为192.168.1.2，eth1为192.168.0.2。&lt;br /&gt;&lt;br /&gt;首先需要将到达192.168.1.2:80的包顺利转给192.168.0.109，因此有了下面的DNAT：&lt;br /&gt;iptables -t nat -A PREROUTING -s 192.168.1.0/24 -d 192.168.1.2 -p tcp --dport 80 -j DNAT --to 192.168.0.109:80&lt;br /&gt;&lt;br /&gt;乍一看这应该没什么问题了，可是接下来问题是发现我的包是到0.109了，可是我的机器与0.109仍然无法正常通信，原来是到达0.109的源地址仍然是1.240，0.109回包的时候当然无法直接给1.240了，接下来就是SNAT的事了：&lt;br /&gt;iptables -t nat -A POSTROUTING -d 192.168.0.109 --dport 80 -o eth1 -j SNAT --to 192.168.0.2&lt;br /&gt;&lt;br /&gt;当然别忘了echo 1 &gt; /proc/sys/net/ipv4/ip_forward，最好连/etc/sysctl.conf里的net.ipv4.ip_forward=1一并加上。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-5131335485661939053?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/5131335485661939053/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=5131335485661939053' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/5131335485661939053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/5131335485661939053'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/07/iptables.html' title='iptables端口映射'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-3296270576366663945</id><published>2007-06-21T00:35:00.000+08:00</published><updated>2007-06-21T00:36:52.801+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='inotify'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><title type='text'>关于inotify</title><content type='html'>inotify是什么？用它能干些什么？这个问题我们还是首先从内核的文档开始吧－－Documentation/filesystems/inotify.txt(说点题外话，内核文档虽然是没有任何格式的txt文档，给人的感觉却非常好，而且作者总是以最精炼的语言清楚地描述了相关的内容): a powerful yet simple file change notification system，通俗点说它是一个内核用于通知用户空间客户程序文件系统变化的系统，并且它是powerful yet simple的。&lt;br /&gt;&lt;br /&gt;inotify的用户接口原型主要有以下3个：&lt;br /&gt;初始化：int inotify_init(void);&lt;br /&gt;添加监视对象：int inotify_add_watch(int fd, const char *path, uint32_t mask);&lt;br /&gt;删除监视对象：int inotify_rm_watch(int fd, uint32_t wd);&lt;br /&gt;&lt;br /&gt;内核文档里对于inotify_rm_watch的用户接口原型描述似乎有点问题，第2个参数写成了mask，实际上它应该是inotify_add_watch返回的watch descriptor。&lt;br /&gt;&lt;br /&gt;根据文档描述可以看出，inotify使用大概分为以下几个步骤：&lt;br /&gt;1、int fd = inotify_init();  初始化inotify实例。&lt;br /&gt;2、int wd = inotify_add_watch(fd, path, mask);  添加监视对象，这里的mask是一个或多个事件的位标记集合，具体的事件定义可参考(linux/inotify.h)或者(sys/inotify.h)，前者为linux内核头文件，后者为glibc提供的头文件。&lt;br /&gt;3、size_t len = read(fd, buf, BUF_LEN);  读取事件数据，buf应是一个指向inotify_event结构数组的指针。不过要注意的是inotify_event的name成员长度是可变的，这个问题后面再解释。&lt;br /&gt;4、已经存在的监视对象可通过int ret = inotify_rm_watch(fd, wd);来删除。&lt;br /&gt;&lt;br /&gt;下面我们来看一个示例：&lt;br /&gt;&lt;pre style="font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;unistd.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/select.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;errno.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/inotify.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;static&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;_inotify_event_handler&lt;/b&gt;&lt;/font&gt;(&lt;font color="#fa8072"&gt;struct&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt; *&lt;font color="#7fffd4"&gt;&lt;b&gt;event&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"event-&amp;gt;mask: 0x%08x\n"&lt;/font&gt;, event-&amp;gt;mask);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"event-&amp;gt;name: %s\n"&lt;/font&gt;, event-&amp;gt;name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color="#7fffd4"&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (argc != 2) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"Usage: %s &amp;lt;file/dir&amp;gt;\n"&lt;/font&gt;, argv[0]);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[1024] = {0};&lt;br /&gt;  &lt;font color="#fa8072"&gt;struct&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt; *&lt;font color="#7fffd4"&gt;&lt;b&gt;event&lt;/b&gt;&lt;/font&gt; = {0};&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;fd&lt;/b&gt;&lt;/font&gt; = inotify_init();&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;wd&lt;/b&gt;&lt;/font&gt; = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;for&lt;/font&gt; (;;) {&lt;br /&gt;    &lt;font color="#9acd32"&gt;&lt;b&gt;fd_set&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;fds&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;    FD_ZERO(&amp;amp;fds);&lt;br /&gt;    FD_SET(fd, &amp;amp;fds);&lt;br /&gt;    &lt;font color="#fa8072"&gt;if&lt;/font&gt; (select(fd + 1, &amp;amp;fds, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;) &amp;gt; 0) {&lt;br /&gt;      &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;len&lt;/b&gt;&lt;/font&gt;, &lt;font color="#7fffd4"&gt;&lt;b&gt;index&lt;/b&gt;&lt;/font&gt; = 0;&lt;br /&gt;      &lt;font color="#fa8072"&gt;while&lt;/font&gt; (((len = read(fd, &amp;amp;buf, &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(buf))) &amp;lt; 0) &amp;amp;&amp;amp; (errno == EINTR));&lt;br /&gt;      &lt;font color="#fa8072"&gt;while&lt;/font&gt; (index &amp;lt; len) {&lt;br /&gt;        event = (&lt;font color="#fa8072"&gt;struct&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt; *)(buf + index);&lt;br /&gt;        _inotify_event_handler(event);&lt;br /&gt;        index += &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(&lt;font color="#fa8072"&gt;struct&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt;) + event-&amp;gt;len;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  inotify_rm_watch(fd, wd);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;return&lt;/font&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;由以上代码可以看出inotify_init返回的file descriptor是可以用select或者poll进行I/O复用的。由于inotify_event长度是可变的，因此在读取inotify_event数组内容的时候需要动态计算下一个事件数据的偏移量(index += sizeof(struct inotify_event) + event-&gt;len)，len成员即name成员的长度。&lt;br /&gt;&lt;br /&gt;在实际测试过程中，通过运行以上的测试程序监视一个文件，还遇到过两个奇怪的现象：用vim编辑那个被监视的文件，修改并保存，触发的是IN_DELETE_SELF和IN_MOVE_SELF事件而不是我们所期望的IN_MODIFY事件；再次修改并保存的时候不再有任何事件发生。希望能给看官一个教训，其实这是由于vim的工作机制引起的，vim会先将源文件复制为另一个文件，然后在另一文件基础上编辑(一般后缀名为swp)，保存的时候再将这个文件覆盖源文件，因此会出现上述的第一个现象，第二个现象是因为原来的文件已经被后来的新文件代替，因此监视对象所监视的文件已经不存在了，所以自然不会产生任何事件。&lt;br /&gt;&lt;br /&gt;另外，内核文档第四部分介绍了inotify的背景以及设计思路，不可不看：&lt;br /&gt;&lt;br /&gt;Q: What is the design decision behind not tying the watch to the open fd of&lt;br /&gt;   the watched object?&lt;br /&gt;&lt;br /&gt;A: Watches are associated with an open inotify device, not an open file.&lt;br /&gt;   This solves the primary problem with dnotify: keeping the file open pins&lt;br /&gt;   the file and thus, worse, pins the mount.  Dnotify is therefore infeasible&lt;br /&gt;   for use on a desktop system with removable media as the media cannot be&lt;br /&gt;   unmounted.  Watching a file should not require that it be open.&lt;br /&gt;&lt;br /&gt;Q: What is the design decision behind using an-fd-per-instance as opposed to&lt;br /&gt;   an fd-per-watch?&lt;br /&gt;&lt;br /&gt;A: An fd-per-watch quickly consumes more file descriptors than are allowed,&lt;br /&gt;   more fd's than are feasible to manage, and more fd's than are optimally&lt;br /&gt;   select()-able.  Yes, root can bump the per-process fd limit and yes, users&lt;br /&gt;   can use epoll, but requiring both is a silly and extraneous requirement.&lt;br /&gt;   A watch consumes less memory than an open file, separating the number&lt;br /&gt;   spaces is thus sensible.  The current design is what user-space developers&lt;br /&gt;   want: Users initialize inotify, once, and add n watches, requiring but one&lt;br /&gt;   fd and no twiddling with fd limits.  Initializing an inotify instance two&lt;br /&gt;   thousand times is silly.  If we can implement user-space's preferences &lt;br /&gt;   cleanly--and we can, the idr layer makes stuff like this trivial--then we &lt;br /&gt;   should.&lt;br /&gt;&lt;br /&gt;   There are other good arguments.  With a single fd, there is a single&lt;br /&gt;   item to block on, which is mapped to a single queue of events.  The single&lt;br /&gt;   fd returns all watch events and also any potential out-of-band data.  If&lt;br /&gt;   every fd was a separate watch,&lt;br /&gt;&lt;br /&gt;   - There would be no way to get event ordering.  Events on file foo and&lt;br /&gt;     file bar would pop poll() on both fd's, but there would be no way to tell&lt;br /&gt;     which happened first.  A single queue trivially gives you ordering.  Such&lt;br /&gt;     ordering is crucial to existing applications such as Beagle.  Imagine&lt;br /&gt;     "mv a b ; mv b a" events without ordering.&lt;br /&gt;&lt;br /&gt;   - We'd have to maintain n fd's and n internal queues with state,&lt;br /&gt;     versus just one.  It is a lot messier in the kernel.  A single, linear&lt;br /&gt;     queue is the data structure that makes sense.&lt;br /&gt;&lt;br /&gt;   - User-space developers prefer the current API.  The Beagle guys, for&lt;br /&gt;     example, love it.  Trust me, I asked.  It is not a surprise: Who'd want&lt;br /&gt;     to manage and block on 1000 fd's via select?&lt;br /&gt;&lt;br /&gt;   - No way to get out of band data.&lt;br /&gt;&lt;br /&gt;   - 1024 is still too low.  ;-)&lt;br /&gt;&lt;br /&gt;   When you talk about designing a file change notification system that&lt;br /&gt;   scales to 1000s of directories, juggling 1000s of fd's just does not seem&lt;br /&gt;   the right interface.  It is too heavy.&lt;br /&gt;&lt;br /&gt;   Additionally, it _is_ possible to  more than one instance  and&lt;br /&gt;   juggle more than one queue and thus more than one associated fd.  There&lt;br /&gt;   need not be a one-fd-per-process mapping; it is one-fd-per-queue and a&lt;br /&gt;   process can easily want more than one queue.&lt;br /&gt;&lt;br /&gt;Q: Why the system call approach?&lt;br /&gt;&lt;br /&gt;A: The poor user-space interface is the second biggest problem with dnotify.&lt;br /&gt;   Signals are a terrible, terrible interface for file notification.  Or for&lt;br /&gt;   anything, for that matter.  The ideal solution, from all perspectives, is a&lt;br /&gt;   file descriptor-based one that allows basic file I/O and poll/select.&lt;br /&gt;   Obtaining the fd and managing the watches could have been done either via a&lt;br /&gt;   device file or a family of new system calls.  We decided to implement a&lt;br /&gt;   family of system calls because that is the preferred approach for new kernel&lt;br /&gt;   interfaces.  The only real difference was whether we wanted to use open(2)&lt;br /&gt;   and ioctl(2) or a couple of new system calls.  System calls beat ioctls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-3296270576366663945?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/3296270576366663945/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=3296270576366663945' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3296270576366663945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3296270576366663945'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/06/inotify.html' title='关于inotify'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-8814106157960993656</id><published>2007-06-10T21:26:00.000+08:00</published><updated>2007-06-10T21:32:18.000+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='rs422'/><title type='text'>rs422在linux跟我开了个玩笑</title><content type='html'>很久没有更新blog了，就跟抽烟一样，如果长时间不抽的话也就不想抽了，看来这是一个不好的现象，不过长时间的沉默也说明了自己这段时间在技术没有什么积累。罢了，今天的blog就记录这段时间来比较郁闷的事情。&lt;br /&gt;&lt;br /&gt;这个项目的开发就像当年初中的长跑一样，前几圈劲头十足信心满怀，接下来的情况我想大部分人跟我一样，慢慢地感觉有点累，再后来压力越来越大，越来越感觉大脑缺氧呼吸困难，到后来已经身心疲累。人这一生从出生开始就背负了责任，要么为责任活着要么超越责任为理想活着，所以有人活得辛苦而无趣，有人轻松而超然。有点跑题了，还是说一下前几天遇到的技术问题。&lt;br /&gt;&lt;br /&gt;客户方有一外部设备是N年前购买的，一直用于原来的系统中，这次需要在本项目中使用此外设，关于这个外设的文档早已缺失，唯一可以参考的就是一个windows下的动态链接库源代码（不过这也是最重要的参考资料，候大侠一本书上不是也说“源码面前了无秘密”嘛），于是参考此代码写了一个windows下的测试程序很顺利地测试通过，测试代码如下：&lt;br /&gt;&lt;pre style="font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;windows.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color="#7fffd4"&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;HANDLE&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;h_com&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;addr&lt;/b&gt;&lt;/font&gt; = 0x01;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[10];&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;DCB&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;dcb&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;COMMTIMEOUTS&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;timeouts&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;DWORD&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;n&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (argc != 2) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"%s &amp;lt;comdev&amp;gt;\n"&lt;/font&gt;, argv[0]);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  h_com = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,&lt;br /&gt;                     0, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;, OPEN_EXISTING, 0, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;);&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (h_com == INVALID_HANDLE_VALUE) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"Initialize COM device failed\n"&lt;/font&gt;);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  GetCommState(h_com, &amp;amp;dcb);&lt;br /&gt;  dcb.BaudRate = 9600;&lt;br /&gt;  dcb.ByteSize = 8;&lt;br /&gt;  dcb.Parity = MARKPARITY;&lt;br /&gt;  dcb.StopBits = ONESTOPBIT;&lt;br /&gt;  SetCommState(h_com, &amp;amp;dcb);&lt;br /&gt;&lt;br /&gt;  GetCommTimeouts(h_com, &amp;amp;timeouts);&lt;br /&gt;  timeouts.ReadTotalTimeoutConstant = 10;&lt;br /&gt;  SetCommTimeouts(h_com, &amp;amp;timeouts);&lt;br /&gt;&lt;br /&gt;  WriteFile(h_com, &amp;amp;addr, &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(addr), &amp;amp;n, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;  Sleep(1);&lt;br /&gt;  dcb.Parity = SPACEPARITY;&lt;br /&gt;  SetCommState(h_com, &amp;amp;dcb);&lt;br /&gt;  memcpy(buf, &lt;font color="#ffa07a"&gt;"\x02\x85\x83\04"&lt;/font&gt;, 4);&lt;br /&gt;  WriteFile(h_com, buf, 4, &amp;amp;n, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;  Sleep(2);&lt;br /&gt;  ReadFile(h_com, buf, &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(buf), &amp;amp;n, &lt;font color="#7fffd4"&gt;NULL&lt;/font&gt;);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"read %d bytes\n"&lt;/font&gt;, n);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;for&lt;/font&gt; (i = 0; i &amp;lt; n; ++i)&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"%02x "&lt;/font&gt;, buf[i]);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"\n"&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;return&lt;/font&gt; 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;由此代码可以看出通信过程大概是这样的：将串口设置为8M1发送地址，然后将串口设置更改为8S1发送请求数据，再然后接收数据，看起来还是很简单的。接下来很快地写好了linux下的测试程序，源代码如下：&lt;br /&gt;&lt;pre style="font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;unistd.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;termios.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color="#7fffd4"&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (argc != 2) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"Usage: %s &amp;lt;comdev&amp;gt;\n"&lt;/font&gt;, argv[0]);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;fd&lt;/b&gt;&lt;/font&gt; = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (fd == -1) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"Initialize COM device failed.\n"&lt;/font&gt;);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;struct&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;termios&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;options&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (tcgetattr(fd, &amp;amp;options) == -1)&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;&lt;br /&gt;  cfsetispeed(&amp;amp;options, B9600);&lt;br /&gt;  cfsetospeed(&amp;amp;options, B9600);&lt;br /&gt;&lt;br /&gt;  options.c_cflag &amp;amp;= ~CSIZE;&lt;br /&gt;  options.c_cflag |= CS8 | CLOCAL | CREAD | CMSPAR | PARODD;&lt;br /&gt;  options.c_cflag &amp;amp;= CSTOPB;&lt;br /&gt;  options.c_iflag |= INPCK;&lt;br /&gt;  options.c_iflag &amp;amp;= ~(IXON | IXOFF | IXANY);&lt;br /&gt;  options.c_oflag &amp;amp;= ~OPOST;&lt;br /&gt;  options.c_lflag &amp;amp;= ~(ECHO | ECHOE | ICANON | ISIG);&lt;br /&gt;  tcflush(fd, TCIFLUSH);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"tcsetattr result: %d\n"&lt;/font&gt;, tcsetattr(fd, TCSANOW, &amp;amp;options));&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;addr&lt;/b&gt;&lt;/font&gt; = 0x01;&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (write(fd, &amp;amp;addr, 1) == -1)&lt;br /&gt;    &lt;font color="#fa8072"&gt;goto&lt;/font&gt; &lt;font color="#7fffd4"&gt;failed&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  usleep(1000);&lt;br /&gt;&lt;br /&gt;  options.c_cflag &amp;amp;= ~PARODD;&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"tcsetattr result: %d\n"&lt;/font&gt;, tcsetattr(fd, TCSADRAIN, &amp;amp;options));&lt;br /&gt;&lt;br /&gt;  usleep(1000);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[10];&lt;br /&gt;  memcpy(buf, &lt;font color="#ffa07a"&gt;"\x02\x85\x83\x04"&lt;/font&gt;, 4);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (write(fd, buf, 4) == -1)&lt;br /&gt;    &lt;font color="#fa8072"&gt;goto&lt;/font&gt; &lt;font color="#7fffd4"&gt;failed&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  usleep(10000);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;read_n&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  read_n = read(fd, buf, &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(buf));&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"result: %d\n"&lt;/font&gt;, read_n);&lt;br /&gt;  &lt;font color="#fa8072"&gt;for&lt;/font&gt; (i = 0; i &amp;lt; read_n; ++i)&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"%02X "&lt;/font&gt;, buf[i]);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"\n"&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;  close(fd);&lt;br /&gt;  &lt;font color="#fa8072"&gt;return&lt;/font&gt; 0;&lt;br /&gt;&lt;br /&gt; &lt;font color="#7fffd4"&gt;failed&lt;/font&gt;:&lt;br /&gt;  close(fd);&lt;br /&gt;  &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;虽然Mark Parity和Space Parity在Posix中并未定义，但是在linux下通过CMSPAR仍然可以实现，tcsetattr的man pages可以看到对CMSPAR的描述()，可是反复尝试仍然有问题，后来一个完全不懂linux开发的同事问了我设置串口各行代码的意思，并通过tcsetattr的man pages，一个一个地组合这些标记，居然成功了！结果出人意料，且看如下代码：&lt;br /&gt;&lt;pre style="font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;unistd.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fa8072"&gt;#include&lt;/font&gt; &lt;font color="#ffa07a"&gt;&amp;lt;termios.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color="#7fffd4"&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (argc != 2) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"Usage: %s &amp;lt;comdev&amp;gt;\n"&lt;/font&gt;, argv[0]);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;fd&lt;/b&gt;&lt;/font&gt; = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (fd == -1) {&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"Initialize COM device failed.\n"&lt;/font&gt;);&lt;br /&gt;    &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;struct&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;termios&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;options&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  memset(&amp;amp;options, 0, &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(options));&lt;br /&gt;&lt;br /&gt;  cfsetispeed(&amp;amp;options, B9600);&lt;br /&gt;  cfsetospeed(&amp;amp;options, B9600);&lt;br /&gt;&lt;br /&gt;  options.c_cflag = CS8 | CLOCAL | CREAD | CSTOPB | CMSPAR;&lt;br /&gt;  options.c_iflag = INPCK;&lt;br /&gt;  options.c_oflag = 0;&lt;br /&gt;  options.c_lflag = 0;&lt;br /&gt;  tcflush(fd, TCIFLUSH);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"tcsetattr result: %d\n"&lt;/font&gt;, tcsetattr(fd, TCSANOW, &amp;amp;options));&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;addr&lt;/b&gt;&lt;/font&gt; = 0x01;&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (write(fd, &amp;amp;addr, 1) == -1)&lt;br /&gt;    &lt;font color="#fa8072"&gt;goto&lt;/font&gt; &lt;font color="#7fffd4"&gt;failed&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  usleep(1000);&lt;br /&gt;&lt;br /&gt;  options.c_cflag |= PARENB | PARODD;&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"tcsetattr result: %d\n"&lt;/font&gt;, tcsetattr(fd, TCSADRAIN, &amp;amp;options));&lt;br /&gt;&lt;br /&gt;  usleep(1000);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color="#9acd32"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[10];&lt;br /&gt;  memcpy(buf, &lt;font color="#ffa07a"&gt;"\x02\x85\x83\x04"&lt;/font&gt;, 4);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#fa8072"&gt;if&lt;/font&gt; (write(fd, buf, 4) == -1)&lt;br /&gt;    &lt;font color="#fa8072"&gt;goto&lt;/font&gt; &lt;font color="#7fffd4"&gt;failed&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  usleep(10000);&lt;br /&gt;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;read_n&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#9acd32"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color="#7fffd4"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;  read_n = read(fd, buf, &lt;font color="#fa8072"&gt;sizeof&lt;/font&gt;(buf));&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"result: %d\n"&lt;/font&gt;, read_n);&lt;br /&gt;  &lt;font color="#fa8072"&gt;for&lt;/font&gt; (i = 0; i &amp;lt; read_n; ++i)&lt;br /&gt;    printf(&lt;font color="#ffa07a"&gt;"%02X "&lt;/font&gt;, buf[i]);&lt;br /&gt;  printf(&lt;font color="#ffa07a"&gt;"\n"&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;  close(fd);&lt;br /&gt;  &lt;font color="#fa8072"&gt;return&lt;/font&gt; 0;&lt;br /&gt;&lt;br /&gt; &lt;font color="#7fffd4"&gt;failed&lt;/font&gt;:&lt;br /&gt;  close(fd);&lt;br /&gt;  &lt;font color="#fa8072"&gt;return&lt;/font&gt; -1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;想不到抛开CMSPAR不算8M1看起来是8N2，而8S1则看起来是8O2。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-8814106157960993656?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/8814106157960993656/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=8814106157960993656' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/8814106157960993656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/8814106157960993656'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/06/rs422linux.html' title='rs422在linux跟我开了个玩笑'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-4469402564554153056</id><published>2007-04-15T03:02:00.000+08:00</published><updated>2007-04-15T03:11:39.736+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>C代码中如何得到python脚本异常时的traceback信息</title><content type='html'>在软件项目的开发过程中，我们总是试图让程序能够适应更多的应用环境以及业务流程，不管你对于需求的了解如何准确，也不管你做了有多么充分的估计，但有很多情况仍然让你无法应付，比如：需求是会变化的；维护项目的人不一定都能用C/C++写出没有内存问题的代码等等。&lt;br /&gt;&lt;br /&gt;让软件系统能够适应更多变化的方法有很多种，高度的抽象、动态链接技术等等都是一直以来被大家采用较广的方法，那么今天我们要讨论的是脚本引擎的嵌入问题。通常我更喜欢c代码加上python脚本引擎的结构，python的好处就不多说了。不过在C中嵌入python脚本引擎调用之后也有一些非常麻烦的地方，比如不便于调试，因为我们的宿主应用程序必然会为python脚本wrap一些module、class、function等等，因此这带来了调试的难度，有时候仅仅依赖print是一件非常低效的事，那么我们如何得到python脚本在异常时的traceback情况呢？比如代码出现异常到底是在哪个脚本文件中，到底是哪行代码出了问题？错误又是什么呢？我们先来看看下面的函数：&lt;br /&gt;&lt;br /&gt;&lt;pre style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(255, 160, 122);"&gt;&lt;python.h&gt;&lt;/python.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(255, 160, 122);"&gt;&lt;compile.h&gt;&lt;/compile.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(255, 160, 122);"&gt;&lt;frameobject.h&gt;&lt;/frameobject.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(255, 160, 122);"&gt;&lt;traceback.h&gt;&lt;/traceback.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;process_python_exception&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/span&gt;[512], *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;buf_p&lt;/b&gt;&lt;/span&gt; = buf;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;type_obj&lt;/b&gt;&lt;/span&gt;, *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;value_obj&lt;/b&gt;&lt;/span&gt;, *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;traceback_obj&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;PyErr_Fetch(&amp;type_obj, &amp;amp;value_obj, &amp;traceback_obj);&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (value_obj == &lt;span style="color: rgb(127, 255, 212);"&gt;NULL&lt;/span&gt;)&lt;br /&gt; &lt;span style="color: rgb(250, 128, 114);"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (!PyString_Check(value_obj))&lt;br /&gt; &lt;span style="color: rgb(250, 128, 114);"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt; = PyString_AsString(value_obj);&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;szbuf&lt;/b&gt;&lt;/span&gt; = &lt;span style="color: rgb(250, 128, 114);"&gt;sizeof&lt;/span&gt;(buf);&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;l&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyCodeObject&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;codeobj&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;l = snprintf(buf_p, szbuf, _(&lt;span style="color: rgb(255, 160, 122);"&gt;"Error Message:\n%s"&lt;/span&gt;), value);&lt;br /&gt;buf_p += l;&lt;br /&gt;szbuf -= l;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (traceback_obj != &lt;span style="color: rgb(127, 255, 212);"&gt;NULL&lt;/span&gt;) {&lt;br /&gt; l = snprintf(buf_p, szbuf, _(&lt;span style="color: rgb(255, 160, 122);"&gt;"\n\nTraceback:\n"&lt;/span&gt;));&lt;br /&gt; buf_p += l;&lt;br /&gt; szbuf -= l;&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyTracebackObject&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;traceback&lt;/b&gt;&lt;/span&gt; = (&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyTracebackObject&lt;/b&gt;&lt;/span&gt; *)traceback_obj;&lt;br /&gt; &lt;span style="color: rgb(250, 128, 114);"&gt;for&lt;/span&gt; (;traceback &amp;&amp;amp; szbuf &gt; 0; traceback = traceback-&gt;tb_next) {&lt;br /&gt;   codeobj = traceback-&gt;tb_frame-&gt;f_code;&lt;br /&gt;   l = snprintf(buf_p, szbuf, &lt;span style="color: rgb(255, 160, 122);"&gt;"%s: %s(# %d)\n"&lt;/span&gt;,&lt;br /&gt;                PyString_AsString(codeobj-&gt;co_name),&lt;br /&gt;                PyString_AsString(codeobj-&gt;co_filename),&lt;br /&gt;                traceback-&gt;tb_lineno);&lt;br /&gt;   buf_p += l;&lt;br /&gt;   szbuf -= l;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;message_error_dialog_show(buf);&lt;br /&gt;&lt;br /&gt;Py_XDECREF(type_obj);&lt;br /&gt;Py_XDECREF(value_obj);&lt;br /&gt;Py_XDECREF(traceback_obj);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;PyErr_Fetch用来获取异常对象，并且同时可以得到traceback对象，traceback其实是一个PyTracebackObject结构体，可以在python的头文件traceback.h中找到，PyTracebackObject其实也是一个单向链表，可以通过其tb_next成员来枚举，其tb_frame则是一个_frame结构体，在frameobject.h头文件中可以看到，其中f_code就是我们需要的PyCodeObject结构体，PyCodeObject中就可以得到co_name和co_filename这两个关键的描述，一个是错误信息另一个是文件名称，PyTracebackObject的tb_lineno就是出错的行号，有了这些数据我们调试还有困难吗？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-4469402564554153056?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/4469402564554153056/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=4469402564554153056' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4469402564554153056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4469402564554153056'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/04/cpythontraceback.html' title='C代码中如何得到python脚本异常时的traceback信息'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-1440777552034790082</id><published>2007-03-30T10:01:00.000+08:00</published><updated>2007-03-30T10:02:26.669+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>基于OpenGL开发的发行版</title><content type='html'>发行版：&lt;a href="http://one.xthost.info/zelko/opengl.html" target="_blank"&gt;Linux based OpenGL development system without X&lt;/a&gt;&lt;br /&gt;书籍：&lt;a href="http://sp4br75.digiweb.psi.br/TRB_ogl/" target="_blank"&gt;OpenGL Red Book&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;备忘帖。。。。。。。。^_^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-1440777552034790082?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/1440777552034790082/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=1440777552034790082' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/1440777552034790082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/1440777552034790082'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/opengl.html' title='基于OpenGL开发的发行版'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-2333982289272272951</id><published>2007-03-29T16:33:00.000+08:00</published><updated>2007-03-29T16:34:56.820+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reiserfs'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>生死边缘的轮回 - reiserfs文件系统的数据恢复</title><content type='html'>昨天晚上给客户一个应用定制裁减linux系统的时候，发生了一件非常不幸的事，我的data目录被我无意给rm -rf删除掉了，那里面存放着我的所有项目的代码和文档，还有很多其它重要的东西。看见那个目录突然什么都没有的时候那种感觉简直无法形容，由于长期出差一直没有机会给公司保留备份，还好今天恢复了大部分重要的文档和代码。希望跟我一样倒霉的朋友能以此为鉴，删除文件时一定要小心，并且经常备份重要的代码和文档。&lt;br /&gt;&lt;br /&gt;网上有两篇文章对reiserfs文件系统的数据恢复做了详细的介绍，&lt;a href="http://antrix.net/journal/techtalk/reiserfs_data_recovery_howto.comments?parent=23&amp;amp;title=Re:%20ReiserFS%20undelete/data%20recovery%20HOWTO" target="_blank"&gt;ReiserFS undelete/data recovery HOWTO&lt;/a&gt;和&lt;a href="http://martian.org/marty/2003/09/05/reiserfs-filesystem-recovery" target="_blank"&gt;Reiserfs filesystem recovery&lt;/a&gt;，另外提供几点建议：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;在误删除之后切记不要再进行任何操作，立即关机，做好准备再来做数据恢复！&lt;/li&gt;&lt;li&gt;准备好一块大硬盘或移动硬盘（最好使用usb 2.0的硬盘盒子），第一时间用dd把误删除数据的分区完整备份一份。恢复也最好针对这个image文件，直到重要的数据完全找到再处理该分区，如果失败了还可以借助专业数据恢复公司来进行数据恢复。&lt;/li&gt;&lt;li&gt;您在恢复时一定记得给reiserfsck加上-l参数，生成日志文件是非常重要的，如果文件太多reiserfsck并不能100%地恢复您的数据，日志文件里会告诉您哪些文件没有被正确地恢复。再次提醒您经常备份自己重要的数据！！！&lt;/li&gt;&lt;/ol&gt;顺便赞叹一下reiserfs作者，reiserfs确实是一个非常优秀的文件系统，我54G容量的分区dd到移动硬盘时间不超过1小时，数据恢复时间不超过30分钟，并且最终重要的数据基本上都得以恢复！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-2333982289272272951?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/2333982289272272951/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=2333982289272272951' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/2333982289272272951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/2333982289272272951'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/reiserfs.html' title='生死边缘的轮回 - reiserfs文件系统的数据恢复'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-3898644272525765920</id><published>2007-03-17T21:23:00.000+08:00</published><updated>2007-03-17T21:24:17.559+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gentoo'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>beryl/compiz的ontop补丁</title><content type='html'>用beryl/compiz的时候有个比较遗憾的地方，那就是窗口没有了ontop功能，也就是窗口置顶，不过给libwnck打上补丁就可以解决这个问题了。&lt;br /&gt;&lt;br /&gt;补丁地址：&lt;a href="http://www.compiz.info/patches/libwnck/"&gt;libwnck补丁&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-3898644272525765920?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/3898644272525765920/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=3898644272525765920' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3898644272525765920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3898644272525765920'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/berylcompizontop.html' title='beryl/compiz的ontop补丁'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-6766706953286134473</id><published>2007-03-12T14:57:00.000+08:00</published><updated>2007-03-12T15:02:49.456+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk+'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><title type='text'>GtkScrolledWindow滚动条问题</title><content type='html'>在使用GtkTreeView时，用GtkScrolledWindow来添加滚动条，但列表(或树)中的数据行在不断得更新(增加)，而垂直滚动条默认情况下不能自动往下滚动，以显示最新的数据行，而是始终停在top的位置，针对此问题有什么方法可以解决呢？&lt;br /&gt;&lt;br /&gt;每次增加数据行之后，得到最后一行的path，需要手动调用gtk_tree_view_scroll_to_cell，滚动到最后的地方。如果不想手动 调用，可以监听 model 的 row-inserted，在该signal callback中gtk_tree_view_scroll_to_cell，如果大量迅速的增加新行的话，速度会受影响，可以跟延时结合减少scroll的频率。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-6766706953286134473?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/6766706953286134473/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=6766706953286134473' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/6766706953286134473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/6766706953286134473'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/gtkscrolledwindow.html' title='GtkScrolledWindow滚动条问题'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-1685806275289772518</id><published>2007-03-11T23:15:00.000+08:00</published><updated>2007-03-11T23:16:20.769+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='other'/><title type='text'>强悍的回复帖</title><content type='html'>从CSDN主页上偶尔看到了一篇帖子，于是进去看了一下，&lt;a href="http://topic.csdn.net/t/20050308/15/3834281.html"&gt;十年MFC经历认识的Microsoft技术&lt;/a&gt;，楼主的行文风格不错，于是耐心地看了下去，一来觉得楼主知识系统全面值得学习，二来楼主的文字功底也颇为深厚，这种散文式的技术帖即使用来消遣也不错。不过没想到的是后来的一个回复帖真的让我捧腹大笑久久不能平静^_^。。。&lt;br /&gt;&lt;br /&gt;逐句地看完这个帖子以后，我的心久久不能平静，震撼啊！为什么会有如此好的帖子！我纵横网络bbs多年，自以为再也不会有任何帖子能打动我，没想到今天看到了如此精妙绝伦的这样一篇帖子。楼主，是你让我深深地理解了‘人外有人，天外有天’这句话。谢谢侬！在看完这帖子以后，我没有立即回复，因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子。但是我还是回复了，因为觉得如果不能在如此精彩的帖子后面留下自己的网名，那我死也不会瞑目的！能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊！    &lt;br /&gt;   &lt;br /&gt;楼主，请原谅我的自私！我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的，都是虚伪的，所以我只想说一句：您的帖子太好看了！我愿意一辈子的看下去！这篇帖子构思新颖，题材独具匠心，段落清晰，情节诡异，跌宕起伏，主线分明，引人入胜，平淡中显示出不凡的文学功底，可谓是字字珠玑，句句经典，是我辈应当学习之典范。就小说艺术的角度而言，这篇帖子不算太成功，但它的实验意义却远远大于成功本身。正所谓：“一马奔腾，射雕引弓，天地都在我心中！”楼主真不愧为无厘界新一代的开山怪！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-1685806275289772518?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/1685806275289772518/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=1685806275289772518' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/1685806275289772518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/1685806275289772518'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/blog-post_11.html' title='强悍的回复帖'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-4909830516630861074</id><published>2007-03-09T22:44:00.000+08:00</published><updated>2007-03-09T22:45:16.493+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>如何方便控制笔记本触摸板</title><content type='html'>笔记本的鼠标触摸板我基本上很少用，比起外接鼠标还是没那么方便灵活，何况写程序的时候基本上很少用鼠标，但是笔记本的触摸板却在写程序的时候经常搞得鼠标指针胡乱飘移，非常影响键盘输入的准确性。&lt;br /&gt;&lt;br /&gt;在linux下控制触摸板必须得使用2.6.x内核，大致有几件事要做：正确配置内核、安装synaptics驱动、正确配置xorg.conf。&lt;br /&gt;&lt;br /&gt;1、配置内核&lt;br /&gt;&lt;table style="border: 4px solid rgb(112, 112, 255); background-color: rgb(250, 235, 215);" width="75%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="border: 1px solid rgb(0, 0, 255); background-color: rgb(112, 112, 255); color: rgb(255, 255, 255);"&gt; &lt;font size="-1"&gt;Linux Kernel Configuration: Enable synaptics support&lt;/font&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Device Drivers ---&amp;gt;&lt;br /&gt;&lt;pre&gt;   Input Device Support ---&amp;gt;&lt;br /&gt;       &amp;lt;*&amp;gt; Event Interface&lt;br /&gt;       [*] Mouse ---&amp;gt;&lt;br /&gt;&lt;br /&gt;               &amp;lt;*&amp;gt; PS/2 mouse&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;2、安装synaptics，在gentoo下直接emerge synaptics即可。&lt;br /&gt;&lt;br /&gt;3、配置xorg.conf，首先看看你的输入设备信息，我机器上的输出信息如下：&lt;br /&gt;&lt;pre style="font-size:12px;color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;&lt;font color="#ffc0cb"&gt;&lt;b&gt;/home/debianl $ &lt;/b&gt;&lt;/font&gt;cat /proc/bus/input/devices &lt;br /&gt;I: Bus=0011 Vendor=0001 Product=0001 Version=ab41&lt;br /&gt;N: Name="AT Translated Set 2 keyboard"&lt;br /&gt;P: Phys=isa0060/serio0/input0&lt;br /&gt;S: Sysfs=/class/input/input0&lt;br /&gt;H: Handlers=kbd event0 &lt;br /&gt;B: EV=120013&lt;br /&gt;B: KEY=4 2000000 3802078 f840d001 feffffdf ffefffff ffffffff fffffffe&lt;br /&gt;B: MSC=10&lt;br /&gt;B: LED=7&lt;br /&gt;&lt;br /&gt;I: Bus=0011 Vendor=0002 Product=0007 Version=0000&lt;br /&gt;N: Name="SynPS/2 Synaptics TouchPad"&lt;br /&gt;P: Phys=isa0060/serio4/input0&lt;br /&gt;S: Sysfs=/class/input/input1&lt;br /&gt;H: Handlers=mouse0 event1 &lt;br /&gt;B: EV=b&lt;br /&gt;B: KEY=6420 0 70000 0 0 0 0 0 0 0 0&lt;br /&gt;B: ABS=11000003&lt;br /&gt;&lt;br /&gt;I: Bus=0003 Vendor=046d Product=c016 Version=0340&lt;br /&gt;N: Name="Logitech Optical USB Mouse"&lt;br /&gt;P: Phys=usb-0000:00:1d.1-1/input0&lt;br /&gt;S: Sysfs=/class/input/input2&lt;br /&gt;H: Handlers=mouse1 event2 &lt;br /&gt;B: EV=7&lt;br /&gt;B: KEY=70000 0 0 0 0 0 0 0 0&lt;br /&gt;B: REL=103&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;然后配置xorg.conf，加入TouchPad的Section内容，并在ServerLayout中加入InputDevice "TouchPad" "AlwaysCore"，以下是我的xorg.conf配置：&lt;br /&gt;&lt;pre style="font-size:12px;color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"ServerLayout"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"X.org Configured"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Screen&lt;/b&gt;&lt;/font&gt;      0  &lt;font color="#ffa07a"&gt;"Screen0"&lt;/font&gt; 0 0&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;InputDevice&lt;/b&gt;&lt;/font&gt;    &lt;font color="#ffa07a"&gt;"Mouse0"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"CorePointer"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;InputDevice&lt;/b&gt;&lt;/font&gt;    &lt;font color="#ffa07a"&gt;"Keyboard0"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"CoreKeyboard"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;InputDevice&lt;/b&gt;&lt;/font&gt;    &lt;font color="#ffa07a"&gt;"TouchPad"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"AlwaysCore"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Files"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;RgbPath&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"/usr/share/X11/rgb"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;ModulePath&lt;/b&gt;&lt;/font&gt;   &lt;font color="#ffa07a"&gt;"/usr/lib/xorg/modules"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/data/fonts/"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/misc/"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/TTF/"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/OTF"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/Type1/"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/CID/"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/100dpi/"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"/usr/share/fonts/75dpi/"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Module"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"glx"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"extmod"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"xtrap"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"record"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"dbe"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"dri"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"freetype"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"type1"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"InputDevice"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"Keyboard0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"kbd"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"InputDevice"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"Mouse0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"mouse"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"Protocol"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"auto"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"Device"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"/dev/input/mice"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"ZAxisMapping"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"4 5 6 7"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"InputDevice"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"TouchPad"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"synaptics"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"Device"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"/dev/input/mouse0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"Protocol"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"auto"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"SHMConfig"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"on"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Monitor"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;   &lt;font color="#ffa07a"&gt;"Monitor0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;VendorName&lt;/b&gt;&lt;/font&gt;   &lt;font color="#ffa07a"&gt;"Monitor Vendor"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;ModelName&lt;/b&gt;&lt;/font&gt;    &lt;font color="#ffa07a"&gt;"Monitor Model"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Device"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"Card0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"nvidia"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;VendorName&lt;/b&gt;&lt;/font&gt;  &lt;font color="#ffa07a"&gt;"nVidia Corporation"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;BoardName&lt;/b&gt;&lt;/font&gt;   &lt;font color="#ffa07a"&gt;"Unknown Board"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;BusID&lt;/b&gt;&lt;/font&gt;       &lt;font color="#ffa07a"&gt;"PCI:1:0:0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"Accel"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"True"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"RenderAccel"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"True"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Screen"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Screen0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Device&lt;/b&gt;&lt;/font&gt;     &lt;font color="#ffa07a"&gt;"Card0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Monitor&lt;/b&gt;&lt;/font&gt;    &lt;font color="#ffa07a"&gt;"Monitor0"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"AddARGBGLXVisuals"&lt;/font&gt; &lt;font color="#ffa07a"&gt;"true"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Display"&lt;/font&gt;&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     1&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Display"&lt;/font&gt;&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     4&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Display"&lt;/font&gt;&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     8&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Display"&lt;/font&gt;&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     15&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Display"&lt;/font&gt;&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     16&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Display"&lt;/font&gt;&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0&lt;br /&gt;                &lt;font color="#7fffd4"&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     24&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa07a"&gt;"Extensions"&lt;/font&gt;&lt;br /&gt;        &lt;font color="#7fffd4"&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color="#ffa07a"&gt;"Composite"&lt;/font&gt;   &lt;font color="#ffa07a"&gt;"enable"&lt;/font&gt;&lt;br /&gt;&lt;font color="#7fffd4"&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;现在你应该就可以使用synclient来配置各项参数了，也可以禁用触摸板，如果你用gnome的话可以安装一个gsynaptics，图形化的配置界面更易用点。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-4909830516630861074?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/4909830516630861074/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=4909830516630861074' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4909830516630861074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4909830516630861074'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/blog-post_09.html' title='如何方便控制笔记本触摸板'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-439414009222036162</id><published>2007-03-09T22:43:00.001+08:00</published><updated>2007-03-09T22:43:50.801+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mplayer'/><title type='text'>linux视频转换: mencoder</title><content type='html'>在网上发现一篇讲解利用mplayer的mencoder转换视频的文章，刚好适用我简陋的mp4转贴一下^_^，原文网址：&lt;a href="http://bbs.lupaworld.com/htm_data/253/0611/24711.html"&gt;Linux下的视频转换&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;制作适合在智能手机和PDA上观看的mpeg4视频。&lt;br /&gt;Linux上有一个很强大的视频音频转换软件，就是Mplayer自带的mencoder (MPlayer's Movie Encoder)。mencoder就象是一台全手动的照相机，可调整的选项非常多，不过这儿只是把最常见的情况说一下。&lt;br /&gt;&lt;br /&gt;转换avi文件，并把字幕内嵌到视频中。首先假设一下下列的条件：&lt;br /&gt;文件名：video.avi&lt;br /&gt;字幕文件名：video.srt&lt;br /&gt;目标文件：new.avi&lt;br /&gt;目标文件格式：mpeg4&lt;br /&gt;目标文件视频码率：200&lt;br /&gt;目标文件音频码率：64&lt;br /&gt;目标文件分辨率： 320：240&lt;br /&gt;制作内嵌字幕所需的字体：simsun.ttf&lt;br /&gt;（上面各项都可以根据实际情况进行调整）&lt;br /&gt;转换命令如下：&lt;br /&gt;&lt;br /&gt;mencoder -oac mp3lame -lameopts vbr=3:br=64 -ovc lavc -lavcopts vcodec=mpeg4:mbd=1:vbitrate=200 -sub video.srt -o new.avi -font simsun.ttf video.avi -subcp cp936 -subfont-text-scale 4 -vf scale=320:240&lt;br /&gt;各选项的含义：&lt;br /&gt;-oac 编码文件的音频部分。这儿是用lame将音频encode成mp3,即mp3lame。其他可用的选项可以调用mencoder的man page查看。&lt;br /&gt;-lameopts 顾名思义，即lame选项，这儿只需定义一下码率就可以了。&lt;br /&gt;vbr 设定音频码率的方法，格式为vbr=&lt;0-4&gt;&lt;br /&gt;&lt;br /&gt;0 cbr average bitrate&lt;br /&gt;1 mt&lt;br /&gt;2 rh   constant bitrate Also forces CBR mode encoding on subsequent ABR presets modes.&lt;br /&gt;3 abr&lt;br /&gt;4 mtrh&lt;br /&gt;&lt;br /&gt;在这儿用的是3,abr。&lt;br /&gt;br 就是设定我们所需要的码率值，格式为br=&lt;0-1024&gt;，只能在vbr为0和3的情况下才能使用该选项。&lt;br /&gt;-ovc 编码文件的视频部分。主要有以下几个选项&lt;br /&gt;&lt;br /&gt;-ovc copy&lt;br /&gt;      不进行编码，只是复制视频流&lt;br /&gt;-ovc divx4&lt;br /&gt;      编码成DivX4/DivX5&lt;br /&gt;-ovc raw&lt;br /&gt;      编码成任意不压缩的格式（用‘-vf format’设定具体的格式）&lt;br /&gt;-ovc lavc&lt;br /&gt;      使用libavcodec进行编码&lt;br /&gt;&lt;br /&gt;-lavcopts 就是libavcodec的选项。&lt;br /&gt;vcodec=使用指定的视频编码，下面列一下几个主要的值&lt;br /&gt;&lt;br /&gt;h264&lt;br /&gt;  H.264&lt;br /&gt;h263&lt;br /&gt;  H.263&lt;br /&gt;h263p&lt;br /&gt;  H.263+&lt;br /&gt;mpeg4&lt;br /&gt;  MPEG-4 (DivX 4/5)&lt;br /&gt;msmpeg4&lt;br /&gt;  DivX 3&lt;br /&gt;msmpeg4v2&lt;br /&gt;  MS MPEG4v2&lt;br /&gt;wmv1&lt;br /&gt;  Windows Media Video, version 1 (又称 WMV7)&lt;br /&gt;wmv2&lt;br /&gt;  Windows Media Video, version 2 (又称 WMV8)&lt;br /&gt;rv10&lt;br /&gt;  旧的RealVideo格式&lt;br /&gt;mpeg1video&lt;br /&gt;  MPEG-1 video&lt;br /&gt;mpeg2video&lt;br /&gt;  MPEG-2 video&lt;br /&gt;&lt;br /&gt;mbd 决定视频宏块的算法，这儿只需要mbd=1即可。其余的可以查看man page。&lt;br /&gt;vbitrate 设定视频的码率（默认为800）。&lt;br /&gt;-sub 设定字幕文件&lt;br /&gt;-o 目标视频文件&lt;br /&gt;-font 制作内嵌字幕所需字体的路径&lt;br /&gt;-subcp 字幕的编码，简体中文就是cp936&lt;br /&gt;-subfont-text-scale 字幕字体的大小&lt;br /&gt;-vf scale 视频的分辨率&lt;br /&gt;如果不需要将字幕内嵌入视频文件，只需要去掉-sub、-font、-subcp、-subfont-text-scale这几个选项。将rmvb转换成mpeg4也是如此。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-439414009222036162?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/439414009222036162/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=439414009222036162' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/439414009222036162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/439414009222036162'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/linux-mencoder.html' title='linux视频转换: mencoder'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-8836456204216792433</id><published>2007-03-09T10:44:00.000+08:00</published><updated>2007-03-09T10:55:57.393+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>python扩展与嵌入的入门级FAQ</title><content type='html'>以下是我在开发一个应用中集成python脚本引擎的过程中所遇到的一些入门级问题，稍后再整理一些比较完整的关于python扩展与嵌入的日志。&lt;br /&gt;&lt;br /&gt;1、如何在宿主应用中注册module？可在Py_Initialize之前调用PyImport_AppendInittab来注册，也可在Py_Initialize之后直接调用注册函数。&lt;br /&gt;&lt;br /&gt;2、如何添加宿主应用脚本的路径到python搜索路径？在Py_Initialize之后通过PySys_GetObject("path")得到sys.path，然后再通过PyList_Insert加入宿主应用的脚本路径。&lt;br /&gt;&lt;br /&gt;3、如何调用python模块中的函数？通过PyImport_ImportModule得到module，然后再通过PyModule_GetDict从module中得到dict，再通过PyDict_GetItemString得到函数对象，最后通过PyObject_CallObject或其它PyObject_Call系列函数调用，当然调用之前最好用PyCallable_Check检查，另外就是dict、func都属于Borrowed reference，因此不需要Py_DECREF或Py_XDECREF。&lt;br /&gt;&lt;br /&gt;4、所有的wrapper函数都应该返回PyObject实例指针，即使在python中调用的时候并不需要返回值，但仍需要返回Py_None，相当于C/C++中的void，Py_INCREF(Py_None); return Py_None;当然也可以用宏Py_RETURN_NONE来代替。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-8836456204216792433?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/8836456204216792433/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=8836456204216792433' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/8836456204216792433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/8836456204216792433'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/pythonfaq.html' title='python扩展与嵌入的入门级FAQ'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-4704049501124216867</id><published>2007-03-08T14:36:00.000+08:00</published><updated>2007-03-12T00:36:33.189+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gtk+'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>gtk+开发中的几个小经验</title><content type='html'>1、在gtk+开发过程中，我们经常需要在event handler中来访问该窗口中的某些控件的信息，通常习惯于整一大堆全局变量，其实还有更好的方式，在glib的实现中我们可以通过g_object_set_data和g_object_get_data给一个GObject对象绑定自定义的数据及属性，g_object_set_data_full还可以在对象释放资源时通知你的回调函数来做资源释放处理，这样我们就可以给event handler传递一个窗口对象指针就行了，其它的数据及控件信息可以通过窗口对象得到我们想要的东西。&lt;br /&gt;&lt;br /&gt;2、某些对象并未提供所有属性的存取方法，但只要是通过GObject继承下来的对象均可采用g_object_set、g_object_set_property及g_object_get、g_object_get_property来存取这些属性，如给TreeView中某一列的值要求居右则可以对gtk_cell_renderer_text_new()产生的GtkCellRenderer对象调用g_object_set(renderer, "xalign", 1.0, NULL)来达到居右的效果。&lt;br /&gt;&lt;br /&gt;3、使用g_idle_add及g_timeout_add等函数中的时候一定要小心，由于代码延后执行，因此一定要保证其数据的生命周期，如下面的例子是我在开发一个项目应用中遇到的问题(注释掉的代码即为出现问题之后的修正代码)，传递的Python对象到代码执行的时候已经被释放掉了，因此出现了比较奇怪的现象：如果连续调用这个函数两次，结果加进去的两行信息全部都是最后一次的数据，当然可能还会有更奇特的现象发生。&lt;br /&gt;&lt;br /&gt;&lt;pre  style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;gboolean&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;_etc_main_win_add_trans&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;gpointer&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;data&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;args&lt;/b&gt;&lt;/span&gt; = data;&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyTuple_Size(args) != lv_columns)&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;GtkWidget&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;listview&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;GtkTreeModel&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;model&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;GtkTreeIter&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;iter&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;i&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;GValue&lt;/b&gt;&lt;/span&gt; &lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;obj&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;listview = GTK_WIDGET(g_object_get_data(G_OBJECT(main_window), &lt;span style="color: rgb(255, 160, 122);"&gt;"trans_list"&lt;/span&gt;));&lt;br /&gt;model = gtk_tree_view_get_model(GTK_TREE_VIEW(listview));&lt;br /&gt;gtk_list_store_append(GTK_LIST_STORE(model), &amp;amp;iter);&lt;br /&gt;&lt;span style="color: rgb(250, 128, 114);"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; lv_columns; ++i) {&lt;br /&gt;  memset(&amp;value, 0, &lt;span style="color: rgb(250, 128, 114);"&gt;sizeof&lt;/span&gt;(value));&lt;br /&gt;  g_value_init(&amp;value, lv_types[i]);&lt;br /&gt;  obj = PyTuple_GetItem(args, i);&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;switch&lt;/span&gt;(lv_types[i]) {&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;case&lt;/span&gt; G_TYPE_INT:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyInt_Check(obj))&lt;br /&gt;      g_value_set_int(&amp;value, PyInt_AsLong(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;case&lt;/span&gt; G_TYPE_LONG:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyLong_Check(obj))&lt;br /&gt;      g_value_set_long(&amp;value, PyLong_AsLong(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;case&lt;/span&gt; G_TYPE_UINT:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyLong_Check(obj))&lt;br /&gt;      g_value_set_uint(&amp;value, PyLong_AsUnsignedLong(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;case&lt;/span&gt; G_TYPE_ULONG:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyLong_Check(obj))&lt;br /&gt;      g_value_set_ulong(&amp;value, PyLong_AsUnsignedLong(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;case&lt;/span&gt; G_TYPE_FLOAT:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyFloat_Check(obj))&lt;br /&gt;      g_value_set_float(&amp;value, PyFloat_AsDouble(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;case&lt;/span&gt; G_TYPE_DOUBLE:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyFloat_Check(obj))&lt;br /&gt;      g_value_set_double(&amp;value, PyFloat_AsDouble(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;default&lt;/span&gt;:&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;if&lt;/span&gt; (PyString_Check(obj))&lt;br /&gt;      g_value_set_string(&amp;value, PyString_AsString(obj));&lt;br /&gt;    &lt;span style="color: rgb(250, 128, 114);"&gt;break&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;  gtk_list_store_set_value(GTK_LIST_STORE(model), &amp;amp;iter, i, &amp;value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(173, 216, 230);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(173, 216, 230);"&gt;Py_XDECREF(args);&lt;br /&gt;&lt;/span&gt;  &lt;span style="color: rgb(250, 128, 114);"&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;etc_main_win_add_trans&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: rgb(154, 205, 50);"&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style="color: rgb(127, 255, 212);"&gt;&lt;b&gt;args&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(173, 216, 230);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(173, 216, 230);"&gt;Py_INCREF(args);&lt;br /&gt;&lt;/span&gt;  g_idle_add(_etc_main_win_add_trans, args);&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-4704049501124216867?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/4704049501124216867/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=4704049501124216867' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4704049501124216867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4704049501124216867'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/gtk.html' title='gtk+开发中的几个小经验'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-469253711724496378</id><published>2007-03-08T11:29:00.000+08:00</published><updated>2007-03-08T11:31:36.922+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>我的mlterm配置</title><content type='html'>~/.mlterm/main&lt;br /&gt;&lt;pre style="font-size:12px; color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;use_transbg = true&lt;br /&gt;wall_picture =&lt;br /&gt;scrollbar_mode = none&lt;br /&gt;brightness = 100&lt;br /&gt;contrast = 100&lt;br /&gt;gamma = 100&lt;br /&gt;scrollbar_view_name = mozmodern&lt;br /&gt;use_anti_alias = true&lt;br /&gt;use_variable_column_width = false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;~/.mlterm/aafont&lt;br /&gt;&lt;pre style="font-size:12px; color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;ISO10646_UCS2_1=Bitstream Vera Sans Mono-iso10646-1;&lt;br /&gt;ISO10646_UCS2_1_BIWIDTH=SimSun-iso10646-1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;~/.mlterm/termcap&lt;br /&gt;&lt;pre style="font-size:12px; color:#f5deb3;background-color:#2f4f4f"&gt;&lt;br /&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;xterm&lt;/b&gt;&lt;/font&gt;&lt;font color="#6a5acd"&gt;|&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;mlterm&lt;/b&gt;&lt;/font&gt;&lt;font color="#6a5acd"&gt;:&lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;kD&lt;/b&gt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&lt;font color="#6a5acd"&gt;\E&lt;/font&gt;[3~&lt;font color="#6a5acd"&gt;:&lt;/font&gt;&lt;font color="#2e8b57"&gt;&lt;b&gt;kb&lt;/b&gt;&lt;/font&gt;&lt;font color="#a52a2a"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;&lt;font color="#6a5acd"&gt;^?&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-469253711724496378?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/469253711724496378/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=469253711724496378' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/469253711724496378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/469253711724496378'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/mlterm.html' title='我的mlterm配置'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-4332474478177414205</id><published>2007-03-08T11:27:00.000+08:00</published><updated>2007-03-08T11:29:00.814+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><title type='text'>程序库的autotools脚本</title><content type='html'>1、configure.ac的不同&lt;br /&gt;&lt;pre style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_INIT&lt;/font&gt;&lt;font color="#6b59ce"&gt;()&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AM_INIT_AUTOMAKE&lt;/font&gt;&lt;font color="#6b59ce"&gt;(&lt;/font&gt;lclibs&lt;font color="#6b59ce"&gt;,&lt;/font&gt; &lt;font color="#ff00ff"&gt;0.1&lt;/font&gt;&lt;font color="#6b59ce"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AM_CONFIG_HEADER&lt;/font&gt;&lt;font color="#6b59ce"&gt;([&lt;/font&gt;config.h&lt;font color="#6b59ce"&gt;])&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# Checks for programs.&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_PROG_CC&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# 库与应用程序不一样，需要libtool支持&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# 一般不用intltool，所以没有AC_PROG_INTLTOOL&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_PROG_LIBTOOL&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# Checks for libraries.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# Checks for header files.&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_HEADER_STDC&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_CHECK_HEADERS&lt;/font&gt;&lt;font color="#6b59ce"&gt;([&lt;/font&gt;arpa/inet.h netdb.h netinet/&lt;font color="#a52829"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/font&gt;.h stdlib.h string.h strings.h sys/socket.h unistd.h&lt;font color="#6b59ce"&gt;])&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# Checks for typedefs, structures, and compiler characteristics.&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_C_CONST&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_C_INLINE&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_TYPE_SIZE_T&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;# Checks for library functions.&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_FUNC_MALLOC&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_FUNC_REALLOC&lt;/font&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_CHECK_FUNCS&lt;/font&gt;&lt;font color="#6b59ce"&gt;([&lt;/font&gt;atexit bzero gethostbyname inet_ntoa memset socket strcasecmp strchr strdup strpbrk strspn strstr&lt;font color="#6b59ce"&gt;])&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;AC_OUTPUT&lt;/font&gt;&lt;font color="#6b59ce"&gt;([&lt;/font&gt;&lt;br /&gt;Makefile&lt;br /&gt;src/Makefile&lt;br /&gt;&lt;font color="#6b59ce"&gt;])&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2、src/Makefile.am的不同&lt;br /&gt;&lt;pre style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;br /&gt;&lt;font color="#a52829"&gt;&lt;b&gt;lib_LTLIBRARIES &lt;/b&gt;&lt;/font&gt;= liblclibs.la&lt;br /&gt;&lt;font color="#298a52"&gt;&lt;b&gt;liblclibs_la_SOURCES &lt;/b&gt;&lt;/font&gt;= &lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        utils.c&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        stack.c&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        sockets_wrapper.c&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        queue.c&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        packages.c&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        inifiles.c&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;        hash.c&lt;br /&gt;&lt;br /&gt;&lt;font color="#008a8c"&gt;lclibsincludedir &lt;/font&gt;= &lt;font color="#008a8c"&gt;$(includedir)&lt;/font&gt;/lclibs&lt;br /&gt;&lt;font color="#a52829"&gt;&lt;b&gt;lclibsinclude_HEADERS &lt;/b&gt;&lt;/font&gt;= &lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;lclibs.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;utils.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;threads_wrapper.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;stack.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;sockets_wrapper.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;queue.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;packages.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;inifiles.h&lt;font color="#6b59ce"&gt;\&lt;/font&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;        &lt;/font&gt;hash.h&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-4332474478177414205?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/4332474478177414205/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=4332474478177414205' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4332474478177414205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4332474478177414205'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/autotools_08.html' title='程序库的autotools脚本'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-2249998910712987111</id><published>2007-03-08T11:19:00.000+08:00</published><updated>2007-03-08T11:26:12.112+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><title type='text'>autotools实践</title><content type='html'>1、准备好目录树(一般情况下请将源码扔/src目录)&lt;br /&gt;&lt;br /&gt;2、运行autoscan &amp;&amp;amp; mv configure.scan configure.ac &amp;&amp;amp; rm -f autoscan*&lt;br /&gt;&lt;br /&gt;修改configure.ac，去掉AC_INIT后面括号里的东西，增加AM_INIT_AUTOMAKE(你的包名, 包版本号)，并将AC_CONFIG_HEADER改为AM_CONFIG_HEADER，删除掉AC_CONFIG_FILES，改AC_OUTPUT为AC_OUTPUT(Makefile src/Makefile po/Makefile.in)，用AC_CONFIG_FILES在automake时会报错。&lt;br /&gt;&lt;br /&gt;3、注意加上你程序中用到的库和头文件检测语句，看起来应如下所示：&lt;br /&gt;&lt;pre  style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_INIT&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AM_INIT_AUTOMAKE&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;(&lt;/span&gt;dsrc&lt;span style="color: rgb(107, 89, 206);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(255, 0, 255);"&gt;0.1&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AM_CONFIG_HEADER&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;(&lt;/span&gt;config.h&lt;span style="color: rgb(107, 89, 206);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Checks for programs.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_PROG_CC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_PROG_INTLTOOL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Checks for libraries.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# PKG_CHECK_MODULES可直接在Makefile.am中引用$(xxx_CFLAGS)和$(xxx_LIBS)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;PKG_CHECK_MODULES&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;(&lt;/span&gt;xml2&lt;span style="color: rgb(107, 89, 206);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(107, 89, 206);"&gt;[&lt;/span&gt;xml2&lt;span style="color: rgb(107, 89, 206);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;PKG_CHECK_MODULES&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;(&lt;/span&gt;openssl&lt;span style="color: rgb(107, 89, 206);"&gt;,&lt;/span&gt; &lt;span style="color: rgb(107, 89, 206);"&gt;[&lt;/span&gt;openssl&lt;span style="color: rgb(107, 89, 206);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_CHECK_LIB&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;([&lt;/span&gt;pthread&lt;span style="color: rgb(107, 89, 206);"&gt;],&lt;/span&gt; &lt;span style="color: rgb(107, 89, 206);"&gt;[&lt;/span&gt;main&lt;span style="color: rgb(107, 89, 206);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Checks for header files.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_HEADER_STDC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_CHECK_HEADERS&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;([&lt;/span&gt;arpa/inet.h libintl.h locale.h netinet/&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt;.h stdlib.h string.h sys/socket.h unistd.h&lt;span style="color: rgb(107, 89, 206);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Checks for typedefs, structures, and compiler characteristics.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_C_CONST&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_TYPE_SIZE_T&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# Checks for library functions.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_FUNC_FORK&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_FUNC_MALLOC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_FUNC_REALLOC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_CHECK_FUNCS&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;([&lt;/span&gt;inet_ntoa memset setlocale socket strcasecmp strncasecmp&lt;span style="color: rgb(107, 89, 206);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# gettext&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;GETTEXT_PACKAGE&lt;/span&gt;&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/span&gt;dsrc&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_SUBST&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;GETTEXT_PACKAGE&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;ALL_LINGUAS&lt;/span&gt;&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;"zh_CN"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AM_GLIB_GNU_GETTEXT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AC_OUTPUT&lt;/span&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;([&lt;/span&gt;&lt;br /&gt;Makefile&lt;br /&gt;src/Makefile&lt;br /&gt;po/Makefile.&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4、准备/Makefile.am&lt;br /&gt;&lt;pre  style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;SUBDIRS &lt;/b&gt;&lt;/span&gt;= src po&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;dsrcdocdir &lt;/span&gt;= &lt;span style="color: rgb(0, 138, 140);"&gt;${prefix}&lt;/span&gt;/doc/dsrc&lt;br /&gt;&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;dsrcdoc_DATA &lt;/b&gt;&lt;/span&gt;= &lt;span style="color: rgb(107, 89, 206);"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;        &lt;/span&gt;README&lt;span style="color: rgb(107, 89, 206);"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;        &lt;/span&gt;COPYING&lt;span style="color: rgb(107, 89, 206);"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;        &lt;/span&gt;AUTHORS&lt;span style="color: rgb(107, 89, 206);"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;        &lt;/span&gt;ChangeLog&lt;span style="color: rgb(107, 89, 206);"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;        &lt;/span&gt;INSTALL&lt;span style="color: rgb(107, 89, 206);"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;        &lt;/span&gt;NEWS&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(107, 89, 206);"&gt;EXTRA_DIST &lt;/span&gt;= &lt;span style="color: rgb(0, 138, 140);"&gt;$(dsrcdoc_DATA)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;其实这个内容非常简单，一看就明白了，上面所列的EXTRA_DIST为需要安装到/usr/share/doc下的东西，如果你还有其它文档可以加到这个列表中&lt;br /&gt;&lt;br /&gt;5、准备src/Makefile.am&lt;br /&gt;&lt;pre  style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;INCLUDES &lt;/span&gt;= -DLOCALEDIR=\"&lt;span style="color: rgb(255, 0, 255);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;$(prefix)&lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;/share/locale"&lt;/span&gt;\"&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;AM_CFLAGS &lt;/span&gt;= -DDEBUG -g &lt;span style="color: rgb(0, 138, 140);"&gt;$(xml2_CFLAGS)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 138, 140);"&gt;LIBS &lt;/span&gt;= &lt;span style="color: rgb(0, 138, 140);"&gt;$(xml2_LIBS)&lt;/span&gt; &lt;span style="color: rgb(0, 138, 140);"&gt;$(openssl_LIBS)&lt;/span&gt; -lpthread&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# AM_LDFLAGS =&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 40, 41);"&gt;&lt;b&gt;bin_PROGRAMS &lt;/b&gt;&lt;/span&gt;= dsrc&lt;br /&gt;&lt;span style="color: rgb(41, 138, 82);"&gt;&lt;b&gt;dsrc_SOURCES &lt;/b&gt;&lt;/span&gt;= main.c security.c XML_utils.c DSRC_handler.c DSRC_builder.c&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# dsrc_CFLAGS =&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;# dsrc_LDFLAGS =&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;如果会生成多个执行文件可为bin_PROGRAMS增加文件名即可，以空格隔开，下面对每个执行文件需要的源文件定义为xxx_SOURCES即可，如果某执行文件编译参数以及链接参数也可以单独设置：xxx_CFLAGS、xxx_LDFLAGS，不过我建议库文件链接参数直接在configure.ac里AC_CHECK_LIB了事，来得方便点&lt;br /&gt;&lt;br /&gt;6、创建automake需要的一些文件&lt;br /&gt;&lt;br /&gt;touch AUTHORS NEWS README INSTALL ChangeLog&lt;br /&gt;&lt;br /&gt;7、心动从现在开始&lt;br /&gt;&lt;br /&gt;aclocal&lt;br /&gt;autoconf&lt;br /&gt;intltoolize&lt;br /&gt;autoheader&lt;br /&gt;automake --add-missing --gnu&lt;br /&gt;&lt;br /&gt;8、正事要紧&lt;br /&gt;&lt;br /&gt;给自己的程序添加gettext支持，关于gettext的详细介绍可参考其它文章，一般就是以下套路&lt;br /&gt;&lt;pre  style="color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);font-size:12px;"&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 32, 247);"&gt;#include &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;libintl.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 32, 247);"&gt;#include &lt;/span&gt;&lt;span style="color: rgb(255, 0, 255);"&gt;&amp;lt;locale.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 32, 247);"&gt;#define _(string) gettext(string)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(165, 32, 247);"&gt;#define N_(string) string&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(41, 138, 82);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;i18n_init(&lt;span style="color: rgb(41, 138, 82);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;  bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);&lt;br /&gt;  bind_textdomain_codeset(GETTEXT_PACKAGE, &lt;font color="#ffa07a"&gt;"UTF-8"&lt;/font&gt;);&lt;br /&gt;  textdomain(GETTEXT_PACKAGE);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;通常程序在入口处就调用i18n_init()，在显示常量字符串的时候一般如fprintf(stdout, _("Hello World\n"));&lt;br /&gt;&lt;br /&gt;9、创建po文件&lt;br /&gt;&lt;br /&gt;创建并进入/po目录，创建POTFILES.in，内容为你需要提取源码中有需要翻译的字符串的源文件列表，每行一个文件，然后执行intltool-update --pot产生pot文件，如果将来你在维护代码中代码有变化或者在POTFILES.in中新增了源文件，可用intltool-update --maintain更新。&lt;br /&gt;&lt;br /&gt;有了pot文件，现在需要产生各种语言的po文件，如msginit --locale=zh_CN产生中文po文件，如将来源文件有变化可以intltool-update zh_CN更新zh_CN.po，接下来翻译的工作就是你自己来做了。&lt;br /&gt;&lt;br /&gt;要生成特定语言的mo文件，需要维护configure.ac中的ALL_LINGUAS，以空格分隔就可以了&lt;br /&gt;&lt;br /&gt;10、测试&lt;br /&gt;&lt;br /&gt;./configure --prefix=/usr&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;LANG="zh_CN.UTF-8" xxx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-2249998910712987111?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/2249998910712987111/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=2249998910712987111' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/2249998910712987111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/2249998910712987111'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/autotools.html' title='autotools实践'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-743548617128560524</id><published>2007-03-08T11:16:00.000+08:00</published><updated>2007-03-08T11:17:22.244+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><title type='text'>libxml2尝试</title><content type='html'>etc项目中实现一个http server，刚好用到大量的XML，每次处理的数据包XML数据相对较小，先尝试了expat，SAX解析方式确实痛苦，需要自己维护状态树。libxml2相对功能比较全，SAX、DOM解析方式都有实现，而且还有XPath、XLink等实现，甚至连HTMLparser都有了，下面是我这次用到的一些API：&lt;br /&gt;&lt;br /&gt;1、解析XML文档DOM树(参考parser.h)&lt;br /&gt;&lt;br /&gt;xmlDocPtr doc = xmlParseDoc((const xmlChar *)xml_data);&lt;br /&gt;xmlNodePtr node = xmlDocGetRootElement(doc);&lt;br /&gt;然后node就可以在DOM树里面漫游了，当然xmlParseDoc之后理所当然应该检查doc是否为空意即解析是否成功，结束之后记得xmlFreeDoc(doc)；如果需要解析xml文件，则使用xmlParseFile(const xmlChar *)"test.xml")。&lt;br /&gt;&lt;br /&gt;2、常见操作(参考tree.h)&lt;br /&gt;&lt;br /&gt;得到一个节点的名称：node-&gt;name^_^&lt;br /&gt;得到一个节点的内容：xmlChar *value = xmlNodeGetContent(node)返回值value应该使用xmlFree(value)释放内存&lt;br /&gt;设置一个节点的内容：xmlNodeSetContent(node, (const xmlChar *)"test")&lt;br /&gt;得到一个节点的某属性值：xmlChar *value = xmlGetProp(node, (const xmlChar *)"prop1")，返回值需要xmlFree(value)释放内存&lt;br /&gt;设置一个节点的某属性值：xmlSetProp(node, (const xmlChar *)"prop1", (const xmlChar *)"v1")&lt;br /&gt;&lt;br /&gt;3、新建XML文档(参考tree.h)&lt;br /&gt;&lt;br /&gt;xmlDocPtr doc = xmlNewDoc("1.0")，其中1.0是版本号&lt;br /&gt;doc-&gt;children = xmlNewDocNode(doc, NULL, (const xmlChar *)"stream", NULL)创建根节点，具体函数原型可参考其API-Manual&lt;br /&gt;xmlNodePtr node = xmlNewChild(doc-&gt;children, NULL, (const xmlChar *)"dsrc_frame", NULL)，用xmlNewChild可生成某节点的子节点&lt;br /&gt;xmlDocDumpFormatMemory(doc, buf, &amp;result, 1)，用来保存生成的xml文档到内存中，此系列函数还包括：xmlDocDump、xmlDocDumpFormatMemoryEnc、xmlDocDumpMemory、xmlDocDumpMemoryEnc、xmlDocFormatDump&lt;br /&gt;&lt;br /&gt;4、XPath操作(参考xpath.h)(XPath可参考w3c文档http://www.w3.org/TR/xpath)&lt;br /&gt;&lt;br /&gt;有时候对一个XML文档我们可能只关心其中某一个或某几个特定的Element的值或其属性，如果漫游DOM树将是很痛苦也很无聊的事，XPath可以非常方便地得到你想的Element。下面是一个自定义函数：&lt;br /&gt;&lt;pre style="font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;br /&gt;xmlXPathObjectPtr&lt;br /&gt;get_nodeset(xmlDocPtr doc, &lt;font color="#298a52"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; xmlChar *xpath)&lt;br /&gt;{&lt;br /&gt;  xmlXPathContextPtr context;&lt;br /&gt;  xmlXPathObjectPtr result;&lt;br /&gt;&lt;br /&gt;  context = xmlXPathNewContext(doc);&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (context == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;    &lt;font color="#a52829"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;  result = xmlXPathEvalExpression(xpath, context);&lt;br /&gt;  xmlXPathFreeContext(context);&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (result == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;    &lt;font color="#a52829"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (xmlXPathNodeSetIsEmpty(result-&amp;gt;nodesetval)) {&lt;br /&gt;    xmlXPathFreeObject(result);&lt;br /&gt;    &lt;font color="#a52829"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; result;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;下面是调用代码：&lt;br /&gt;&lt;pre style="font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);"&gt;&lt;br /&gt;xmlXPathObjectPtr app_result = get_nodeset(doc, (&lt;font color="#298a52"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; xmlChar *)&lt;font color="#ff00ff"&gt;&amp;quot;/stream/dsrc_frame/tapdu/application[1]/param&amp;quot;&lt;/font&gt;);&lt;br /&gt;&lt;font color="#a52829"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (app_result == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;0&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;xmlNodeSetPtr nodeset = app_result-&amp;gt;nodesetval;&lt;br /&gt;xmlChar *value = xmlNodeGetContent(nodeset-&amp;gt;nodeTab[&lt;font color="#ff00ff"&gt;0&lt;/font&gt;]);&lt;br /&gt;&lt;font color="#a52829"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (value == &lt;font color="#ff00ff"&gt;NULL&lt;/font&gt;)&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; ret;&lt;br /&gt;&lt;br /&gt;printf(&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6b59ce"&gt;%s&lt;/font&gt;&lt;font color="#6b59ce"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;, value);&lt;br /&gt;&lt;br /&gt;xmlXPathFreeObject(app_result);&lt;br /&gt;xmlFree(value);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-743548617128560524?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/743548617128560524/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=743548617128560524' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/743548617128560524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/743548617128560524'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/libxml2.html' title='libxml2尝试'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-969758138012796293</id><published>2007-03-08T11:14:00.001+08:00</published><updated>2007-03-08T11:14:46.803+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c/c++'/><title type='text'>查看导出符号</title><content type='html'>用nm即可，共享库.so加一个-D参数，其它参数可参考help&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-969758138012796293?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/969758138012796293/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=969758138012796293' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/969758138012796293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/969758138012796293'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/blog-post_08.html' title='查看导出符号'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-8277613380167159911</id><published>2007-03-08T11:13:00.001+08:00</published><updated>2007-03-08T11:13:54.725+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>wget整站下载</title><content type='html'>wget -r -p -np -k http://www.gtk.org/tutorial/&lt;br /&gt;&lt;br /&gt;-r,  --recursive          specify recursive download.&lt;br /&gt;-k,  --convert-links      make links in downloaded HTML point to local files.&lt;br /&gt;-p,  --page-requisites    get all images, etc. needed to display HTML page.&lt;br /&gt;-np, --no-parent                 don't ascend to the parent directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-8277613380167159911?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/8277613380167159911/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=8277613380167159911' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/8277613380167159911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/8277613380167159911'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/wget.html' title='wget整站下载'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-3618231406024782421</id><published>2007-03-08T11:10:00.000+08:00</published><updated>2007-03-08T11:13:10.454+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>一个简单的awk应用</title><content type='html'>有两个文件：&lt;br /&gt;一个文件是两列，第一列是ID，第二列是ID对应的经验植。&lt;br /&gt;第2个文件是等级，3列，第一列是等级，第2列是经验值开始值，第3列是经验值结束值，就是2，3列是等级经验范围。&lt;br /&gt;现在要求查出第一个文件每行对应等级，并输出。&lt;br /&gt;&lt;pre style="font-size:12px; color:#f5deb3; background-color:#2f4f4f"&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;#!/bin/awk -f&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#6b59ce"&gt;BEGIN&lt;/font&gt; {&lt;br /&gt;  i = &lt;font color="#ff00ff"&gt;1&lt;/font&gt;&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;((&lt;font color="#a52829"&gt;&lt;b&gt;getline&lt;/b&gt;&lt;/font&gt; &amp;lt; &lt;font color="#ff00ff"&gt;&amp;quot;level.txt&amp;quot;&lt;/font&gt;) &amp;gt; &lt;font color="#ff00ff"&gt;0&lt;/font&gt;) {&lt;br /&gt;    level[&lt;font color="#6b59ce"&gt;i&lt;/font&gt;] = &lt;font color="#6b59ce"&gt;$1&lt;/font&gt;&lt;br /&gt;    min[&lt;font color="#6b59ce"&gt;i&lt;/font&gt;] = &lt;font color="#6b59ce"&gt;$2&lt;/font&gt;&lt;br /&gt;    max[&lt;font color="#6b59ce"&gt;i&lt;/font&gt;] = &lt;font color="#6b59ce"&gt;$3&lt;/font&gt;&lt;br /&gt;    i++&lt;br /&gt;  }&lt;br /&gt;  line = i&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;  &lt;font color="#a52829"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;(j = &lt;font color="#ff00ff"&gt;1&lt;/font&gt;&lt;font color="#6b59ce"&gt;;&lt;/font&gt; j &amp;lt;= line&lt;font color="#6b59ce"&gt;;&lt;/font&gt; j++) {&lt;br /&gt;    &lt;font color="#a52829"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(&lt;font color="#6b59ce"&gt;$2&lt;/font&gt; &amp;gt;= min[&lt;font color="#6b59ce"&gt;j&lt;/font&gt;] &amp;amp;&amp;amp; &lt;font color="#6b59ce"&gt;$2&lt;/font&gt; &amp;lt; max[&lt;font color="#6b59ce"&gt;j&lt;/font&gt;]) &lt;font color="#a52829"&gt;&lt;b&gt;printf&lt;/b&gt;&lt;/font&gt; &lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6b59ce"&gt;%s&lt;/font&gt;&lt;font color="#ff00ff"&gt;,&lt;/font&gt;&lt;font color="#6b59ce"&gt;%s&lt;/font&gt;&lt;font color="#6b59ce"&gt;\n&lt;/font&gt;&lt;font color="#ff00ff"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#6b59ce"&gt;,&lt;/font&gt;&lt;font color="#6b59ce"&gt;$1&lt;/font&gt;&lt;font color="#6b59ce"&gt;,&lt;/font&gt;level[&lt;font color="#6b59ce"&gt;j&lt;/font&gt;]&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-3618231406024782421?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/3618231406024782421/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=3618231406024782421' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3618231406024782421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/3618231406024782421'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/awk.html' title='一个简单的awk应用'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-4009715859633480076</id><published>2007-03-08T11:09:00.000+08:00</published><updated>2007-03-08T11:10:13.461+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>linux裁减实践</title><content type='html'>1、编译busybox，我通常会选择Busybox Settings/General Configuration中的前面6项，Installation Options中的Don't use /usr，下面的Applets我基本上都选，反正也不大，Init Utilities中我去掉了两个与debugging有关的选项，其它也没什么了，看着选择自己需要的就行了。&lt;br /&gt;&lt;br /&gt;2、如果你的busybox编译得没什么问题不需要再调整接下来的工作你可以在_install目录里面做，否则我觉得最好还是挂载好你将要使用的设备，将_install下的所有文件和目录复制到设备上去。mkdir -p boot/grub root dev etc/init.d lib proc tmp var/lib/misc var/lock var/log var/tmp usr/bin usr/lib &amp;&amp;amp; chmod 1777 tmp var/tmp。&lt;br /&gt;&lt;br /&gt;3、裁减kernel，通常裁减主要用于一个特定的应用，设备都是指定的，可以针对相应的硬件配置只选择自己需要的驱动，裁减的linux应用通常也比较单一，因此很多功能都可以不选择。复制kernel文件vmlinuz到boot目录，如果用grub的话可将grub的stage1和stage2两个文件复制boot/grub中，编辑好grub.conf安装grub即可。&lt;br /&gt;&lt;br /&gt;4、要复制的/dev下的一些设备文件：console、core、fd0、null、ptmx、pts、ram*、random、stderr、stdin、stdout、rd、fd、tty、tty0~tty9、urandom、vcs、zero、hda*(如果用的是ide接口硬盘)、pty*，如果要使用X还要复制agppart、misc、log、mem、input。复制方法用cp -avp /dev/xxx &lt;target-directory&gt;。&lt;br /&gt;&lt;br /&gt;5、复制母系统的/etc/group、passwd、shadow到etc目录，删除掉不需要的组和用户即可。&lt;br /&gt;&lt;br /&gt;6、配置/etc/fstab，至少有类似以下这样的项：&lt;br /&gt;/dev/hda11    /        reiserfs    defaults        0 0&lt;br /&gt;proc        /proc        proc        defaults        0 0&lt;br /&gt;none        /dev/pts    devpts        gid=5,mode=620    0 0&lt;br /&gt;&lt;br /&gt;7、配置/etc/inittab：&lt;br /&gt;::sysinit:/etc/init.d/rcS&lt;br /&gt;&lt;br /&gt;::respawn:/sbin/getty 38400 tty1&lt;br /&gt;tty2::respawn:/sbin/getty 38400 tty2&lt;br /&gt;tty3::respawn:/sbin/getty 38400 tty3&lt;br /&gt;tty4::respawn:/sbin/getty 38400 tty4&lt;br /&gt;&lt;br /&gt;::restart:/sbin/init&lt;br /&gt;&lt;br /&gt;::ctrlaltdel:/sbin/reboot&lt;br /&gt;::shutdown:/bin/umount -a -r&lt;br /&gt;::shutdown:/sbin/swapoff -a&lt;br /&gt;&lt;br /&gt;8、编辑/etc/issue，如Welcome to MyLinux release 0.1 on \l&lt;br /&gt;&lt;br /&gt;9、编辑/etc/init.d/rcS：&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;/bin/mount -a&lt;br /&gt;/bin/mount -o remount,rw /&lt;br /&gt;&lt;br /&gt;echo&lt;br /&gt;echo&lt;br /&gt;echo&lt;br /&gt;echo -en "\t\t\tWelcome to \\033[0;32mMyLinux\\033[0;39m release 0.1\n"&lt;br /&gt;&lt;br /&gt;hostname MyLinux&lt;br /&gt;ifconfig lo up&lt;br /&gt;ifconfig eth0 192.168.4.240 netmask 255.255.255.0 up&lt;br /&gt;route add default gw 192.168.4.1&lt;br /&gt;syslogd&lt;br /&gt;&lt;br /&gt;10、复制必要的库文件，当然在这儿busybox也可以静态编译链接，但你的应用应该也要用到库文件的，都静态编译链接还是挺浪费空间的，所以我一般并不使用静态编译链接。现在复制必要的库文件到lib目录，可以使用ldd查看某个elf文件需要使用哪些共享库。&lt;br /&gt;&lt;br /&gt;基本上就这些步骤，X的配置也很简单，推荐使用gentoo，用gentoo裁减linux非常方便，可以简单地用quickpkg打包你想要的，然后解压到目标设备上，然后删掉不需要的东西即可。现在可以启动一下试试了。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-4009715859633480076?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/4009715859633480076/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=4009715859633480076' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4009715859633480076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/4009715859633480076'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/linux.html' title='linux裁减实践'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-1005676909683175973</id><published>2007-03-08T11:08:00.000+08:00</published><updated>2007-03-08T11:09:13.819+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>kernel的LXR页面</title><content type='html'>1.0以下版本代码：&lt;a href="http://www.oldlinux.org/lxr/http_cn/source/"&gt;http://www.oldlinux.org/lxr/http_cn/source/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1.0以上版本代码：&lt;a href="http://lxr.linux.no/source/"&gt;http://lxr.linux.no/source/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-1005676909683175973?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/1005676909683175973/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=1005676909683175973' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/1005676909683175973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/1005676909683175973'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/kernellxr.html' title='kernel的LXR页面'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8648637.post-9028779888147183909</id><published>2007-03-08T11:06:00.000+08:00</published><updated>2007-03-08T11:08:35.513+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>常用的firefox扩展</title><content type='html'>Fasterfox - 据说可以提速，我倒没有感觉出来。&lt;br /&gt;Tab Mix Plus - 给标签页上加上了关闭按扭，这是我最喜欢的，其它功能对我似乎没用。&lt;br /&gt;Wizz RSS News Reader - 这个也不错，省去了我安装Liferea。&lt;br /&gt;FireFTP - 感觉这个插件比gftp还好用。&lt;br /&gt;JSView - 可以直接从它这儿得到你喜欢的网页的js和css，对web开发挺有用的。&lt;br /&gt;Gmail Manager - 管理gmail邮箱方便，有了它我几乎不用evolution。&lt;br /&gt;Greasemonkey - 一个强大的脚本管理工具，不过我用它几乎只是为了上btchina.net。&lt;br /&gt;Google Browser Sync - 将Firefox中的浏览历史、收藏夹之类的东西同步到你的google帐号去，这个功能很有用，尤其是重装系统把/home下的东西删掉了。&lt;br /&gt;IGoogle Sidebar - 以侧栏方式查看你的google自定义主页上的个性化内容。&lt;br /&gt;&lt;br /&gt;Noia - 不算是扩展，是Firefox里我最喜欢用的一个主题。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8648637-9028779888147183909?l=lidaibin.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lidaibin.blogspot.com/feeds/9028779888147183909/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=8648637&amp;postID=9028779888147183909' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/9028779888147183909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8648637/posts/default/9028779888147183909'/><link rel='alternate' type='text/html' href='http://lidaibin.blogspot.com/2007/03/firefox.html' title='常用的firefox扩展'/><author><name>超越无限</name><uri>http://www.blogger.com/profile/02650738681708933681</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11543675083671506875'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>