<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>超越无限的blog</title>
  <link>http://lidaibin.livejournal.com/</link>
  <description>超越无限的blog - LiveJournal.com</description>
  <lastBuildDate>Wed, 26 Dec 2007 03:49:20 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>lidaibin</lj:journal>
  <lj:journalid>10733742</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/59296003/10733742</url>
    <title>超越无限的blog</title>
    <link>http://lidaibin.livejournal.com/</link>
    <width>96</width>
    <height>96</height>
  </image>

<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/15070.html</guid>
  <pubDate>Wed, 26 Dec 2007 03:49:20 GMT</pubDate>
  <title>在Gentoo上构建windows交叉编译环境</title>
  <link>http://lidaibin.livejournal.com/15070.html</link>
  <description>最近公司开发一款跨平台的产品，主要支持的平台包括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;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;开源软件大多数采用autotools来完成项目的自动构造，我们能不能利用autotools来方便地进行管理规模稍大的项目呢？答案是肯定的，今天上午为了测试交叉编译写了一个简单的win32 service，可以通过以下链接下载：&lt;a href=&quot;http://lidaibin.googlepages.com/SMQService-1.0.2.tar.bz2&quot;&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&apos;.&lt;br /&gt;See `config.log&apos; for more details.&lt;br /&gt;&lt;br /&gt;仔细看一下config.log即可看出configure会采用编译器编译一个测试程序并执行，在这儿会产生一个a.exe并直接执行，在linux直接执行exe文件如果不做点工作是不行的，直接执行a.exe报错configure也就停下了，告诉你&quot;cannot run C compiled programs&quot;，其实compiler工作得好好的，那么我们现在只要解决直接在linux下运行exe文件就可以让autotools顺利地工作了。&lt;br /&gt;&lt;br /&gt;其实要实现这个功能很简单，编译内核时注意选上Executable file formats-&amp;gt;Kernel support for MISC binaries，如果编译成模块modprobe binfmt_misc即可加载，然后给你的/etc/fstab里加上一行“none	/proc/sys/fs/binfmt_misc	binfmt_misc	defaults	0 0”，在系统引导完成之后执行&quot;echo &apos;:DOSWin:M::MZ::/usr/bin/wine:&apos; &amp;gt; /proc/sys/fs/binfmt_misc/register&quot;，在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&apos;&lt;br /&gt;make  all-am&lt;br /&gt;make[2]: Entering directory `/data/codes/test/win32service/src&apos;&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&apos;&lt;br /&gt;make[1]: Leaving directory `/data/codes/test/win32service/src&apos;&lt;br /&gt;make[1]: Entering directory `/data/codes/test/win32service&apos;&lt;br /&gt;make[1]: Nothing to be done for `all-am&apos;.&lt;br /&gt;make[1]: Leaving directory `/data/codes/test/win32service&apos;&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;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/15070.html</comments>
  <category>gcc</category>
  <category>windows</category>
  <category>gentoo</category>
  <category>crossdev</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/14642.html</guid>
  <pubDate>Thu, 26 Jul 2007 02:18:25 GMT</pubDate>
  <title>汇编学习之系统调用</title>
  <link>http://lidaibin.livejournal.com/14642.html</link>
  <description>最近工作比较闲散，因此抽空看了看汇编，基本上从头开始，看了前面几章不知不觉也学会了“Hello world”，刚好看的这本书基本上都是以GNU的开发工具为开发环境的，这比较适合我的兴趣。其实看的这几章也就只有一章(这一章还没看完^_^)才是汇编语言的基础，刚学会了点AT&amp;T的汇编语法，知道了跟Intel的汇编语法的区别，另外这一章用不同的方式实现了cpuid的调用，学会了如何调用系统调用以及如何调用C函数库中的函数。&lt;br /&gt;&lt;br /&gt;先看看下面通过系统调用实现的hello world代码：&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;.section&lt;/font&gt; .data
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;msg&lt;/b&gt;&lt;/font&gt;:
        &lt;font color=&quot;#fa8072&quot;&gt;.ascii&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Hello world!\n&quot;&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;.section&lt;/font&gt; .text

&lt;font color=&quot;#fa8072&quot;&gt;.globl&lt;/font&gt; _start

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;_start&lt;/b&gt;&lt;/font&gt;:
        &lt;font color=&quot;#fa8072&quot;&gt;movl&lt;/font&gt; $4, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%eax&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;movl&lt;/font&gt; $1, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%ebx&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;movl&lt;/font&gt; $msg, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%ecx&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;movl&lt;/font&gt; $13, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%edx&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;int&lt;/font&gt; $0x80
        &lt;font color=&quot;#fa8072&quot;&gt;movl&lt;/font&gt; $1, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%eax&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;movl&lt;/font&gt; $0, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%ebx&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;int&lt;/font&gt; $0x80
        &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=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;.section&lt;/font&gt; .data
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;output&lt;/b&gt;&lt;/font&gt;:
        &lt;font color=&quot;#fa8072&quot;&gt;.asciz&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Hello world!\n&quot;&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;.section&lt;/font&gt; .text

&lt;font color=&quot;#fa8072&quot;&gt;.globl&lt;/font&gt; _start

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;_start&lt;/b&gt;&lt;/font&gt;:
        &lt;font color=&quot;#fa8072&quot;&gt;pushl&lt;/font&gt; $output
        &lt;font color=&quot;#fa8072&quot;&gt;call&lt;/font&gt; printf
        &lt;font color=&quot;#fa8072&quot;&gt;addl&lt;/font&gt; $8, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;%esp&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#fa8072&quot;&gt;pushl&lt;/font&gt; $0
        &lt;font color=&quot;#fa8072&quot;&gt;call&lt;/font&gt; exit
        &lt;/pre&gt;&lt;br /&gt;这个例子相对来说看起来简单得多，将参数压入堆栈调用相应的函数即可，不过要注意的是：1、C函数需要调用的字符串参数必须以asciz声明，而不是ascii，这样才会给字符串后面加&apos;\0&apos;。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</description>
  <comments>http://lidaibin.livejournal.com/14642.html</comments>
  <category>linux</category>
  <category>asm</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/14510.html</guid>
  <pubDate>Wed, 11 Jul 2007 04:42:17 GMT</pubDate>
  <title>iptables端口映射</title>
  <link>http://lidaibin.livejournal.com/14510.html</link>
  <description>一个简单的应用：我的机器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 &amp;gt; /proc/sys/net/ipv4/ip_forward，最好连/etc/sysctl.conf里的net.ipv4.ip_forward=1一并加上。。。</description>
  <comments>http://lidaibin.livejournal.com/14510.html</comments>
  <category>linux</category>
  <category>iptables</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/14314.html</guid>
  <pubDate>Wed, 20 Jun 2007 16:25:39 GMT</pubDate>
  <title>关于inotify</title>
  <link>http://lidaibin.livejournal.com/14314.html</link>
  <description>inotify是什么？用它能干些什么？这个问题我们还是首先从内核的文档开始吧－－Documentation/filesystems/inotify.txt(说点题外话，内核文档虽然是没有任何格式的txt文档，给人的感觉却非常好，而且作者总是以最精炼的语言清楚地描述了相关的内容): a powerful yet simple file change notification system，通俗点说它是一个内核用于通知用户空间客户程序文件系统变化的系统，并且它是powerful yet simple的。&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&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=&quot;font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;unistd.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/select.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;errno.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/inotify.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;_inotify_event_handler&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;event&lt;/b&gt;&lt;/font&gt;)
{
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;event-&amp;gt;mask: 0x%08x\n&quot;&lt;/font&gt;, event-&amp;gt;mask);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;event-&amp;gt;name: %s\n&quot;&lt;/font&gt;, event-&amp;gt;name);
}

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)
{
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (argc != 2) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Usage: %s &amp;lt;file/dir&amp;gt;\n&quot;&lt;/font&gt;, argv[0]);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[1024] = {0};
  &lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;event&lt;/b&gt;&lt;/font&gt; = {0};
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;fd&lt;/b&gt;&lt;/font&gt; = inotify_init();
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;wd&lt;/b&gt;&lt;/font&gt; = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS);

  &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt; (;;) {
    &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;fd_set&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;fds&lt;/b&gt;&lt;/font&gt;;
    FD_ZERO(&amp;amp;fds);
    FD_SET(fd, &amp;amp;fds);
    &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (select(fd + 1, &amp;amp;fds, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;) &amp;gt; 0) {
      &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;len&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;index&lt;/b&gt;&lt;/font&gt; = 0;
      &lt;font color=&quot;#fa8072&quot;&gt;while&lt;/font&gt; (((len = read(fd, &amp;amp;buf, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(buf))) &amp;lt; 0) &amp;amp;&amp;amp; (errno == EINTR));
      &lt;font color=&quot;#fa8072&quot;&gt;while&lt;/font&gt; (index &amp;lt; len) {
        event = (&lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt; *)(buf + index);
        _inotify_event_handler(event);
        index += &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(&lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;inotify_event&lt;/b&gt;&lt;/font&gt;) + event-&amp;gt;len;
      }
    }
  }

  inotify_rm_watch(fd, wd);

  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 0;
}
&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-&amp;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&apos;s than are feasible to manage, and more fd&apos;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&apos;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&apos;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;     &quot;mv a b ; mv b a&quot; events without ordering.&lt;br /&gt;&lt;br /&gt;   - We&apos;d have to maintain n fd&apos;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&apos;d want&lt;br /&gt;     to manage and block on 1000 fd&apos;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&apos;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;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/14314.html</comments>
  <category>inotify</category>
  <category>linux</category>
  <category>c/c++</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/13899.html</guid>
  <pubDate>Thu, 14 Jun 2007 07:55:14 GMT</pubDate>
  <title>rs422在linux下跟我开了个玩笑</title>
  <link>http://lidaibin.livejournal.com/13899.html</link>
  <description>很久没有更新blog了，就跟抽烟一样，如果长时间不抽的话也就不想抽了，看来这是一个不好的现象，不过长时间的沉默也说明了自己这段时间在技术没有什么积累。罢了，今天的blog就记录这段时间来比较郁闷的事情。&lt;br /&gt;&lt;br /&gt;这个项目的开发就像当年初中的长跑一样，前几圈劲头十足信心满怀，接下来的情况我想大部分人跟我一样，慢慢地感觉有点累，再后来压力越来越大，越来越感觉大脑缺氧呼吸困难，到后来已经身心疲累。人这一生从出生开始就背负了责任，要么为责任活着要么超越责任为理想活着，所以有人活得辛苦而无趣，有人轻松而超然。有点跑题了，还是说一下前几天遇到的技术问题。&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;客户方有一外部设备是N年前购买的，一直用于原来的系统中，这次需要在本项目中使用此外设，关于这个外设的文档早已缺失，唯一可以参考的就是一个windows下的动态链接库源代码（不过这也是最重要的参考资料，候大侠一本书上不是也说“源码面前了无秘密”嘛），于是参考此代码写了一个windows下的测试程序很顺利地测试通过，测试代码如下：&lt;br /&gt;&lt;pre style=&quot;font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;windows.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)
{
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;HANDLE&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;h_com&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;addr&lt;/b&gt;&lt;/font&gt; = 0x01;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[10];
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;DCB&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;dcb&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;COMMTIMEOUTS&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;timeouts&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;DWORD&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;n&lt;/b&gt;&lt;/font&gt;;

  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (argc != 2) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;%s &amp;lt;comdev&amp;gt;\n&quot;&lt;/font&gt;, argv[0]);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  h_com = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
                     0, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;, OPEN_EXISTING, 0, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;);
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (h_com == INVALID_HANDLE_VALUE) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Initialize COM device failed\n&quot;&lt;/font&gt;);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  GetCommState(h_com, &amp;amp;dcb);
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = MARKPARITY;
  dcb.StopBits = ONESTOPBIT;
  SetCommState(h_com, &amp;amp;dcb);

  GetCommTimeouts(h_com, &amp;amp;timeouts);
  timeouts.ReadTotalTimeoutConstant = 10;
  SetCommTimeouts(h_com, &amp;amp;timeouts);

  WriteFile(h_com, &amp;amp;addr, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(addr), &amp;amp;n, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;);

  Sleep(1);
  dcb.Parity = SPACEPARITY;
  SetCommState(h_com, &amp;amp;dcb);
  memcpy(buf, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;\x02\x85\x83\04&quot;&lt;/font&gt;, 4);
  WriteFile(h_com, buf, 4, &amp;amp;n, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;);

  Sleep(2);
  ReadFile(h_com, buf, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(buf), &amp;amp;n, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;read %d bytes\n&quot;&lt;/font&gt;, n);

  &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt; (i = 0; i &amp;lt; n; ++i)
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;%02x &quot;&lt;/font&gt;, buf[i]);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;\n&quot;&lt;/font&gt;);

  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 0;
}
&lt;/pre&gt;&lt;br /&gt;由此代码可以看出通信过程大概是这样的：将串口设置为8M1发送地址，然后将串口设置更改为8S1发送请求数据，再然后接收数据，看起来还是很简单的。接下来很快地写好了linux下的测试程序，源代码如下：&lt;br /&gt;&lt;pre style=&quot;font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;unistd.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/types.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;fcntl.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;termios.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)
{
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (argc != 2) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Usage: %s &amp;lt;comdev&amp;gt;\n&quot;&lt;/font&gt;, argv[0]);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;fd&lt;/b&gt;&lt;/font&gt; = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (fd == -1) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Initialize COM device failed.\n&quot;&lt;/font&gt;);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  &lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;termios&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;options&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (tcgetattr(fd, &amp;amp;options) == -1)
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;

  cfsetispeed(&amp;amp;options, B9600);
  cfsetospeed(&amp;amp;options, B9600);

  options.c_cflag &amp;amp;= ~CSIZE;
  options.c_cflag |= CS8 | CLOCAL | CREAD | CMSPAR | PARODD;
  options.c_cflag &amp;amp;= CSTOPB;
  options.c_iflag |= INPCK;
  options.c_iflag &amp;amp;= ~(IXON | IXOFF | IXANY);
  options.c_oflag &amp;amp;= ~OPOST;
  options.c_lflag &amp;amp;= ~(ECHO | ECHOE | ICANON | ISIG);
  tcflush(fd, TCIFLUSH);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;tcsetattr result: %d\n&quot;&lt;/font&gt;, tcsetattr(fd, TCSANOW, &amp;amp;options));

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;addr&lt;/b&gt;&lt;/font&gt; = 0x01;
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (write(fd, &amp;amp;addr, 1) == -1)
    &lt;font color=&quot;#fa8072&quot;&gt;goto&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;failed&lt;/font&gt;;

  usleep(1000);

  options.c_cflag &amp;amp;= ~PARODD;
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;tcsetattr result: %d\n&quot;&lt;/font&gt;, tcsetattr(fd, TCSADRAIN, &amp;amp;options));

  usleep(1000);

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[10];
  memcpy(buf, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;\x02\x85\x83\x04&quot;&lt;/font&gt;, 4);

  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (write(fd, buf, 4) == -1)
    &lt;font color=&quot;#fa8072&quot;&gt;goto&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;failed&lt;/font&gt;;

  usleep(10000);

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;read_n&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;
  read_n = read(fd, buf, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(buf));
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;result: %d\n&quot;&lt;/font&gt;, read_n);
  &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt; (i = 0; i &amp;lt; read_n; ++i)
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;%02X &quot;&lt;/font&gt;, buf[i]);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;\n&quot;&lt;/font&gt;);

  close(fd);
  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 0;

 &lt;font color=&quot;#7fffd4&quot;&gt;failed&lt;/font&gt;:
  close(fd);
  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
}
&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=&quot;font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;unistd.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/types.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;sys/ioctl.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;fcntl.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;termios.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argc&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;argv&lt;/b&gt;&lt;/font&gt;)
{
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (argc != 2) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Usage: %s &amp;lt;comdev&amp;gt;\n&quot;&lt;/font&gt;, argv[0]);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;fd&lt;/b&gt;&lt;/font&gt; = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (fd == -1) {
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Initialize COM device failed.\n&quot;&lt;/font&gt;);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
  }

  &lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;termios&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;options&lt;/b&gt;&lt;/font&gt;;

  memset(&amp;amp;options, 0, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(options));

  cfsetispeed(&amp;amp;options, B9600);
  cfsetospeed(&amp;amp;options, B9600);

  options.c_cflag = CS8 | CLOCAL | CREAD | CSTOPB | CMSPAR;
  options.c_iflag = INPCK;
  options.c_oflag = 0;
  options.c_lflag = 0;
  tcflush(fd, TCIFLUSH);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;tcsetattr result: %d\n&quot;&lt;/font&gt;, tcsetattr(fd, TCSANOW, &amp;amp;options));

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;addr&lt;/b&gt;&lt;/font&gt; = 0x01;
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (write(fd, &amp;amp;addr, 1) == -1)
    &lt;font color=&quot;#fa8072&quot;&gt;goto&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;failed&lt;/font&gt;;

  usleep(1000);

  options.c_cflag |= PARENB | PARODD;
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;tcsetattr result: %d\n&quot;&lt;/font&gt;, tcsetattr(fd, TCSADRAIN, &amp;amp;options));

  usleep(1000);

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[10];
  memcpy(buf, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;\x02\x85\x83\x04&quot;&lt;/font&gt;, 4);

  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (write(fd, buf, 4) == -1)
    &lt;font color=&quot;#fa8072&quot;&gt;goto&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;failed&lt;/font&gt;;

  usleep(10000);

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;read_n&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;
  read_n = read(fd, buf, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(buf));
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;result: %d\n&quot;&lt;/font&gt;, read_n);
  &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt; (i = 0; i &amp;lt; read_n; ++i)
    printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;%02X &quot;&lt;/font&gt;, buf[i]);
  printf(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;\n&quot;&lt;/font&gt;);

  close(fd);
  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 0;

 &lt;font color=&quot;#7fffd4&quot;&gt;failed&lt;/font&gt;:
  close(fd);
  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; -1;
}
&lt;/pre&gt;&lt;br /&gt;想不到抛开CMSPAR不算8M1看起来是8N2，而8S1则看起来是8O2。。。</description>
  <comments>http://lidaibin.livejournal.com/13899.html</comments>
  <category>linux</category>
  <category>c/c++</category>
  <category>rs422</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/13786.html</guid>
  <pubDate>Sat, 14 Apr 2007 19:24:05 GMT</pubDate>
  <title>C代码中如何得到python脚本异常时的traceback信息</title>
  <link>http://lidaibin.livejournal.com/13786.html</link>
  <description>在软件项目的开发过程中，我们总是试图让程序能够适应更多的应用环境以及业务流程，不管你对于需求的了解如何准确，也不管你做了有多么充分的估计，但有很多情况仍然让你无法应付，比如：需求是会变化的；维护项目的人不一定都能用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=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;Python.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;compile.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;frameobject.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;traceback.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;process_python_exception&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;)
{
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;buf&lt;/b&gt;&lt;/font&gt;[512], *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;buf_p&lt;/b&gt;&lt;/font&gt; = buf;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;type_obj&lt;/b&gt;&lt;/font&gt;, *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;value_obj&lt;/b&gt;&lt;/font&gt;, *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;traceback_obj&lt;/b&gt;&lt;/font&gt;;
  PyErr_Fetch(&amp;amp;type_obj, &amp;amp;value_obj, &amp;amp;traceback_obj);
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (value_obj == &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;)
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt;;

  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (!PyString_Check(value_obj))
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt;;

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;value&lt;/b&gt;&lt;/font&gt; = PyString_AsString(value_obj);
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;szbuf&lt;/b&gt;&lt;/font&gt; = &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(buf);
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;l&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;PyCodeObject&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;codeobj&lt;/b&gt;&lt;/font&gt;;

  l = snprintf(buf_p, szbuf, _(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Error Message:\n%s&quot;&lt;/font&gt;), value);
  buf_p += l;
  szbuf -= l;

  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; (traceback_obj != &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;) {
    l = snprintf(buf_p, szbuf, _(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;\n\nTraceback:\n&quot;&lt;/font&gt;));
    buf_p += l;
    szbuf -= l;

    &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;PyTracebackObject&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;traceback&lt;/b&gt;&lt;/font&gt; = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;PyTracebackObject&lt;/b&gt;&lt;/font&gt; *)traceback_obj;
    &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt; (;traceback &amp;amp;&amp;amp; szbuf &amp;gt; 0; traceback = traceback-&amp;gt;tb_next) {
      codeobj = traceback-&amp;gt;tb_frame-&amp;gt;f_code;
      l = snprintf(buf_p, szbuf, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;%s: %s(# %d)\n&quot;&lt;/font&gt;,
                   PyString_AsString(codeobj-&amp;gt;co_name),
                   PyString_AsString(codeobj-&amp;gt;co_filename),
                   traceback-&amp;gt;tb_lineno);
      buf_p += l;
      szbuf -= l;
    }
  }

  message_error_dialog_show(buf);

  Py_XDECREF(type_obj);
  Py_XDECREF(value_obj);
  Py_XDECREF(traceback_obj);
}
&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就是出错的行号，有了这些数据我们调试还有困难吗？</description>
  <comments>http://lidaibin.livejournal.com/13786.html</comments>
  <category>linux</category>
  <category>c/c++</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/13439.html</guid>
  <pubDate>Fri, 30 Mar 2007 02:20:46 GMT</pubDate>
  <title>基于OpenGL开发的发行版</title>
  <link>http://lidaibin.livejournal.com/13439.html</link>
  <description>发行版：&lt;a href=&quot;http://one.xthost.info/zelko/opengl.html&quot; target=&quot;_blank&quot;&gt;Linux based OpenGL development system without X&lt;/a&gt;&lt;br /&gt;书籍：&lt;a href=&quot;http://sp4br75.digiweb.psi.br/TRB_ogl/&quot; target=&quot;_blank&quot;&gt;OpenGL Red Book&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;备忘帖。。。。。。。。^_^</description>
  <comments>http://lidaibin.livejournal.com/13439.html</comments>
  <category>opengl</category>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/13073.html</guid>
  <pubDate>Thu, 29 Mar 2007 08:31:20 GMT</pubDate>
  <title>生死边缘的轮回 - reiserfs文件系统的数据恢复</title>
  <link>http://lidaibin.livejournal.com/13073.html</link>
  <description>昨天晚上给客户一个应用定制裁减linux系统的时候，发生了一件非常不幸的事，我的data目录被我无意给rm -rf删除掉了，那里面存放着我的所有项目的代码和文档，还有很多其它重要的东西。看见那个目录突然什么都没有的时候那种感觉简直无法形容，由于长期出差一直没有机会给公司保留备份，还好今天恢复了大部分重要的文档和代码。希望跟我一样倒霉的朋友能以此为鉴，删除文件时一定要小心，并且经常备份重要的代码和文档。&lt;br&gt;&lt;br&gt;网上有两篇文章对reiserfs文件系统的数据恢复做了详细的介绍，&lt;a href=&quot;http://antrix.net/journal/techtalk/reiserfs_data_recovery_howto.comments?parent=23&amp;amp;title=Re:%20ReiserFS%20undelete/data%20recovery%20HOWTO&quot; target=&quot;_blank&quot;&gt;ReiserFS undelete/data recovery HOWTO&lt;/a&gt;和&lt;a href=&quot;http://martian.org/marty/2003/09/05/reiserfs-filesystem-recovery&quot; target=&quot;_blank&quot;&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分钟，并且最终重要的数据基本上都得以恢复！</description>
  <comments>http://lidaibin.livejournal.com/13073.html</comments>
  <category>linux</category>
  <category>reiserfs</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/13030.html</guid>
  <pubDate>Sat, 17 Mar 2007 13:24:03 GMT</pubDate>
  <title>beryl/compiz的ontop补丁</title>
  <link>http://lidaibin.livejournal.com/13030.html</link>
  <description>用beryl/compiz的时候有个比较遗憾的地方，那就是窗口没有了ontop功能，也就是窗口置顶，不过给libwnck打上补丁就可以解决这个问题了。&lt;br /&gt;&lt;br /&gt;补丁地址：&lt;a href=&quot;http://www.compiz.info/patches/libwnck/&quot;&gt;libwnck补丁&lt;/a&gt;</description>
  <comments>http://lidaibin.livejournal.com/13030.html</comments>
  <category>linux</category>
  <category>gentoo</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/12636.html</guid>
  <pubDate>Mon, 12 Mar 2007 07:05:19 GMT</pubDate>
  <title>GtkScrolledWindow滚动条问题</title>
  <link>http://lidaibin.livejournal.com/12636.html</link>
  <description>在使用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的频率。</description>
  <comments>http://lidaibin.livejournal.com/12636.html</comments>
  <category>gtk+</category>
  <category>linux</category>
  <category>c/c++</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/12390.html</guid>
  <pubDate>Sun, 11 Mar 2007 15:21:51 GMT</pubDate>
  <title>强悍的回复帖</title>
  <link>http://lidaibin.livejournal.com/12390.html</link>
  <description>从CSDN主页上偶尔看到了一篇帖子，于是进去看了一下，&lt;a href=&quot;http://topic.csdn.net/t/20050308/15/3834281.html&quot;&gt;十年MFC经历认识的Microsoft技术&lt;/a&gt;，楼主的行文风格不错，于是耐心地看了下去，一来觉得楼主知识系统全面值得学习，二来楼主的文字功底也颇为深厚，这种散文式的技术帖即使用来消遣也不错。不过没想到的是后来的一个回复帖真的让我捧腹大笑久久不能平静^_^。。。&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;逐句地看完这个帖子以后，我的心久久不能平静，震撼啊！为什么会有如此好的帖子！我纵横网络bbs多年，自以为再也不会有任何帖子能打动我，没想到今天看到了如此精妙绝伦的这样一篇帖子。楼主，是你让我深深地理解了‘人外有人，天外有天’这句话。谢谢侬！在看完这帖子以后，我没有立即回复，因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子。但是我还是回复了，因为觉得如果不能在如此精彩的帖子后面留下自己的网名，那我死也不会瞑目的！能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊！    &lt;br /&gt;   &lt;br /&gt;楼主，请原谅我的自私！我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的，都是虚伪的，所以我只想说一句：您的帖子太好看了！我愿意一辈子的看下去！这篇帖子构思新颖，题材独具匠心，段落清晰，情节诡异，跌宕起伏，主线分明，引人入胜，平淡中显示出不凡的文学功底，可谓是字字珠玑，句句经典，是我辈应当学习之典范。就小说艺术的角度而言，这篇帖子不算太成功，但它的实验意义却远远大于成功本身。正所谓：“一马奔腾，射雕引弓，天地都在我心中！”楼主真不愧为无厘界新一代的开山怪！&lt;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/12390.html</comments>
  <category>other</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/12056.html</guid>
  <pubDate>Fri, 09 Mar 2007 16:01:27 GMT</pubDate>
  <title>python嵌入与扩展的入门级FAQ</title>
  <link>http://lidaibin.livejournal.com/12056.html</link>
  <description>以下是我在开发一个应用中集成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(&quot;path&quot;)得到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来代替。</description>
  <comments>http://lidaibin.livejournal.com/12056.html</comments>
  <category>linux</category>
  <category>c/c++</category>
  <category>python</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/11873.html</guid>
  <pubDate>Fri, 09 Mar 2007 15:10:17 GMT</pubDate>
  <title>gtk+开发中的几个小经验</title>
  <link>http://lidaibin.livejournal.com/11873.html</link>
  <description>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, &quot;xalign&quot;, 1.0, NULL)来达到居右的效果。&lt;br /&gt;&lt;br /&gt;3、使用g_idle_add及g_timeout_add等函数中的时候一定要小心，由于代码延后执行，因此一定要保证其数据的生命周期，如下面的例子是我在开发一个项目应用中遇到的问题(注释掉的代码即为出现问题之后的修正代码)，传递的Python对象到代码执行的时候已经被释放掉了，因此出现了比较奇怪的现象：如果连续调用这个函数两次，结果加进去的两行信息全部都是最后一次的数据，当然可能还会有更奇特的现象发生。&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre style=&quot;font-size: 12px; color: rgb(245, 222, 179); background-color: rgb(47, 79, 79);&quot;&gt;&lt;span style=&quot;color:#fa8072;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;gboolean&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;_etc_main_win_add_trans&lt;/b&gt;&lt;/span&gt;(&lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;gpointer&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;data&lt;/b&gt;&lt;/span&gt;)
{
 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;args&lt;/b&gt;&lt;/span&gt; = data;
 &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyTuple_Size(args) != lv_columns)
   &lt;span style=&quot;color:#fa8072;&quot;&gt;return&lt;/span&gt; FALSE;

 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;GtkWidget&lt;/b&gt;&lt;/span&gt; *&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;listview&lt;/b&gt;&lt;/span&gt;;
 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;GtkTreeModel&lt;/b&gt;&lt;/span&gt; *&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;model&lt;/b&gt;&lt;/span&gt;;
 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;GtkTreeIter&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;iter&lt;/b&gt;&lt;/span&gt;;
 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/span&gt;;
 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;GValue&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;value&lt;/b&gt;&lt;/span&gt;;
 &lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;obj&lt;/b&gt;&lt;/span&gt;;

 listview = GTK_WIDGET(g_object_get_data(G_OBJECT(main_window), &lt;span style=&quot;color:#ffa07a;&quot;&gt;&quot;trans_list&quot;&lt;/span&gt;));
 model = gtk_tree_view_get_model(GTK_TREE_VIEW(listview));
 gtk_list_store_append(GTK_LIST_STORE(model), &amp;amp;iter);
 &lt;span style=&quot;color:#fa8072;&quot;&gt;for&lt;/span&gt; (i = 0; i &amp;lt; lv_columns; ++i) {
   memset(&amp;value, 0, &lt;span style=&quot;color:#fa8072;&quot;&gt;sizeof&lt;/span&gt;(value));
   g_value_init(&amp;value, lv_types[i]);
   obj = PyTuple_GetItem(args, i);
   &lt;span style=&quot;color:#fa8072;&quot;&gt;switch&lt;/span&gt;(lv_types[i]) {
   &lt;span style=&quot;color:#fa8072;&quot;&gt;case&lt;/span&gt; G_TYPE_INT:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyInt_Check(obj))
       g_value_set_int(&amp;value, PyInt_AsLong(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;

   &lt;span style=&quot;color:#fa8072;&quot;&gt;case&lt;/span&gt; G_TYPE_LONG:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyLong_Check(obj))
       g_value_set_long(&amp;value, PyLong_AsLong(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;

   &lt;span style=&quot;color:#fa8072;&quot;&gt;case&lt;/span&gt; G_TYPE_UINT:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyLong_Check(obj))
       g_value_set_uint(&amp;value, PyLong_AsUnsignedLong(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;

   &lt;span style=&quot;color:#fa8072;&quot;&gt;case&lt;/span&gt; G_TYPE_ULONG:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyLong_Check(obj))
       g_value_set_ulong(&amp;value, PyLong_AsUnsignedLong(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;

   &lt;span style=&quot;color:#fa8072;&quot;&gt;case&lt;/span&gt; G_TYPE_FLOAT:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyFloat_Check(obj))
       g_value_set_float(&amp;value, PyFloat_AsDouble(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;

   &lt;span style=&quot;color:#fa8072;&quot;&gt;case&lt;/span&gt; G_TYPE_DOUBLE:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyFloat_Check(obj))
       g_value_set_double(&amp;value, PyFloat_AsDouble(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;

   &lt;span style=&quot;color:#fa8072;&quot;&gt;default&lt;/span&gt;:
     &lt;span style=&quot;color:#fa8072;&quot;&gt;if&lt;/span&gt; (PyString_Check(obj))
       g_value_set_string(&amp;value, PyString_AsString(obj));
     &lt;span style=&quot;color:#fa8072;&quot;&gt;break&lt;/span&gt;;
   }
   gtk_list_store_set_value(GTK_LIST_STORE(model), &amp;amp;iter, i, &amp;value);
 }

 &lt;span style=&quot;color:#add8e6;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#add8e6;&quot;&gt;Py_XDECREF(args);
&lt;/span&gt;  &lt;span style=&quot;color:#fa8072;&quot;&gt;return&lt;/span&gt; FALSE;
}

&lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;etc_main_win_add_trans&lt;/b&gt;&lt;/span&gt;(&lt;span style=&quot;color:#9acd32;&quot;&gt;&lt;b&gt;PyObject&lt;/b&gt;&lt;/span&gt; *&lt;span style=&quot;color:#7fffd4;&quot;&gt;&lt;b&gt;args&lt;/b&gt;&lt;/span&gt;)
{
 &lt;span style=&quot;color:#add8e6;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color:#add8e6;&quot;&gt;Py_INCREF(args);
&lt;/span&gt;  g_idle_add(_etc_main_win_add_trans, args);
}&lt;/pre&gt;&lt;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/11873.html</comments>
  <category>linux</category>
  <category>c/c++</category>
  <category>python</category>
  <category>gtk</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/11638.html</guid>
  <pubDate>Thu, 01 Mar 2007 03:34:41 GMT</pubDate>
  <title>Linux视频转换: mencoder</title>
  <link>http://lidaibin.livejournal.com/11638.html</link>
  <description>在网上发现一篇讲解利用mplayer的mencoder转换视频的文章，刚好适用我简陋的mp4转贴一下^_^，原文网址：&lt;a href=&quot;http://bbs.lupaworld.com/htm_data/253/0611/24711.html&quot;&gt;Linux下的视频转换&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;制作适合在智能手机和PDA上观看的mpeg4视频。&lt;br /&gt;Linux上有一个很强大的视频音频转换软件，就是Mplayer自带的mencoder (MPlayer&apos;s Movie Encoder)。mencoder就象是一台全手动的照相机，可调整的选项非常多，不过这儿只是把最常见的情况说一下。&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&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=&amp;lt;0-4&amp;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=&amp;lt;0-1024&amp;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;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/11638.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/11341.html</guid>
  <pubDate>Thu, 22 Feb 2007 17:39:46 GMT</pubDate>
  <title>linux下最好的10款免费游戏</title>
  <link>http://lidaibin.livejournal.com/11341.html</link>
  <description>1、&lt;a href=&quot;http://www.wesnoth.org/&quot;&gt;Battle for Wesnoth&lt;/a&gt;&lt;br /&gt;2、&lt;a href=&quot;http://www.frozen-bubble.org/&quot;&gt;Frozen Bubble&lt;/a&gt;&lt;br /&gt;3、&lt;a href=&quot;http://www.enemyterritory.com/&quot;&gt;Enemy Territory&lt;/a&gt;&lt;br /&gt;4、&lt;a href=&quot;http://www.alientrap.org/nexuiz&quot;&gt;Nexuiz&lt;/a&gt;&lt;br /&gt;5、&lt;a href=&quot;http://www.icculus.org/neverball&quot;&gt;Neverball &amp;amp; Neverputt&lt;/a&gt;&lt;br /&gt;6、&lt;a href=&quot;http://pingus.seul.org/&quot;&gt;Pingus&lt;/a&gt;&lt;br /&gt;7、&lt;a href=&quot;http://pingus.seul.org/&quot;&gt;Cube 2&lt;/a&gt;&lt;br /&gt;8、&lt;a href=&quot;http://armagetronad.net/&quot;&gt;Amagetron Advanced&lt;/a&gt;&lt;br /&gt;9、&lt;a href=&quot;http://www.americasarmy.com/&quot;&gt;Americas Army&lt;/a&gt;&lt;br /&gt;10、&lt;a href=&quot;http://super-tux.sourceforge.net&quot;&gt;SuperTux&lt;/a&gt;</description>
  <comments>http://lidaibin.livejournal.com/11341.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/11006.html</guid>
  <pubDate>Thu, 01 Feb 2007 01:07:32 GMT</pubDate>
  <title>gparted惹的祸</title>
  <link>http://lidaibin.livejournal.com/11006.html</link>
  <description>已经有接近一个月了无法享受U盘、移动硬盘插入时自动挂载的功能了，这段时间里一直非常郁闷，不知道为什么就成这样了，心想着可能是当前我的hal、dbus或gnome-volume-manager或gnome-mount之类的软件有问题吧，抱着侥幸的心理一直在等待新版本中是否可以解决这个问题，可是升了几次级也不见得有什么好转，尝试过无数次都以失望告终。。。&lt;br /&gt;&lt;br /&gt;昨晚进/usr/share/hal/fdi/policy目录看了一下，差点当场晕倒，原来前段时间使用gparted产生了一个gparted-disable-automount.fdi，qfile了一下这个文件不属于任何一个包，看来是gparted产生的啦，为了在管理分区的时候禁止自动挂载让我痛苦这么久着实也太BT了。。。</description>
  <comments>http://lidaibin.livejournal.com/11006.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/10532.html</guid>
  <pubDate>Thu, 04 Jan 2007 04:10:31 GMT</pubDate>
  <title>如何方便控制笔记本的触摸板</title>
  <link>http://lidaibin.livejournal.com/10532.html</link>
  <description>笔记本的鼠标触摸板我基本上很少用，比起外接鼠标还是没那么方便灵活，何况写程序的时候基本上很少用鼠标，但是笔记本的触摸板却在写程序的时候经常搞得鼠标指针胡乱飘移，非常影响键盘输入的准确性。&lt;br /&gt;&lt;br /&gt;在linux下控制触摸板必须得使用2.6.x内核，大致有几件事要做：正确配置内核、安装synaptics驱动、正确配置xorg.conf。&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;1、配置内核&lt;br /&gt;&lt;table style=&quot;border: 4px solid rgb(112, 112, 255); background-color: rgb(250, 235, 215);&quot; width=&quot;75%&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td style=&quot;border: 1px solid rgb(0, 0, 255); background-color: rgb(112, 112, 255); color: rgb(255, 255, 255);&quot;&gt; &lt;font size=&quot;-1&quot;&gt;Linux Kernel Configuration: Enable synaptics support&lt;/font&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device Drivers ---&amp;gt;&lt;br /&gt;&lt;pre&gt;   Input Device Support ---&amp;gt;
       &amp;lt;*&amp;gt; Event Interface
       [*] Mouse ---&amp;gt;

               &amp;lt;*&amp;gt; PS/2 mouse
&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=&quot;font-size:12px;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#ffc0cb&quot;&gt;&lt;b&gt;/home/debianl $ &lt;/b&gt;&lt;/font&gt;cat /proc/bus/input/devices 
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name=&quot;AT Translated Set 2 keyboard&quot;
P: Phys=isa0060/serio0/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0 
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0011 Vendor=0002 Product=0007 Version=0000
N: Name=&quot;SynPS/2 Synaptics TouchPad&quot;
P: Phys=isa0060/serio4/input0
S: Sysfs=/class/input/input1
H: Handlers=mouse0 event1 
B: EV=b
B: KEY=6420 0 70000 0 0 0 0 0 0 0 0
B: ABS=11000003

I: Bus=0003 Vendor=046d Product=c016 Version=0340
N: Name=&quot;Logitech Optical USB Mouse&quot;
P: Phys=usb-0000:00:1d.1-1/input0
S: Sysfs=/class/input/input2
H: Handlers=mouse1 event2 
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
&lt;/pre&gt;&lt;br /&gt;然后配置xorg.conf，加入TouchPad的Section内容，并在ServerLayout中加入InputDevice &quot;TouchPad&quot; &quot;AlwaysCore&quot;，以下是我的xorg.conf配置：&lt;br /&gt;&lt;pre style=&quot;font-size:12px;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;ServerLayout&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;X.org Configured&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Screen&lt;/b&gt;&lt;/font&gt;      0  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Screen0&quot;&lt;/font&gt; 0 0
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;InputDevice&lt;/b&gt;&lt;/font&gt;    &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Mouse0&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;CorePointer&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;InputDevice&lt;/b&gt;&lt;/font&gt;    &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Keyboard0&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;CoreKeyboard&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;InputDevice&lt;/b&gt;&lt;/font&gt;    &lt;font color=&quot;#ffa07a&quot;&gt;&quot;TouchPad&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;AlwaysCore&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Files&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;RgbPath&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/X11/rgb&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ModulePath&lt;/b&gt;&lt;/font&gt;   &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/lib/xorg/modules&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/data/fonts/&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/misc/&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/TTF/&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/OTF&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/Type1/&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/CID/&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/100dpi/&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;FontPath&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/usr/share/fonts/75dpi/&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Module&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;glx&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;extmod&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;xtrap&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;record&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;dbe&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;dri&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;freetype&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Load&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;type1&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;InputDevice&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Keyboard0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;kbd&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;InputDevice&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Mouse0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;mouse&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Protocol&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;auto&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Device&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/dev/input/mice&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;ZAxisMapping&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;4 5 6 7&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;InputDevice&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;TouchPad&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;synaptics&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Device&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;/dev/input/mouse0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Protocol&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;auto&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;SHMConfig&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;on&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Monitor&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;   &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Monitor0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;VendorName&lt;/b&gt;&lt;/font&gt;   &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Monitor Vendor&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ModelName&lt;/b&gt;&lt;/font&gt;    &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Monitor Model&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Device&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Card0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;nvidia&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;VendorName&lt;/b&gt;&lt;/font&gt;  &lt;font color=&quot;#ffa07a&quot;&gt;&quot;nVidia Corporation&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;BoardName&lt;/b&gt;&lt;/font&gt;   &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Unknown Board&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;BusID&lt;/b&gt;&lt;/font&gt;       &lt;font color=&quot;#ffa07a&quot;&gt;&quot;PCI:1:0:0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Accel&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;True&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;RenderAccel&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;True&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Screen&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Identifier&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Screen0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Device&lt;/b&gt;&lt;/font&gt;     &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Card0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Monitor&lt;/b&gt;&lt;/font&gt;    &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Monitor0&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;AddARGBGLXVisuals&quot;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;true&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Display&quot;&lt;/font&gt;
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     1
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Display&quot;&lt;/font&gt;
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     4
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Display&quot;&lt;/font&gt;
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     8
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Display&quot;&lt;/font&gt;
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     15
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Display&quot;&lt;/font&gt;
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     16
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SubSection&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Display&quot;&lt;/font&gt;
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Viewport&lt;/b&gt;&lt;/font&gt;   0 0
                &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/font&gt;     24
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSubSection&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Section&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Extensions&quot;&lt;/font&gt;
        &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;Option&lt;/b&gt;&lt;/font&gt;      &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Composite&quot;&lt;/font&gt;   &lt;font color=&quot;#ffa07a&quot;&gt;&quot;enable&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;EndSection&lt;/b&gt;&lt;/font&gt;
&lt;/pre&gt;&lt;br /&gt;现在你应该就可以使用synclient来配置各项参数了，也可以禁用触摸板，如果你用gnome的话可以安装一个gsynaptics，图形化的配置界面更易用点。&lt;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/10532.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/10355.html</guid>
  <pubDate>Fri, 13 Oct 2006 14:37:56 GMT</pubDate>
  <title>久违的Makefile</title>
  <link>http://lidaibin.livejournal.com/10355.html</link>
  <description>自从用了autotools很久不曾有过编写Makefile的经历了，这两天维护客户以前让别的公司给做的一个项目中的烂代码，写了个Makefile感觉挺不错。。。&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CC&lt;/b&gt;&lt;/font&gt; = g++

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;GTK_CFLAGS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;gdk-pixbuf-config --cflags)
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;GTK_LIBS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;gdk-pixbuf-config --libs) $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;pkg-config --libs gthread)

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;MYSQL_CFLAGS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;mysql_config --cflags)
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;MYSQL_LIBS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;mysql_config --libmysqld-libs)

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CFLAGS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;GTK_CFLAGS&lt;/b&gt;&lt;/font&gt;) $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;MYSQL_CFLAGS&lt;/b&gt;&lt;/font&gt;) -I/usr/include/lclibs -DMYSQL_EMBED -DETC_THREAD
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;LIBS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;GTK_LIBS&lt;/b&gt;&lt;/font&gt;) $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;MYSQL_LIBS&lt;/b&gt;&lt;/font&gt;) -L./libs -ldl -rdynamic -llclibs -ldsrc -lgts

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SRC_PATH&lt;/b&gt;&lt;/font&gt; = src
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJ_PATH&lt;/b&gt;&lt;/font&gt; = obj

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SOURCES&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;wildcard&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;$(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SRC_PATH&lt;/b&gt;&lt;/font&gt;)/*.c)
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJECTS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;patsubst&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;$(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SRC_PATH&lt;/b&gt;&lt;/font&gt;)/%.c, $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJ_PATH&lt;/b&gt;&lt;/font&gt;)/%.o, $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SOURCES&lt;/b&gt;&lt;/font&gt;))
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;DEPENDS&lt;/b&gt;&lt;/font&gt; = $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;patsubst&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;$(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SRC_PATH&lt;/b&gt;&lt;/font&gt;)/%.c, $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJ_PATH&lt;/b&gt;&lt;/font&gt;)/%.d, $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SOURCES&lt;/b&gt;&lt;/font&gt;))

all: hwetc

$(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;DEPENDS&lt;/b&gt;&lt;/font&gt;): $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJ_PATH&lt;/b&gt;&lt;/font&gt;)/%.d: $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SRC_PATH&lt;/b&gt;&lt;/font&gt;)/%.c
        $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CC&lt;/b&gt;&lt;/font&gt;) -MM $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CFLAGS&lt;/b&gt;&lt;/font&gt;) $&lt;font color=&quot;#7fffd4&quot;&gt;&amp;lt;&lt;/font&gt; &amp;gt; $&lt;font color=&quot;#7fffd4&quot;&gt;@&lt;/font&gt;; \
        sed -i &lt;font color=&quot;#ffa07a&quot;&gt;&apos;s,\(&lt;/font&gt;&lt;font color=&quot;#ffa07a&quot;&gt;$&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;*&lt;/font&gt;&lt;font color=&quot;#ffa07a&quot;&gt;\)\.o[ :]*,$(&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJ_PATH&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#ffa07a&quot;&gt;)/\1.o &lt;/font&gt;&lt;font color=&quot;#ffa07a&quot;&gt;$&lt;/font&gt;&lt;font color=&quot;#7fffd4&quot;&gt;@&lt;/font&gt;&lt;font color=&quot;#ffa07a&quot;&gt; : ,g&apos;&lt;/font&gt; $&lt;font color=&quot;#7fffd4&quot;&gt;@&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;include&lt;/font&gt; $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;DEPENDS&lt;/b&gt;&lt;/font&gt;)

hwetc: $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJECTS&lt;/b&gt;&lt;/font&gt;)
        $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CC&lt;/b&gt;&lt;/font&gt;) $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJECTS&lt;/b&gt;&lt;/font&gt;) $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;LIBS&lt;/b&gt;&lt;/font&gt;) -o $&lt;font color=&quot;#7fffd4&quot;&gt;@&lt;/font&gt;

$(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJECTS&lt;/b&gt;&lt;/font&gt;):
        $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CC&lt;/b&gt;&lt;/font&gt;) -c $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;CFLAGS&lt;/b&gt;&lt;/font&gt;) $&lt;font color=&quot;#7fffd4&quot;&gt;&amp;lt;&lt;/font&gt; -o $&lt;font color=&quot;#7fffd4&quot;&gt;@&lt;/font&gt;

.PHONY: clean
clean:
        rm -f hwetc $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;OBJECTS&lt;/b&gt;&lt;/font&gt;) $(&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;DEPENDS&lt;/b&gt;&lt;/font&gt;)
&lt;/pre&gt;&lt;br /&gt;ps: 之所以CC = g++是因为其中用到gts等C++写就的library，而且头文件里就包含有C++语法，因此将就着应付一下。。。</description>
  <comments>http://lidaibin.livejournal.com/10355.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/10097.html</guid>
  <pubDate>Sun, 08 Oct 2006 09:58:26 GMT</pubDate>
  <title>mysql关于字符集的配置</title>
  <link>http://lidaibin.livejournal.com/10097.html</link>
  <description>以前一个web项目采用mysql 4.0.28，公司大部分开发人员用的是windows，java程序里存取数据采用的是GBK编码，当时建库的时候也没有指定字符集编码，因此升级到4.1之后原来的程序取出来的数据中文全成了乱码，mysql 4.1变化比较大，要兼容原来的程序及数据库服务器端设置/etc/mysql/my.cnf须做以下修改：&lt;br /&gt;&lt;br /&gt;[mysqld]&lt;br /&gt;default-character-set = gbk&lt;br /&gt;skip-character-set-client-handshake</description>
  <comments>http://lidaibin.livejournal.com/10097.html</comments>
  <category>linux</category>
  <category>mysql</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/9965.html</guid>
  <pubDate>Thu, 05 Oct 2006 04:26:06 GMT</pubDate>
  <title>zenity列表对话框</title>
  <link>http://lidaibin.livejournal.com/9965.html</link>
  <description>&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
#&lt;font color=&quot;#add8e6&quot;&gt;!/bin/&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;sh&lt;/font&gt;&lt;font color=&quot;#add8e6&quot;&gt;
&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;title&lt;/b&gt;&lt;/font&gt;=&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Select the window manager&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;text&lt;/b&gt;&lt;/font&gt;=&lt;font color=&quot;#ffa07a&quot;&gt;&quot;Window Manager List&quot;&lt;/font&gt;
&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;rows&lt;/b&gt;&lt;/font&gt;=&lt;font color=&quot;#ffa07a&quot;&gt;&quot;TRUE compiz FALSE metacity&quot;&lt;/font&gt;

&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;result&lt;/b&gt;&lt;/font&gt;=&lt;font color=&quot;#fa8072&quot;&gt;`zenity --list --radiolist --title &quot;$title&quot; --text &quot;$text&quot; --column &quot;&quot;  --column &quot;WM&quot; $rows`&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt; [ &lt;font color=&quot;#ffa07a&quot;&gt;&quot;$result&quot;&lt;/font&gt; == &lt;font color=&quot;#ffa07a&quot;&gt;&quot;compiz&quot;&lt;/font&gt; ]
&lt;font color=&quot;#fa8072&quot;&gt;then&lt;/font&gt;
  compiz-aiglx
&lt;font color=&quot;#fa8072&quot;&gt;elif&lt;/font&gt; [ &lt;font color=&quot;#ffa07a&quot;&gt;&quot;$result&quot;&lt;/font&gt; == &lt;font color=&quot;#ffa07a&quot;&gt;&quot;metacity&quot;&lt;/font&gt; ]
&lt;font color=&quot;#fa8072&quot;&gt;then&lt;/font&gt;
  metacity --replace
&lt;font color=&quot;#fa8072&quot;&gt;fi&lt;/font&gt;
&lt;/pre&gt;&lt;br /&gt;运行效果如下：&lt;br /&gt;&lt;img src=&quot;&quot; width=&quot;310&quot; height=&quot;225&quot; /&gt;</description>
  <comments>http://lidaibin.livejournal.com/9965.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/9476.html</guid>
  <pubDate>Fri, 22 Sep 2006 08:28:34 GMT</pubDate>
  <title>how to hack gentoo livecd</title>
  <link>http://lidaibin.livejournal.com/9476.html</link>
  <description>下午花了半个多小时hack了一把gentoo livecd 2006.1，给一个项目裁减好的linux系统制作安装光盘，省了不少时间，gentoo的livecd里关键的就两个文件：image.squashfs和isolinux/gentoo.igz，前者基本上就是一个完整的gentoo base system，后者是一个initramfs，临时的根文件系统，用于加载光盘并让前者正确地接管系统，下面开始说正题吧。。。&lt;br /&gt;&lt;br /&gt;1、挂载光盘文件mount -o loop /data/soft/livecd/livecd.iso /mnt/cdrom，/mnt/cdrom下现在就是livecd光盘的完整内容。另外建立一个目录/mnt/mycd把光盘里的文件全部复制过来用于制作光盘。&lt;br /&gt;&lt;br /&gt;2、挂载image.squashfs：mount -o loop /mnt/cdrom/image.squashfs /mnt/gentoo(需要你的内核支持squashfs文件系统)，全部复制到另一个目录进行hack吧，复制的时候记得加上-pr参数。这个是重头戏，进去好好研究研究，放手去修改配置添加东西吧，你甚至可以把你的开发环境、portage等等全搞进去。搞好了直接mksquashfs * /mnt/mycd/image.squashfs就可以了，不过在mksquashfs之前你得把原文件删掉。&lt;br /&gt;&lt;br /&gt;3、复制isolinux/gentoo.igz到你另外一个目录，mv gentoo.igz gentoo.gz &amp;&amp; gunzip gentoo.gz，然后正确地解压gentoo文件，得到一个简单的临时用根文件系统，下面这个脚本可以很方便地进行解压，用下面的脚本./unigz.sh gentoo就生成了gentoo.dir目录，执行脚本之前确认一下你的系统里有没有安装File-Slurp包：&lt;br /&gt;&lt;pre style=&quot;color: #f5deb3; background-color: #2f4f4f&quot;&gt;
#&lt;font color=&quot;#add8e6&quot;&gt;!/usr/bin/perl -w
&lt;/font&gt;#&lt;font color=&quot;#add8e6&quot;&gt;
&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;use&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;strict&lt;/font&gt;;

&lt;font color=&quot;#fa8072&quot;&gt;use&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;File&lt;/font&gt;::Slurp qw&lt;font color=&quot;#ffa07a&quot;&gt;(slurp)&lt;/font&gt;;

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt; $&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ifile&lt;/b&gt;&lt;/font&gt; = slurp($&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ARGV&lt;/b&gt;&lt;/font&gt;[0], binmode=&amp;gt; &lt;font color=&quot;#ffa07a&quot;&gt;&apos;:raw&apos;&lt;/font&gt;);
&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt; $&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;newfile&lt;/b&gt;&lt;/font&gt;;
&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt; $&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;=1;
&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt; @&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;&lt;u&gt;newfiles&lt;/u&gt;&lt;/b&gt;&lt;/font&gt; = split(&lt;font color=&quot;#ffa07a&quot;&gt;/TRAILER!!!/&lt;/font&gt;,$&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ifile&lt;/b&gt;&lt;/font&gt;);
&lt;font color=&quot;#ffa07a&quot;&gt;`mkdir $ARGV[0].dir`&lt;/font&gt;;

&lt;font color=&quot;#fa8072&quot;&gt;foreach&lt;/font&gt; $&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;newfile&lt;/b&gt;&lt;/font&gt; (@&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;&lt;u&gt;newfiles&lt;/u&gt;&lt;/b&gt;&lt;/font&gt;)
{
    open F, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;&amp;gt; ./$ARGV[0].dir/$i&quot;&lt;/font&gt;;
    print F $&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;newfile&lt;/b&gt;&lt;/font&gt;;
    print F &lt;font color=&quot;#ffa07a&quot;&gt;&quot;TRAILER!!!\0&quot;&lt;/font&gt;;
    close F;
    &lt;font color=&quot;#ffa07a&quot;&gt;`cd $ARGV[0].dir; cpio -i -H newc &amp;lt; $i; rm $i; cd ..`&lt;/font&gt;;
    $&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;++;
} 
&lt;/pre&gt;&lt;br /&gt;进入gentoo.dir目录主要看看init和etc下两个脚本文件initrd.defaults和initrd.scripts，加上自己想要执行的东西即可，当然如果你想大刀阔斧地hack也可以，完了之后在gentoo.dir目录下执行find . -print | cpio --quiet -o -H newc | gzip -9 &amp;gt; ../gentoo.igz。&lt;br /&gt;&lt;br /&gt;4、一切就绪之后制作iso文件：&lt;br /&gt;cd /mnt/mycd&lt;br /&gt;mkisofs -v -R -J -P &quot;cd&quot; -p &quot;cd&quot; -V &quot;xxx_installer&quot; -A &quot;xxx-install-cd&quot; -b isolinux/isolinux.bin  -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o /data/download/etc.iso .</description>
  <comments>http://lidaibin.livejournal.com/9476.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/9367.html</guid>
  <pubDate>Thu, 21 Sep 2006 08:53:59 GMT</pubDate>
  <title>当SIGSEGV如何产生可用的堆栈信息</title>
  <link>http://lidaibin.livejournal.com/9367.html</link>
  <description>不可避免地，不管是新手老手，在稳定之前都会有痛苦的测试及调试阶段，也许你很幸运，一开始就抓到了最难捕捉的bug，正确地解决了。&lt;br /&gt;&lt;br /&gt;但不管怎么样，你的程序总是很容易地就会得到一个Segmentation fault这样的错误信息并且程序就这样毫无保留地跳出来了，遇到这样的问题会让你很痛苦的，查找问题不亚于你N多天辛苦劳累编写代码的难度。那么有没有更好的方法可以在产生SIGSEGV信号的时候得到调试可用的信息呢？看看下面的例程吧！&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;sigsegv.h&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;n&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;def&lt;/font&gt; __sigsegv_h__
&lt;font color=&quot;#fa8072&quot;&gt;#define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;__sigsegv_h__&lt;/b&gt;&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;#ifdef&lt;/font&gt; __cplusplus
&lt;font color=&quot;#fa8072&quot;&gt;extern&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;C&quot;&lt;/font&gt; {
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;setup_sigsegv&lt;/b&gt;&lt;/font&gt;();

&lt;font color=&quot;#fa8072&quot;&gt;#ifdef&lt;/font&gt; __cplusplus
}
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt; /* &lt;font color=&quot;#add8e6&quot;&gt;__sigsegv_h__ &lt;/font&gt;*/
&lt;/pre&gt;&lt;br /&gt;sigsegv.c&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;_GNU_SOURCE&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;memory.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;signal.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;ucontext.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;dlfcn.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;execinfo.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;n&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;def&lt;/font&gt; NO_CPP_DEMANGLE
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;cxxabi.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(REG_RIP)
&lt;font color=&quot;#fa8072&quot;&gt;# define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SIGSEGV_STACK_IA64&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;# define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;REGFORMAT&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;%016lx&quot;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#elif&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(REG_EIP)
&lt;font color=&quot;#fa8072&quot;&gt;# define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SIGSEGV_STACK_X86&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;# define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;REGFORMAT&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;%08x&quot;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#else&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;# define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;SIGSEGV_STACK_GENERIC&lt;/b&gt;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;# define&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;REGFORMAT&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;%x&quot;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

&lt;font color=&quot;#fa8072&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;signal_segv&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;signum&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;siginfo_t&lt;/b&gt;&lt;/font&gt;* &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;info&lt;/b&gt;&lt;/font&gt;, &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;*&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ptr&lt;/b&gt;&lt;/font&gt;) {
  &lt;font color=&quot;#fa8072&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;si_codes&lt;/b&gt;&lt;/font&gt;[3] = {&lt;font color=&quot;#ffa07a&quot;&gt;&quot;&quot;&lt;/font&gt;, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;SEGV_MAPERR&quot;&lt;/font&gt;, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;SEGV_ACCERR&quot;&lt;/font&gt;};

  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;ucontext_t&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ucontext&lt;/b&gt;&lt;/font&gt; = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;ucontext_t&lt;/b&gt;&lt;/font&gt;*)ptr;

&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(SIGSEGV_STACK_X86) || &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(SIGSEGV_STACK_IA64)
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;f&lt;/b&gt;&lt;/font&gt; = 0;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;Dl_info&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;dlinfo&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; **&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;bp&lt;/b&gt;&lt;/font&gt; = 0;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;ip&lt;/b&gt;&lt;/font&gt; = 0;
&lt;font color=&quot;#fa8072&quot;&gt;#else&lt;/font&gt;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;bt&lt;/b&gt;&lt;/font&gt;[20];
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; **&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;strings&lt;/b&gt;&lt;/font&gt;;
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;sz&lt;/b&gt;&lt;/font&gt;;
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Segmentation Fault!\n&quot;&lt;/font&gt;);
  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;info.si_signo = %d\n&quot;&lt;/font&gt;, signum);
  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;info.si_errno = %d\n&quot;&lt;/font&gt;, info-&amp;gt;si_errno);
  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;info.si_code  = %d (%s)\n&quot;&lt;/font&gt;, info-&amp;gt;si_code, si_codes[info-&amp;gt;si_code]);
  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;info.si_addr  = %p\n&quot;&lt;/font&gt;, info-&amp;gt;si_addr);
  &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt;(i = 0; i &amp;lt; NGREG; i++)
    fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;reg[%02d]       = 0x&quot;&lt;/font&gt; REGFORMAT &lt;font color=&quot;#ffa07a&quot;&gt;&quot;\n&quot;&lt;/font&gt;, i, ucontext-&amp;gt;uc_mcontext.gregs[i]);

&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(SIGSEGV_STACK_X86) || &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(SIGSEGV_STACK_IA64)
&lt;font color=&quot;#fa8072&quot;&gt;# if&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(SIGSEGV_STACK_IA64)
  ip = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;*)ucontext-&amp;gt;uc_mcontext.gregs[REG_RIP];
  bp = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;**)ucontext-&amp;gt;uc_mcontext.gregs[REG_RBP];
&lt;font color=&quot;#fa8072&quot;&gt;# elif&lt;/font&gt; &lt;font color=&quot;#fa8072&quot;&gt;defined&lt;/font&gt;(SIGSEGV_STACK_X86)
  ip = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;*)ucontext-&amp;gt;uc_mcontext.gregs[REG_EIP];
  bp = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;**)ucontext-&amp;gt;uc_mcontext.gregs[REG_EBP];
&lt;font color=&quot;#fa8072&quot;&gt;# endif&lt;/font&gt;

  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Stack trace:\n&quot;&lt;/font&gt;);
  &lt;font color=&quot;#fa8072&quot;&gt;while&lt;/font&gt;(bp &amp;amp;&amp;amp; ip) {
    &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt;(!dladdr(ip, &amp;amp;dlinfo))
      &lt;font color=&quot;#fa8072&quot;&gt;break&lt;/font&gt;;

    &lt;font color=&quot;#fa8072&quot;&gt;const&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;symname&lt;/b&gt;&lt;/font&gt; = dlinfo.dli_sname;
&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;n&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;def&lt;/font&gt; NO_CPP_DEMANGLE
    &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;status&lt;/b&gt;&lt;/font&gt;;
    &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;tmp&lt;/b&gt;&lt;/font&gt; = __cxa_demangle(symname, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;, 0, &amp;amp;status);

    &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt;(status == 0 &amp;amp;&amp;amp; tmp)
      symname = tmp;
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

    fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;% 2d: %p &amp;lt;%s+%u&amp;gt; (%s)\n&quot;&lt;/font&gt;,
            ++f,
            ip,
            symname,
            (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt;)(ip - dlinfo.dli_saddr),
            dlinfo.dli_fname);

&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;n&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;def&lt;/font&gt; NO_CPP_DEMANGLE
    &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt;(tmp)
      free(tmp);
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;

    &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt;(dlinfo.dli_sname &amp;amp;&amp;amp; !strcmp(dlinfo.dli_sname, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;main&quot;&lt;/font&gt;))
      &lt;font color=&quot;#fa8072&quot;&gt;break&lt;/font&gt;;

    ip = bp[1];
    bp = (&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;**)bp[0];
  }
&lt;font color=&quot;#fa8072&quot;&gt;#else&lt;/font&gt;
  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;Stack trace (non-dedicated):\n&quot;&lt;/font&gt;);
  sz = backtrace(bt, 20);
  strings = backtrace_symbols(bt, sz);

  &lt;font color=&quot;#fa8072&quot;&gt;for&lt;/font&gt;(i = 0; i &amp;lt; sz; ++i)
    fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;%s\n&quot;&lt;/font&gt;, strings[i]);
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;
  fprintf(stderr, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;End of stack trace\n&quot;&lt;/font&gt;);
  exit (-1);
}

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;setup_sigsegv&lt;/b&gt;&lt;/font&gt;() {
  &lt;font color=&quot;#fa8072&quot;&gt;struct&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;sigaction&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;action&lt;/b&gt;&lt;/font&gt;;
  memset(&amp;amp;action, 0, &lt;font color=&quot;#fa8072&quot;&gt;sizeof&lt;/font&gt;(action));
  action.sa_sigaction = signal_segv;
  action.sa_flags = SA_SIGINFO;
  &lt;font color=&quot;#fa8072&quot;&gt;if&lt;/font&gt;(sigaction(SIGSEGV, &amp;amp;action, &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;) &amp;lt; 0) {
    perror(&lt;font color=&quot;#ffa07a&quot;&gt;&quot;sigaction&quot;&lt;/font&gt;);
    &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 0;
  }

  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 1;
}

&lt;font color=&quot;#fa8072&quot;&gt;#if&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;n&lt;/font&gt;&lt;font color=&quot;#fa8072&quot;&gt;def&lt;/font&gt; SIGSEGV_NO_AUTO_INIT
&lt;font color=&quot;#fa8072&quot;&gt;static&lt;/font&gt; &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;__attribute&lt;/b&gt;&lt;/font&gt;((constructor)) &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;init&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;) {
  setup_sigsegv();
}
&lt;font color=&quot;#fa8072&quot;&gt;#endif&lt;/font&gt;
&lt;/pre&gt;&lt;br /&gt;main.c&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&quot;sigsegv.h&quot;&lt;/font&gt;
&lt;font color=&quot;#fa8072&quot;&gt;#include&lt;/font&gt; &lt;font color=&quot;#ffa07a&quot;&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;die&lt;/b&gt;&lt;/font&gt;() {
  &lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *&lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;err&lt;/b&gt;&lt;/font&gt; = &lt;font color=&quot;#7fffd4&quot;&gt;NULL&lt;/font&gt;;
  strcpy(err, &lt;font color=&quot;#ffa07a&quot;&gt;&quot;gonner&quot;&lt;/font&gt;);
  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; 0;
}

&lt;font color=&quot;#9acd32&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#7fffd4&quot;&gt;&lt;b&gt;main&lt;/b&gt;&lt;/font&gt;() {
  &lt;font color=&quot;#fa8072&quot;&gt;return&lt;/font&gt; die();
}
&lt;/pre&gt;&lt;br /&gt;下面来编译上面的main.c程序看看将会产生什么样的信息呢，不过要注意的就是如果要在你的程序里引用sigsegv.h、sigsegv.c得到堆栈信息的话记得加上-rdynamic -ldl参数。&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#ffc0cb&quot;&gt;&lt;b&gt;/data/codes/c/test/backtraces $ &lt;/b&gt;&lt;/font&gt;gcc -o test -rdynamic -ldl -ggdb -g sigsegv.c main.c
&lt;font color=&quot;#ffc0cb&quot;&gt;&lt;b&gt;/data/codes/c/test/backtraces $ &lt;/b&gt;&lt;/font&gt;./test
Segmentation Fault!
info.si_signo = 11
info.si_errno = 0
info.si_code  = 1 (SEGV_MAPERR)
info.si_addr  = (nil)
reg[00]       = 0x00000033
reg[01]       = 0x00000000
reg[02]       = 0xc010007b
reg[03]       = 0x0000007b
reg[04]       = 0x00000000
reg[05]       = 0xb7fc8ca0
reg[06]       = 0xbff04c2c
reg[07]       = 0xbff04c1c
reg[08]       = 0xb7f8cff4
reg[09]       = 0x00000001
reg[10]       = 0xbff04c50
reg[11]       = 0x00000000
reg[12]       = 0x0000000e
reg[13]       = 0x00000006
reg[14]       = 0x080489ec
reg[15]       = 0x00000073
reg[16]       = 0x00010282
reg[17]       = 0xbff04c1c
reg[18]       = 0x0000007b
Stack trace:
 1: 0x80489ec &amp;lt;die+16&amp;gt; (/data/codes/c/test/backtraces/test)
 2: 0x8048a16 &amp;lt;main+19&amp;gt; (/data/codes/c/test/backtraces/test)
End of stack trace
&lt;font color=&quot;#ffc0cb&quot;&gt;&lt;b&gt;/data/codes/c/test/backtraces $ &lt;/b&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;下面用gdb来看看出错的地方左右的代码：&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#ffc0cb&quot;&gt;&lt;b&gt;/data/codes/c/test/backtraces $ &lt;/b&gt;&lt;/font&gt;gdb ./test
gdb&amp;gt; disassemble die+16
Dump of assembler code for function die:
0x080489dc &amp;lt;die+0&amp;gt;:     push   %ebp
0x080489dd &amp;lt;die+1&amp;gt;:     mov    %esp,%ebp
0x080489df &amp;lt;die+3&amp;gt;:     sub    $0x10,%esp
0x080489e2 &amp;lt;die+6&amp;gt;:     movl   $0x0,0xfffffffc(%ebp)
0x080489e9 &amp;lt;die+13&amp;gt;:    mov    0xfffffffc(%ebp),%eax
0x080489ec &amp;lt;die+16&amp;gt;:    movl   $0x6e6e6f67,(%eax)
0x080489f2 &amp;lt;die+22&amp;gt;:    movw   $0x7265,0x4(%eax)
0x080489f8 &amp;lt;die+28&amp;gt;:    movb   $0x0,0x6(%eax)
0x080489fc &amp;lt;die+32&amp;gt;:    mov    $0x0,%eax
0x08048a01 &amp;lt;die+37&amp;gt;:    leave  
0x08048a02 &amp;lt;die+38&amp;gt;:    ret    
End of assembler dump.
gdb&amp;gt; &lt;/pre&gt;&lt;br /&gt;也可以直接break *die+16进行调试，看看在出错之前的堆栈情况，那么下面我们再来看看代码问题到底出在什么地方了。&lt;br /&gt;&lt;pre style=&quot;color:#f5deb3;background-color:#2f4f4f&quot;&gt;
&lt;font color=&quot;#ffc0cb&quot;&gt;&lt;b&gt;/data/codes/c/test/backtraces $ &lt;/b&gt;&lt;/font&gt;gdb ./test
gdb&amp;gt; break *die+16
Breakpoint 1 at 0x80489f2: file main.c, line 6.
gdb&amp;gt; list *die+16
0x80489f2 is in die (main.c:6).
1       #include &quot;sigsegv.h&quot;
2       #include &amp;lt;string.h&amp;gt;
3       
4       int die() {
5         char *err = NULL;
6         strcpy(err, &quot;gonner&quot;);
7         return 0;
8       }
9       
10      int main() {
gdb&amp;gt; &lt;/pre&gt;&lt;br /&gt;现在看看定位错误将会多么方便，上面的调试指令中list之前break不是必须的，只是让你可以看到break其实就已经指出了哪一行代码导致Segmentation fault了。如果你要发布你的程序你一般会为了减少体积不会附带调试信息的(也就是不加-ggdb -g参数)，不过没关系，你一样可以得到上面stack-trace信息，然后你调试之前只要加上调试信息即可。&lt;br /&gt;</description>
  <comments>http://lidaibin.livejournal.com/9367.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/9149.html</guid>
  <pubDate>Tue, 19 Sep 2006 01:46:50 GMT</pubDate>
  <title>发现新大陆：Backtraces</title>
  <link>http://lidaibin.livejournal.com/9149.html</link>
  <description>源于跟小锁的闲聊：&lt;br /&gt;(10:44:01 AM) xiaosuo | 烧掉日记重新来过？: 据说是debug用的，不过似乎原理很简单，使用不方便，应该研究一下如何在收到sigseg的时候自动dump堆栈信息而不需要手动去添加一些东西，似乎gdb是可以作到的。可以研究一下。&lt;br /&gt;&lt;br /&gt;今天无意中发现其实libc里就有现成的可用，由于&lt;a href=&quot;http://www.gnu.org/software/libc/manual/html_node/Backtraces.html#Backtraces&quot;&gt;Backtraces&lt;/a&gt;没有man pages可用，所以要不是无意中找到还真不好找！</description>
  <comments>http://lidaibin.livejournal.com/9149.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/8776.html</guid>
  <pubDate>Wed, 13 Sep 2006 06:51:05 GMT</pubDate>
  <title>使用iconv联想到了数组与指针</title>
  <link>http://lidaibin.livejournal.com/8776.html</link>
  <description>看看这样一段代码：&lt;br /&gt;&lt;pre&gt;
&lt;font color=&quot;#a520f7&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;iconv.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#a520f7&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;string.h&amp;gt;&lt;/font&gt;
&lt;font color=&quot;#a520f7&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;

&lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;
func(&lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; str[])
{
  printf(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#6b59ce&quot;&gt;%d&lt;/font&gt;&lt;font color=&quot;#6b59ce&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;, &lt;font color=&quot;#a52829&quot;&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(str));
}

&lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;
main(&lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; argc, &lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *argv)
{
  iconv_t cvt;
  &lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; in_buf[&lt;font color=&quot;#ff00ff&quot;&gt;13&lt;/font&gt;] = &lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;京GCG339&amp;quot;&lt;/font&gt;;
  &lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; out_buf[&lt;font color=&quot;#ff00ff&quot;&gt;100&lt;/font&gt;];
  &lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; in, out;
  &lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *in_ptr = in_buf;
  &lt;font color=&quot;#298a52&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *out_ptr = out_buf;

  in = strlen(in_buf);
  out = &lt;font color=&quot;#ff00ff&quot;&gt;100&lt;/font&gt;;
  cvt = iconv_open(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;GBK&amp;quot;&lt;/font&gt;, &lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;/font&gt;);
  iconv(cvt, &amp;amp;in_ptr, &amp;amp;in, &amp;amp;out_ptr, &amp;amp;out);
  iconv_close(cvt);
  printf(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;font color=&quot;#6b59ce&quot;&gt;%s&lt;/font&gt;&lt;font color=&quot;#6b59ce&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;, out_buf);
  func(in_buf);

  &lt;font color=&quot;#a52829&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;;
}
&lt;/pre&gt;&lt;br /&gt;试试将其中的iconv(cvt, &amp;in_ptr, &amp;in, &amp;out_ptr, &amp;out);换成iconv(cvt, &amp;in_buf, &amp;in, &amp;out_buf, &amp;out)，毫无疑问你会得到一个segmentation fault。。。&lt;br /&gt;&lt;br /&gt;想起了一篇文章讲到的数组与指针的区别：&lt;br /&gt;&lt;br /&gt;(1)数组名的内涵在于其指代实体是一种数据结构，这种数据结构就是数组。sizeof一个数组名和一个指针比较一下就可以发现其这种区别。。。&lt;br /&gt;&lt;br /&gt;(2)数组名的外延在于其可以转换为指向其指代实体的指针，而且是一个指针常量。&lt;br /&gt;&lt;br /&gt;(3)指向数组的指针则是另外一种变量类型，仅仅意味着数组的存放地址！&lt;br /&gt;&lt;br /&gt;(4)数组名作为函数形参时，将全面沦落为一个普通指针！它的贵族身份被剥夺，成了一个地地道道的只拥有4个字节的平民。现在你知道最后一个输出是什么了吧？</description>
  <comments>http://lidaibin.livejournal.com/8776.html</comments>
  <category>linux</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://lidaibin.livejournal.com/8492.html</guid>
  <pubDate>Mon, 11 Sep 2006 04:23:52 GMT</pubDate>
  <title>采用Adobe官方OpenType字体打造完美tetex中文环境</title>
  <link>http://lidaibin.livejournal.com/8492.html</link>
  <description>终于还是忍不住尝试采用Adobe官方OpenType字体，利用dvipdfmx采用非嵌入方式制作pdf文档，体积更小效果更加完美！！！&lt;br /&gt;&lt;br /&gt;其实很简单，由于Adobe官方的OpenType字体没有subfont的tex font metrics，那么我们可以用simsun.ttf来生成song的tfm，然后配置cid-x.map，将原来的&lt;br /&gt;&lt;br /&gt;song@Unicode@    unicode  simsun&lt;br /&gt;songsl@Unicode@  unicode  simsun -s .167&lt;br /&gt;&lt;br /&gt;替换为&lt;br /&gt;&lt;br /&gt;song@Unicode@    unicode  !AdobeSongStd-Light&lt;br /&gt;songsl@Unicode@  unicode  !AdobeSongStd-Light,Italic&lt;br /&gt;&lt;br /&gt;最后一行也可以写成&lt;br /&gt;songsl@Unicode@  unicode  !AdobeSongStd-Light -s .167&lt;br /&gt;就可以了&lt;br /&gt;&lt;br /&gt;默认配置下dvipdfmx会优先在当前目录查找cid-x.map、Unicode.sfd、UTF8-UCS2以及otf字体，找不到otf字体时才会用TrueType字体。如果想要嵌入字体去掉!即可，不过要发布你的文档最好还是不要嵌入，这样不会有版权问题哦，只要安装有acrobat中文字体的机器上都可以浏览，因为这是官方标准字体哦。&lt;br /&gt;&lt;br /&gt;另外及永刚的文档上所描述的以及脚本中的关于dvipdfmx文件所需要的几个文件存放路径都是错误的，cid-x.map应放在${TEXMFHOME}/fonts/map/dvipdfmx，Unicode.sfd应放在${TEXMFHOME}/fonts/sfd，UTF8-UCS2应放在${TEXMFHOME}/fonts/cmap，目录结构大体如此，${TEXMFLOCAL}也一样！</description>
  <comments>http://lidaibin.livejournal.com/8492.html</comments>
  <category>linux</category>
  <category>tetex</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
</channel>
</rss>
