﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Shipfi (春暖花开，开满我的阳台)</title><link>http://www.cnblogs.com/shipfi/</link><description>刹那风波翻过,
一转眼从前便已难复再</description><language>zh-cn</language><lastBuildDate>Thu, 21 Aug 2008 15:18:55 GMT</lastBuildDate><pubDate>Thu, 21 Aug 2008 15:18:55 GMT</pubDate><ttl>60</ttl><item><title>GDB 进行调试 使用心得</title><link>http://www.cnblogs.com/shipfi/archive/2008/08/04/1260293.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Mon, 04 Aug 2008 09:38:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/08/04/1260293.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1260293.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/08/04/1260293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1260293.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1260293.html</trackback:ping><description><![CDATA[1: 对于在应用程序中加入参数进行调试的方法：<br>&nbsp;&nbsp; 直接用 gdb app -p1 -p2 这样进行调试是不行的。<br>&nbsp;&nbsp; 需要像以下这样使用：<br>&nbsp;&nbsp;&nbsp; #gdb app<br>&nbsp;&nbsp;&nbsp; (gdb) r -p1 -p2<br>&nbsp;&nbsp;&nbsp; 可以用show args 命令来查看<br><br>2. 加入断点：<br>&nbsp;&nbsp; break &lt;linenumber&gt;<br>&nbsp;&nbsp; break &lt;funcName&gt;<br>&nbsp;&nbsp; break +offset<br>&nbsp;&nbsp; break -offset<br>&nbsp;&nbsp; (在当前行号的前面或后面的offset行停住。)<br><br>&nbsp;&nbsp; break filename:linenum<br>&nbsp;&nbsp; 在源文件filename的linenum行处停住。<br><br>&nbsp;&nbsp; break filename:function<br>&nbsp;&nbsp; 在源文件filename的function函数的入口处停住。<br><br>&nbsp; break ... if<br>&nbsp; ...可以是上述的参数，condition表示条件，在条件成立时停住。比如在循环境体中，可以设置&nbsp;&nbsp;&nbsp;&nbsp; break if i=100，表示当i为100时停住程序。<br><br><br>3. 查看运行时的堆栈：<br>&nbsp;&nbsp; 使用bt命令<br><br>4. 打印某个变量的值：<br>&nbsp;&nbsp; print val<br><br>5. 单步： n<br>&nbsp;&nbsp; 继续运行：　c<br>　　step<br>　　单步跟踪，如果有函数调用，他会进入该函数。<br>　　next<br>　　同样单步跟踪，如果有函数调用，他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加，不加表示一条条地执行，加表示执行后面的count条指令，然后再停住。<br>　　set step-mode<br>　　set step-mode on<br>　　打开step-mode模式，于是，在进行单步跟踪时，程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。<br>　　set step-mod off<br>　　关闭step-mode模式。<br>　　finish<br>　　运行程序，直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。<br>　　until 或 u<br>　　当你厌倦了在一个循环体内单步跟踪时，这个命令可以运行程序直到退出循环体。<br>&nbsp; <br>6.在ＧＤＢ中执行shell命令：<br>　在gdb环境中，你可以执行UNIX的shell的命令，使用gdb的shell命令来完成：<br>　eg. shell make<br>&nbsp;<br>7. 运行环境<br>&nbsp;可设定程序的运行路径。<br>&nbsp; show paths 查看程序的运行路径。<br>&nbsp; set environment varname [=value] 设置环境变量。如：set env USER=hchen<br>&nbsp; show environment [varname] 查看环境变量。<br><br>8.观察点（WatchPoint）<br>&nbsp; 观察点一般来观察某个表达式（变量也是一种表达式）的值是否有变化了，如果有变化，马上停住程 序。我们有下面的几种方法来设置观察点：<br>&nbsp; watch<br>&nbsp;&nbsp; 为表达式（变量）expr设置一个观察点。一量表达式值有变化时，马上停住程序。<br>&nbsp; rwatch<br>&nbsp;&nbsp; 当表达式（变量）expr被读时，停住程序。<br>&nbsp; awatch<br>&nbsp;&nbsp; 当表达式（变量）的值被读或被写时，停住程序。<br>&nbsp; info watchpoints<br>&nbsp;&nbsp; 列出当前所设置了的所有观察点。<br><br>9. 维护breakpoint<br>&nbsp;&nbsp; clear<br>&nbsp;&nbsp;&nbsp; 清除所有的已定义的停止点。<br>&nbsp;&nbsp; clear func<br>&nbsp;&nbsp;&nbsp; 清除所有设置在函数上的停止点。<br>&nbsp; delete [breakpoints] [range...]<br>&nbsp; 删除指定的断点，breakpoints为断点号。如果不指定断点号，则表示删除所有的断点。range 表示断点号的范围（如：3-7）。其简写命令为d。<br>&nbsp; 比删除更好的一种方法是disable停止点，disable了的停止点，GDB不会删除，当你还需要时，enable即可，就好像回收站一样。<br>&nbsp; disable [breakpoints] [range...]<br>&nbsp;&nbsp; disable所指定的停止点，breakpoints为停止点号。如果什么都不指定，表示disable所有的停止 点。简写命令是dis.<br>&nbsp; enable [breakpoints] [range...]<br>&nbsp;&nbsp; enable所指定的停止点，breakpoints为停止点号。<br><br><br>10、程序变量<br>查看文件中某变量的值：<br>file::variable<br>function::variable<br>可以通过这种形式指定你所想查看的变量，是哪个文件中的或是哪个函数中的。例如，查看文件f2.c中的全局变量x的值：<br>gdb) p 'f2.c'::x<br><br>查看数组的值<br>有时候，你需要查看一段连续的内存空间的值。比如数组的一段，或是动态分配的数据的大小。你可以使用GDB的“@”操作符，“@”的左边是第一个内存的地址的值，“@”的右边则你你想查看内存的长度。例如，你的程序中有这样的语句：<br>int *array = (int *) malloc (len * sizeof (int));<br>于是，在GDB调试过程中，你可以以如下命令显示出这个动态数组的取值：<br>p *array@len<br>如果是静态数组的话，可以直接用print数组名，就可以显示数组中所有数据的内容了。<br><br><br><br>11.输出格式<br>一般来说，GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如，你想输出一个整数的十六进制，或是二进制来查看这个整型变量的中的位的情况。要做到这样，你可以使用GDB的数据显示格式：<br><br>x 按十六进制格式显示变量。<br>d 按十进制格式显示变量。<br>u 按十六进制格式显示无符号整型。<br>o 按八进制格式显示变量。<br>t 按二进制格式显示变量。<br>a 按十六进制格式显示变量。<br>c 按字符格式显示变量。<br>f 按浮点数格式显示变量。<br>(gdb) p i<br>$21 = 101<br>(gdb) p/a i<br>$22 = 0x65<br>(gdb) p/c i<br>$23 = 101 'e'<br>(gdb) p/f i<br>$24 = 1.41531145e-43<br>(gdb) p/x i<br>$25 = 0x65<br>(gdb) p/t i<br>$26 = 1100101<br><br>11.查看内存<br>使用examine命令（简写是x）来查看内存地址中的值。x命令的语法如下所示：<br>x/<br>n、f、u是可选的参数。<br>n 是一个正整数，表示显示内存的长度，也就是说从当前地址向后显示几个地址的内容。<br>f 表示显示的格式，参见上面。如果地址所指的是字符串，那么格式可以是s，如果地十是指令地址，那么格式可以是i。<br>u 表示从当前地址往后请求的字节数，如果不指定的话，GDB默认是4个bytes。u参数可以用下面的字符来代替，b表示单字节，h表示双字节，w表示四字节，g表示八字节。当我们指定了字节长度后，GDB会从指内存定的内存地址开始，读写指定字节，并把其当作一个值取出来。<br><br>n/f/u三个参数可以一起使用。例如：<br>命令：x/3uh 0x54320 表示，从内存地址0x54320读取内容，h表示以双字节为一个单位，3表示三个单位，u表示按十六进制显示。<br><br>12.自动显示<br><br>你可以设置一些自动显示的变量，当程序停住时，或是在你单步跟踪时，这些变量会自动显示。相关的GDB命令是display。<br>display<br>display/<br>display/ expr<br>expr是一个表达式，fmt表示显示的格式，addr表示内存地址，当你用display设定好了一个或多个表达式后，只要你的程序被停下来，GDB会自动显示你所设置的这些表达式的值。<br><br>格式i和s同样被display支持，一个非常有用的命令是：<br>display/i $pc<br><br>undisplay<br>delete display<br>删除自动显示，dnums意为所设置好了的自动显式的编号。<br><br>disable display<br>enable display<br>disable和enalbe不删除自动显示的设置，而只是让其失效和恢复。<br><br>info display<br>查看display设置的自动显示的信息。GDB会打出一张表格，向你报告当然调试中设置了多少个自动显示设置，其中包括，设置的编号，表达式，是否enable。<br><br>13. 设置显示选项<br>set print address<br>set print address on<br>打开地址输出，当程序显示函数信息时，GDB会显出函数的参数地址。系统默认为打开的，<br>show print address<br>查看当前地址显示选项是否打开。<br><br>set print array<br>set print array on<br>打开数组显示，打开后当数组显示时，每个元素占一行，如果不打开的话，每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下，我就不再多说了。<br><br>set print array off<br>show print array<br><br>set print elements<br>这个选项主要是设置数组的，如果你的数组太大了，那么就可以指定一个来指定数据显示的最大长度，当到达这个长度时，GDB就不再往下显示了。如果设置为0，则表示不限制。<br><br>show print elements<br>查看print elements的选项信息。<br><br>set print null-stop<br>如果打开了这个选项，那么当显示字符串时，遇到结束符则停止显示。这个选项默认为off。<br><br>set print pretty on<br>如果打开printf pretty这个选项，那么当GDB显示结构体时会比较漂亮。<br><br>14.关于显示源码list<br><br><p>以下是list命令的說明。</p>

  <table border="2" cellpadding="0" cellspacing="0" width="100%"><tbody><tr bordercolor="#FFFFFF">
    <td>參數</td>
    <td>說明</td>
  </tr>
  <tr bordercolor="#FFFFFF">
    <td>list filename:number</td>
    <td>列出某檔案的第幾行，檔案是可省略的。</td>
  </tr>
  <tr bordercolor="#FFFFFF">
    <td>list [function]</td>
    <td>列出某函數的程式碼</td>
  </tr>
  <tr bordercolor="#FFFFFF">
    <td>list</td>
    <td>繼續印出程式碼</td>
  </tr>
  <tr bordercolor="#FFFFFF">
    <td>list -</td>
    <td>印出上一次list的程式碼的前一段程式碼(類似向上翻動)</td>
  </tr>
  <tr bordercolor="#FFFFFF">
    <td>show listsize</td>
    <td>顯示現在一次印出幾行</td>
  </tr>
  <tr bordercolor="#FFFFFF">
    <td>set listsize</td>
    <td>設定一次印出幾行</td></tr></tbody></table><br><img src ="http://www.cnblogs.com/shipfi/aggbug/1260293.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41822/" target="_blank">[新闻]第一财经周刊:当前互联网世界正处无秩序时代</a>]]></description></item><item><title>又十几天没更新了</title><link>http://www.cnblogs.com/shipfi/archive/2008/07/28/1255129.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Mon, 28 Jul 2008 15:00:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/07/28/1255129.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1255129.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/07/28/1255129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1255129.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1255129.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;也不知道写点什么，反正日子总是一天天的过。偶而拾得一篇好作或者心得就放到cnblog上，没有了，也懒得去更新。<BR>　毕竟这也不是写日记，非得必要天天来记一下。至少这一个月，有两篇，一篇是抄的，一篇是废话。八月份来了，项目也忙起来了，我想中间如果有什么好的想法，或者得到什么新的东西，都放上去。<img src ="http://www.cnblogs.com/shipfi/aggbug/1255129.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>Unix编程常见问题解答(转)</title><link>http://www.cnblogs.com/shipfi/archive/2008/07/08/1237948.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Tue, 08 Jul 2008 01:50:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/07/08/1237948.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1237948.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/07/08/1237948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1237948.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1237948.html</trackback:ping><description><![CDATA[摘要: 文章转自：http://www.linuxsir.org/bbs/showthread.php?t=176673文章中涉及许多Unix中非常有用及细节的编程问题1. 进程控制***********1.1 创建新进程：fork函数========================1.1.1 fork函数干什么？---------------------- #include &lt;sys/types.&nbsp;&nbsp;<a href='http://www.cnblogs.com/shipfi/archive/2008/07/08/1237948.html'>阅读全文</a><img src ="http://www.cnblogs.com/shipfi/aggbug/1237948.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41821/" target="_blank">[新闻]死敌VMware变身微软认证计划新成员</a>]]></description></item><item><title>Bash shell中几个知识点备忘</title><link>http://www.cnblogs.com/shipfi/archive/2008/06/12/1218750.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Thu, 12 Jun 2008 15:39:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/06/12/1218750.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1218750.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/06/12/1218750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1218750.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1218750.html</trackback:ping><description><![CDATA[<div align="left">1.针对算术运算。有以下几种赋值方法：<br><br>let a=1+2<br>echo $a<br><br>a=$((3+3))<br>echo $a<br><br>a=$[4*4]<br>echo "$a"<br><br>set $[a=5*5]<br>echo "$a"<br><br>2.判断一个目录是否存在：<br>if [ -d "$(pwd)/../CAndPointer" ];then<br>&nbsp;&nbsp;&nbsp; echo "../CAndPointer directory exsits."<br>fi<br><br>3. {}／()的用法：<br>&nbsp;&nbsp; echo al.{txt,gz}<br>&nbsp;&nbsp;&nbsp;&nbsp; -&gt; al.txt al.gz<br>&nbsp;&nbsp; ${}的用法:<br>&nbsp;&nbsp;&nbsp;&nbsp; ${a} == $a<br>&nbsp;&nbsp; $(cmd) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg. echo "$(ls -l)"<br>&nbsp;&nbsp;&nbsp; $[expression]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用法见上。<br>&nbsp;&nbsp;&nbsp; {}还有一种用法，作为文件输入，以行保存到变量中：<br>&nbsp;&nbsp;&nbsp; File=condition.sh<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read line1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; read line2<br>&nbsp;&nbsp;&nbsp; }&lt;$File<br><br>4.判断一个字符串为空：<br>&nbsp; if [ -z "$1" ]<br>&nbsp; then<br>&nbsp;&nbsp;&nbsp;&nbsp; echo "Useage:'basename $0' [domain-name]"<br>&nbsp;&nbsp;&nbsp;&nbsp; exit $E_NOARGS<br>&nbsp; fi<br>&nbsp;<br>&nbsp;5.IFS用法，IFS作为输出的默认分隔符，在shell中分隔相应字符比较有用。<br>&nbsp;&nbsp;&nbsp;&nbsp; 注：IFS变量的默认值为" "<br>&nbsp;&nbsp;&nbsp; 试验一下以下用法：<br>&nbsp;&nbsp;&nbsp; var="'(]\\{}\\\$\""<br>&nbsp;&nbsp;&nbsp; echo $var<br>&nbsp;&nbsp;&nbsp; echo "$var"<br>&nbsp;&nbsp;&nbsp; IFS='\'<br>&nbsp;&nbsp;&nbsp; echo $var<br>&nbsp;&nbsp;&nbsp; echo "$var"<br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1218750.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41819/" target="_blank">[新闻]英特尔雅虎开发网络计算机频道</a>]]></description></item><item><title>&lt;Unix环境高级编程＞－－信号</title><link>http://www.cnblogs.com/shipfi/archive/2008/06/11/1217967.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Wed, 11 Jun 2008 15:41:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/06/11/1217967.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1217967.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/06/11/1217967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1217967.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1217967.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 这篇是关于在读＜Unix环境高级编程&gt;信号一章时做的一些笔记，特记录在此。<br>&nbsp;&nbsp; 关于多线程，多进程这几章的笔记，写得太乱，正在尝试更正。<br><br>以下开始正文<br>-----------------------------------------------------------------------------------------<br><br>1.信号和pause()函数<br>&nbsp;&nbsp; 调用pause()函数可以让进程的状态变为休眠，休眠到什么时候呢？答案是：当进程中一<br>个信号产生时。<br>&nbsp;&nbsp; 当进程调用pause()函数休眠的时候，信号来临，此时，内核将自动将进程唤醒。<br>&nbsp;&nbsp; 以下的代码可以使用pause让进程中休眠一段时间后，继续执行。<br><br>&nbsp;&nbsp; signal(SIG_ALRM,slg_alrm);<br>&nbsp;&nbsp; alarm(3);<br>&nbsp;&nbsp; while(need_to_do==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pause();<br><br>&nbsp;&nbsp; void slg_alrm()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; need_to_do=1;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; 第一步，进程调用alarm函数设定一个超时器，3秒后SIG_ALRM进程将会准时到达。<br>&nbsp;&nbsp; 第二步，进程在pause()程序语句中转入休眠状态。<br>&nbsp;&nbsp; 第三步，SIG_ALRM到达后，sig_alrm被处理，将变量need_to_do设置为1。<br>&nbsp;&nbsp; 第四步，内核将此进程唤醒，此进程将从休眠状态转为可调度状态。此进程被分配到CPU后，进程将从pause()指令的下一条指令开始执行。<br>&nbsp;&nbsp; 第五步，此时need_to_do已经变更为１，所以，pause函数将不会被执行了。这样，就模<br>拟了一个让进程休眠三秒的动作。<br><br><br><br>2.中断系统调用和自动重启动<br>　　在Linux系统中，总有某些函数是属于低速系统调用，当调用低速系统调用函数时，进程会被阻塞，哪些是低速系统调用呢？<br>　　比如，当需要进行I/O函数操作时(read/write函数)，因为需要访问I/O设备，其肯定属于低速系统调用，在访问该I/O设备时，进程可能会被阻塞一段时间，又或者，当进程需要&gt;从键盘读入字符(read(STDIN))时，进程肯定会被阻塞，直到用户在键盘中输入完毕，函数才能返回。<br>&nbsp;&nbsp;&nbsp; 那么，当以上低速系统调用期间，如果进程产生信号，怎么处理？<br>&nbsp;&nbsp;&nbsp; 如：<br>&nbsp;&nbsp;&nbsp; 　　if((n=read(STDIN,buf,BUFSIZE))&lt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; 以上代码，如果进程在执行read指令期间发生中断(信号产生），处理完中断后，进程该从哪儿开始执行呢？重新执行read吗？还是read的下一条指令？还是产生异常退出？<br>&nbsp;&nbsp;&nbsp; 在早期的UNIX系统中，有一个特性就是：如果进程在执行一个低速系统调用而阻塞间捕捉到一个信号，则该系统调用就被中断不再继续执行，系统调用返回出错，其error值被置为EINTR.&nbsp; 早期对于低速系统调用的处理大多都是这样的：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; agin:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((n=read(STDIN,buf,BUFSIZE))&lt;0)&nbsp; //对于中断，系统将会返回出错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(errno==EINTR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto agin;&nbsp;&nbsp; //重新执行read<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其它错误。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Success<br><br>&nbsp;&nbsp;&nbsp; 为了帮助应用程序不必处理被中断的系统调用，就引入了自动重启动机制。自动重启动的函数包括：ioctl,read,readv,write,writev,wait,waitpid.<br>&nbsp;&nbsp;&nbsp; 对于以上函数，在执行期间，如果被信号中断，则该函数可以再次被调用。<br>&nbsp;&nbsp;&nbsp; 以上，wait,waitpid并不是针对低速设备调用阻塞而使用的函数，把它们加入到自动重启动是因为：这两个函数碰到信号总是会被中断！！<br>&nbsp;&nbsp;&nbsp; 对于以上函数默认的自动重启动，有时会产生一些问题，所以，现在允许进程基于每个信号禁用自动重启动的功能。<br><br>3.可重入函数<br>&nbsp;&nbsp;&nbsp; 在讨论可重和函数之前，先来看一下以下的代码：<br><br>&nbsp;&nbsp;&nbsp; int gobal_var = 0;<br><br>&nbsp;&nbsp;&nbsp; signal(SIG_TERM,sig_term);<br><br>&nbsp;&nbsp;&nbsp; void sig_term<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gobal_var = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //do other<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; void func()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gobal_var = 1; //设置全局变量为1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(gobal_var)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do other code.<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp; 以上，func函数设置全局变为1,继续下面的指令，如果在if（gobal_var)这条指令执行前，发生了SIG_TERM中断，则全局变为gobal_var被置为0,返回后，if语句下面的指令将不会被执行。<br>&nbsp; 以上有一个特征，就是在发生中断时，进程的全局数据空间导致了变更，调用func函数时，如果有中断或没有中断产生，函数产生的结果可能不一样。<br>&nbsp; 另外一个例子，假设gobal_var是在func中保存了进程的pid号，我们将func作为一个函数库发布，在多进程环境中，每个进程调用func产生的结果也可能不一样。<br>&nbsp; 在＜unix环境高级编程&gt;中也有一个例子，就是进程正在执行malloc，此时捕捉到信号，执行信号处理函数，其中又会调用malloc函数，因为对于进程来说，malloc函数为进程所分配的存储区维护一张链表，执行信号处理程序时，进程可能正在更改此链表，如果继续执行一次malloc，则此链表可能遭受破坏。<br><br>&nbsp; 现在我们引入可重入函数：什么是可重入函数？<br>&nbsp;&nbsp;&nbsp; 可重入(reentrant)函数可以由多于一个任务并发使用，而不必担心数据错误，也可以理解为，每个任务得到的数据都是相同的。另外一个特征：可重入函数可以在任意时刻被中断，稍后继续运行，不会丢失数据。<br>&nbsp;&nbsp;&nbsp; 所以，可重入函数内部大部分都会使用本地变量，或者，如果要使用全局变量进，会保护自己的数据。<br><br>&nbsp; 当一个函数中使用以下几种实现时，他们很可能就不是可重入的函数：<br>&nbsp;&nbsp;&nbsp; (a): 使用静态的数据结构或者全局变量。<br>&nbsp;&nbsp;&nbsp; (b): 调用malloc或者free函数.<br>&nbsp;&nbsp;&nbsp; (c): 调用了其它不可重函数<br>&nbsp;&nbsp;&nbsp; (d): 调用了I/O库。<br>&nbsp; 总体来说的话，一个函数在重入条件下(可以看成再次调用，或者从中断返回)条件下使用了未受保护的共享资源，则它是不可重入的.<br><br><img src ="http://www.cnblogs.com/shipfi/aggbug/1217967.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41818/" target="_blank">[新闻]Windows Live视频邮件9月9日开始测试</a>]]></description></item><item><title>GNU Make笔记</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/28/1209332.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Wed, 28 May 2008 08:50:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/28/1209332.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1209332.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/28/1209332.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1209332.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1209332.html</trackback:ping><description><![CDATA[<div align="left">Make语法规则：<br><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">通常规则的语法格式如下：<br></span><i><b>TARGETS : 
PREREQUISITES</b></i><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMAND...</span></i></b><br><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">或者：<br></span><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">TARGETS : 
PREREQUISITES ; COMMAND<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></i></b><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">COMMAND<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></i></b><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">...</span></i></b><br><br><br>1.<a name="_gnu_make_4.4.2"><span style="font-family: 楷体_GB2312;">函数</span><span lang="EN-US"><b>wildcard<br>&nbsp;&nbsp; </b>用法： $(wildcard PATTERN)<br>&nbsp;&nbsp; 解释：</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;"> 在</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">Makefile</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">中，它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。<br>&nbsp; 例子： <br>  <div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 0);">ifneq&nbsp;(</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(wildcard&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(USR_LIB_DIR)</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">libboost_thread.so),)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">LIB_BOOST_THREAD&nbsp;:</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">lboost_thread&nbsp; <br><br></span><b><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: Arial;" lang="EN-US"></span></b><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">objects := $(patsubst 
%.c,%.o,$(wildcard *.c)) </span><span style="font-size: 12pt; font-family: Arial;" lang="EN-US"><br>&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">foo : 
$(objects)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">cc -o foo 
$(objects)</span><span style="color: rgb(0, 0, 0);">&nbsp; <br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"></span></div><br>2.</span></a><a name="_gnu_make_4.5.1"><span style="font-family: 楷体_GB2312;">变量</span><b><span lang="EN-US">VPATH<br></span></b><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">&nbsp;&nbsp; 特殊变量“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">VPATH</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”。通过变量“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">VPATH</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”可以指定依赖文件的搜索路径，当规则的依赖文件在当前目录不存在时，</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">make</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">会在此变量所指定的目录下去寻找这些依赖文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">
定义变量“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">VPATH</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”时，使用空格或者冒号（</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">:</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">）将多个需要搜索的目录分开。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">VPATH = src:../headers<br><br></span></i></b><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">依赖指定了两个搜索目录，“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">src</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”和“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">../headers</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”。对于规则“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial;" lang="EN-US">foo:foo.c</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”如果“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">foo.c</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”存在于“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">src</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”目录下，此规则等价于“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial;" lang="EN-US">foo:src:/foo.c</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”。<br>注意：此VPATH变量只对依赖有效，对于命令command无效.<br><br><br>3.变量vpath<br>&nbsp; </span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;"></span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">&nbsp;&nbsp; vpath</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”关键字（全小写的）。它不是一个变量，而是一个</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">make</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">的关键字，它所实现的功能和上一小节提到的“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">VPATH</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”变量很类似，但是它更为灵活。它可以为不同类型的文件（由文件名区分）指定不同的搜索目录。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其用法有三种：<br></span></a><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">、</span><b><i><span style="font-size: 12pt; line-height: 150%; font-family: Arial;" lang="EN-US">vpath 
PATTERN DIRECTORIES&nbsp;&nbsp;&nbsp; </span></i></b><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">&nbsp;
为所有符合模式“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">PATTERN</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”的文件指定搜索目录“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">DIRECTORIES</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2) </span><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">vpath 
PATTERN&nbsp;&nbsp;&nbsp; </span></i></b><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">清除之前为符合模式“PATTERN”的文件设置的搜索路径。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3) </span><b><i><span style="font-size: 12pt; font-family: Arial;" lang="EN-US">vpath&nbsp; </span></i></b><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">清除所有</span><br><p class="MsoNormal" style="text-align: justify; text-indent: 36.15pt; line-height: 150%;"><b><i><span style="font-size: 12pt; line-height: 150%; font-family: Arial;" lang="EN-US">eg. vpath %.h ../headers</span></i></b></p><p class="MsoNormal" style="text-align: justify; text-indent: 36.15pt; line-height: 150%;"><b><i><span style="font-size: 12pt; line-height: 150%; font-family: Arial;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span></i></b><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">其含义是：</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">Makefile</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">中出现的</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">.h</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">文件；如果不能在当前目录下找到，则到目录“</span><span style="font-size: 12pt; line-height: 150%; font-family: Arial; color: black;" lang="EN-US">../headers</span><span style="font-size: 12pt; line-height: 150%; font-family: 楷体_GB2312; color: black;">”下寻找。</span></p>一个使用vpath的例子：<br><br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 0);">vpath&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">.h&nbsp;inc<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">vpath&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">.cpp&nbsp;src<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">vpath&nbsp;</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">.c&nbsp;src<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">CC&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;g</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">USR_LIB_DIR&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">usr</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">USR_LOCAL_LIB_DIR&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">usr</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">local</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">lib<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">INCLUDES&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;inc<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">APPS&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;QoeGW<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">LIB_XMLRPC_CLIENT&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(shell&nbsp;xmlrpc</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">c</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">config&nbsp;client&nbsp;</span><span style="color: rgb(0, 0, 0);">--</span><span style="color: rgb(0, 0, 0);">ldadd)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">LIBS&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">lboost_program_options&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">lboost_thread</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">mt&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">lpcap&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">llog4cxx&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(LIB_XMLRPC_CLIENT)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">OBJS&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;G1070.o&nbsp;logInFile.o&nbsp;pcapIPv6.o&nbsp;parseRTP.o&nbsp;rtpQueue.o&nbsp;xmlrpc_client.o&nbsp;QoeGW.o<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">all:</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(APPS)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(APPS):</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(OBJS)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(CC)&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(OBJS)&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">o&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(APPS)&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(LIBS)&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">I&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(INCLUDES)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">.o:</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">.cpp<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(CC)&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">c&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">I&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(INCLUDES)&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">&lt;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">.PHONY:clean<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">clean:<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">.o&nbsp;</span><span style="color: rgb(0, 0, 0);">$</span><span style="color: rgb(0, 0, 0);">(APPS)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"></span></div><br><br>待更新....<br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1209332.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41817/" target="_blank">[新闻]Intel首次公开展示Nehalem架构迅驰3平台</a>]]></description></item><item><title> linux 的库操作命令 ar和nm  (转载)</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/27/1208736.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Tue, 27 May 2008 14:34:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/27/1208736.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1208736.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/27/1208736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1208736.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1208736.html</trackback:ping><description><![CDATA[<br>文章为转载，备忘用。<br>原文链接：http://dev.csdn.net/article/69/69405.shtm<br><br><span id="ArticleContent1_ArticleContent1_lblContent"><p>当我们的程序中有经常使用的模块，而且这种模块在其他程序中也会用到，这时按照软件重用的思想，我们应该将它们生成库，使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm，用来对库操作。 </p><p><strong>1.ar基本用法<br>2.nm基本用法命令</strong></p><p>　当我们的程序中有经常使用的模块，而且这种模块在其他程序中也会用到，这时按照软件重用的思想，我们应该将它们生成库，使得以后编程可以减少开发代码量。这里介绍两个命令ar和nm，用来对库操作。 </p><p><strong>1.ar基本用法</strong></p><p>　　ar命令可以用来创建、修改库，也可以从库中提出单个模块。库是一单独的文件，里面包含了按照特定的结构组织起来的其它的一些文件（称做此库文件的member）。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。</p><p>　　下面是ar命令的格式：</p><p>　　ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...<br></p><p>　　例如我们可以用<strong><font color="#ff0000">ar rv libtest.a hello.o hello1.o</font></strong>来
生成一个库，库名字是test，链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符，也可以
没有。下面我们来看看命令的操作选项和任选项。现在我们把{dmpqrtx}部分称为操作选项，而[abcfilNoPsSuvV]部分称为任选项。</p><p>　　{dmpqrtx}中的操作选项在命令中只能并且必须使用其中一个，它们的含义如下：</p><ul><li>d：从库中删除模块。按模块原来的文件名指定要删除的模块。如果使用了任选项v则列出被删除的每个模块。 </li><li>m：该操作是在一个库中移动成员。当库中如果有若干模块有相同的符号定义(如函数定义)，则成员的位置顺序很重要。如果没有指定任选项，任何指定的成员将移到库的最后。也可以使用'a'，'b'，或'I'任选项移动到指定的位置。 </li><li>p：显示库中指定的成员到标准输出。如果指定任选项v，则在输出成员的内容前，将显示成员的名字。如果没有指定成员的名字，所有库中的文件将显示出来。 </li><li>q：快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a'，'b'，或'I'任选项对此操作没有影响，模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时，库的符号表没有更新，可以用'ar s'或ranlib来更新库的符号表索引。 </li><li>r：在库中插入模块(替换)。当插入的模块名已经在库中存在，则替换同名的模块。如果若干模块中有一个模块在库中不存在，ar显示一个错误消息，并不替换其他同名模块。默认的情况下，新的成员增加在库的结尾处，可以使用其他任选项来改变增加的位置。 </li><li>t：显示库的模块表清单。一般只显示模块名。 </li><li>x：从库中提取一个成员。如果不指定要提取的模块，则提取库中所有的模块。 </li></ul><p>　　下面在看看可与操作选项结合使用的任选项：</p><ul><li>a：在库的一个已经存在的成员后面增加一个新的文件。如果使用任选项a，则应该为命令行中membername参数指定一个已经存在的成员名。 </li><li>b：在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项b，则应该为命令行中membername参数指定一个已经存在的成员名。 </li><li>c：创建一个库。不管库是否存在，都将创建。 </li><li>f：在库中截短指定的名字。缺省情况下，文件名的长度是不受限制的，可以使用此参数将文件名截短，以保证与其它系统的兼容。 </li><li>i：在库的一个已经存在的成员前面增加一个新的文件。如果使用任选项i，则应该为命令行中membername参数指定一个已经存在的成员名(类似任选项b)。 </li><li>l：暂未使用 </li><li>N：与count参数一起使用，在库中有多个相同的文件名时指定提取或输出的个数。 </li><li>o：当提取成员时，保留成员的原始数据。如果不指定该任选项，则提取出的模块的时间将标为提取出的时间。 </li><li>P：进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名（这样的库文件不符合POSIX标准），但是有些工具可以。 </li><li>s：写入一个目标文件索引到库中，或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。 </li><li>S：不创建目标文件索引，这在创建较大的库时能加快时间。 </li><li>u：一般说来，命令ar r...插入所有列出的文件到库中，如果你只想插入列出文件中那些比库中同名文件新的文件，就可以使用该任选项。该任选项只用于r操作选项。 </li><li>v：该选项用来显示执行操作选项的附加信息。 </li><li>V：显示ar的版本。 </li></ul><p><strong>2.nm基本用法命令</strong></p><p>　　nm用来列出目标文件的符号清单。下面是nm命令的格式：</p><p>　
　nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle]
[-D|--dynamic] [-s|--print-armap][-o|--print-file-name]
[-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort]
[--size-sort][-u|--undefined-only] [-l|--line-numbers]
[--help][--version] [-t radix|--radix=radix][-P|--portability] [-f
format|--format=format][--target=bfdname] [objfile...]<br></p><p>　　如果没有为nm命令指出目标文件，则nm假定目标文件是a.out。下面列出该命令的任选项，大部分支持"-"开头的短格式和"—"开头的长格式。</p><ul><li>-A、-o或--print-file-name：在找到的各个符号的名字前加上文件名，而不是在此文件的所有符号前只出现文件名一次。 <p>例如nm libtest.a的输出如下：</p>CPThread.o:<br>00000068 T Main__8CPThreadPv<br>00000038 T Start__8CPThread<br>00000014 T _._8CPThread<br>00000000 T __8CPThread<br>00000000 ? __FRAME_BEGIN__<br>.......................................<br><p>则nm -A 的输出如下：</p>libtest.a:CPThread.o:00000068 T Main__8CPThreadPv<br>libtest.a:CPThread.o:00000038 T Start__8CPThread<br>libtest.a:CPThread.o:00000014 T _._8CPThread<br>libtest.a:CPThread.o:00000000 T __8CPThread<br>libtest.a:CPThread.o:00000000 ? __FRAME_BEGIN__<br>..................................................................<br></li><li>-a或--debug-syms：显示调试符号。 </li><li>-B：等同于--format=bsd，用来兼容MIPS的nm。 </li><li>-C或--demangle：将低级符号名解码(demangle)成用户级名字。这样可以使得C++函数名具有可读性。 </li><li>-D或--dynamic：显示动态符号。该任选项仅对于动态目标(例如特定类型的共享库)有意义。 </li><li>-f format：使用format格式输出。format可以选取bsd、sysv或posix，该选项在GNU的nm中有用。默认为bsd。 </li><li>-g或--extern-only：仅显示外部符号。 </li><li>-n、-v或--numeric-sort：按符号对应地址的顺序排序，而非按符号名的字符顺序。 </li><li>-p或--no-sort：按目标文件中遇到的符号顺序显示，不排序。 </li><li>-P或--portability：使用POSIX.2标准输出格式代替默认的输出格式。等同于使用任选项-f posix。 </li><li>-s或--print-armap：当列出库中成员的符号时，包含索引。索引的内容包含：哪些模块包含哪些名字的映射。 </li><li>-r或--reverse-sort：反转排序的顺序(例如，升序变为降序)。 </li><li>--size-sort：按大小排列符号顺序。该大小是按照一个符号的值与它下一个符号的值进行计算的。 </li><li>-t radix或--radix=radix：使用radix进制显示符号值。radix只能为"d"表示十进制、"o"表示八进制或"x"表示十六进制。 </li><li>--target=bfdname：指定一个目标代码的格式，而非使用系统的默认格式。 </li><li>-u或--undefined-only：仅显示没有定义的符号(那些外部符号)。 </li><li>-l或--line-numbers：对每个符号，使用调试信息来试图找到文件名和行号。对于已定义的符号，查找符号地址的行号。对于未定义符号，查找指向符号重定位入口的行号。如果可以找到行号信息，显示在符号信息之后。 </li><li>-V或--version：显示nm的版本号。 </li><li>--help：显示nm的任选项。 </li></ul></span><br><img src ="http://www.cnblogs.com/shipfi/aggbug/1208736.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41816/" target="_blank">[新闻]Pogo浏览器</a>]]></description></item><item><title>“实际用户ID”、“有效用户ID”和“保存的设置用户ID”</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/14/1197015.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Wed, 14 May 2008 09:21:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/14/1197015.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1197015.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/14/1197015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1197015.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1197015.html</trackback:ping><description><![CDATA[<div align="left">&nbsp;在看《Unix环境编程》这本书的时候，这三个概念一直闹得不清楚.&nbsp; 书上讲得也不是太仔细（太高估俺的智商啦）.<br>&nbsp;一方面，涉及到多进程IPC的程序中关于uid的设置，代码看得让人摸不着头脑.<br>&nbsp;网上有这方面的说明，中文太多的文章都是了了.且一成不变，都是一大抄.<br><br>&nbsp;还是chinaunix上面对于这几个概念回答的比较到位. 有深度也有广度.<br><br><br>&nbsp;这篇贴子在：http://bbs.chinaunix.net/viewthread.php?tid=820766<br>&nbsp;<br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1197015.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41807/" target="_blank">[新闻]洪磊口述:番茄花园如何捆绑流氓软件月入十万</a>]]></description></item><item><title>我在Linux中的.vimrc配置 (附taglist+ctags使用)</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/08/1187587.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Wed, 07 May 2008 16:38:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/08/1187587.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1187587.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/08/1187587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1187587.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1187587.html</trackback:ping><description><![CDATA[vim+taglist+ctags使用说明：<br>http://bbs.chinaunix.net/viewthread.php?tid=699109&amp;extra=page%3D2<br><br>不过其中有以下语句，改成：<br>&nbsp; let Tlist_Ctags_Cmd = "/usr/local/bin/exctags"<br>&nbsp; =&gt;let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"<br><br><br>以下附上我在Linux中的.vimrc配置：<br>"if v:lang =~ "utf8$" || v:lang =~ "utf-8$"<br>"&nbsp;&nbsp; set fileencodings=utf-8,latin1<br>"endif<br>set encoding=utf-8<br>"set fileencodings=ucs-bom,utf-8,chinese<br>"set fileencoding=gb188030<br>set fileencoding=utf-8<br>set langmenu=C<br>set fileencodings=utf-8,gb18030,utf-16,big5<br>language messages C<br><br>let &amp;termencoding=&amp;encoding<br>"set fileencodings=utf-8,gbk,ucs-bom,cp936 <br><br>set nocompatible&nbsp;&nbsp;&nbsp; " Use Vim defaults (much better!)<br>set bs=indent,eol,start&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " allow backspacing over everything in insert mode<br>"set ai&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " always set autoindenting on<br>"set backup&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " keep a backup file<br>set viminfo='20,\"50&nbsp;&nbsp;&nbsp; " read/write a .viminfo file, don't store more<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " than 50 lines of registers<br>set history=50&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " keep 50 lines of command line history<br>set ruler&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " show the cursor position all the time<br>set cindent<br>set ts=4<br>set shiftwidth=4<br>syntax on<br>syntax enable<br><br>set cscopequickfix=s-,c-,d-,i-,t-,e-<br>"set encoding=utf-8<br><br>"-------Code ZheDie-----------------<br>"set foldcolumn=4<br>"set foldmethod=indent<br>"set foldmethod = syntax<br>"set foldlevel=100<br><br>let&nbsp;&nbsp;&nbsp; Tlist_Show_One_File=1<br>let Tlist_Exit_OnlyWindow=1<br>set cscopequickfix=s-,c-,d-,i-,t-,e-<br><br>" Only do this part when compiled with support for autocommands<br>if has("autocmd")<br>&nbsp; " In text files, always limit the width of text to 78 characters<br>&nbsp; autocmd BufRead *.txt set tw=78<br>&nbsp; " When editing a file, always jump to the last cursor position<br>&nbsp; autocmd BufReadPost *<br>&nbsp; \ if line("'\"") &gt; 0 &amp;&amp; line ("'\"") &lt;= line("$") |<br>&nbsp; \&nbsp;&nbsp; exe "normal! g'\"" |<br>&nbsp; \ endif<br>endif<br><br>if has("cscope") &amp;&amp; filereadable("/usr/bin/cscope")<br>&nbsp;&nbsp; set csprg=/usr/bin/cscope<br>&nbsp;&nbsp; set csto=0<br>&nbsp;&nbsp; set cst<br>&nbsp;&nbsp; set nocsverb<br>&nbsp;&nbsp; " add any database in current directory<br>&nbsp;&nbsp; if filereadable("cscope.out")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs add cscope.out<br>&nbsp;&nbsp; " else add database pointed to by environment<br>&nbsp;&nbsp; elseif $CSCOPE_DB != ""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cs add $CSCOPE_DB<br>&nbsp;&nbsp; endif<br>&nbsp;&nbsp; set csverb<br>endif<br><br>" Switch syntax highlighting on, when the terminal has colors<br>" Also switch on highlighting the last used search pattern.<br>if &amp;t_Co &gt; 2 || has("gui_running")<br>&nbsp; syntax on<br>&nbsp; set hlsearch<br>endif<br><br>if &amp;term=="xterm"<br>&nbsp;&nbsp;&nbsp;&nbsp; set t_Co=8<br>&nbsp;&nbsp;&nbsp;&nbsp; set t_Sb=[4%dm<br>&nbsp;&nbsp;&nbsp;&nbsp; set t_Sf=[3%dm<br>endif<br><br>""""""""""""""""""""""""""""""<br>" Tag list (ctags)<br>""""""""""""""""""""""""""""""<br>"if MySys() == "windows"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "设定windows系统中ctags程序的位置<br>&nbsp;"&nbsp; let Tlist_Ctags_Cmd = 'ctags'<br>"elseif MySys() == "linux"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "设定linux系统中ctags程序的位置<br>let Tlist_Ctags_Cmd = '/usr/bin/ctags'<br>"endif<br>let Tlist_Show_One_File = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "不同时显示多个文件的tag，只显示当前文件的<br>let Tlist_Exit_OnlyWindow = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "如果taglist窗口是最后一个窗口，则退出vim<br>let Tlist_Use_Right_Window = 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "在右侧窗口中显示taglist窗口 <br><br><img src ="http://www.cnblogs.com/shipfi/aggbug/1187587.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41813/" target="_blank">[新闻]2008年8月21日IT博客精选：盖茨复出？</a>]]></description></item><item><title>我在wnidows中的vim配置</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/07/1186508.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Wed, 07 May 2008 03:26:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/07/1186508.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1186508.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/07/1186508.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1186508.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1186508.html</trackback:ping><description><![CDATA[set nocompatible<br>set nu<br>set ic<br>set ts=4<br>set shiftwidth=4<br>set fileencodings=utf-8,chinese,latin-1,ucs-bom,gb18030,big5,euc-jp,sjis,euc-kr,EUC<br>if has("win32")<br>" for chinese<br>&nbsp; set fileencoding=chinese<br>" for japanese-euc<br>"&nbsp; set fenc=euc-jp<br>" for japanese shift-jis<br>"&nbsp;&nbsp; set fenc=sjis<br>else<br>&nbsp; set fileencoding=utf-8<br>endif<br><br><br>"set enc=utf-8&nbsp; "default for utf-8<br><br>"set for chinese GB2312<br>"set enc=cp936<br>"set fenc=cp936<br><br>"Just for show japanese<br>"set enc=cp932&nbsp;&nbsp; "for jp_EUC<br>"set fenc=euc-jp "for jp_EUC <br><br>set enc=sjis&nbsp;&nbsp;&nbsp; "for shift-JIS<br>set fenc=sjis&nbsp;&nbsp; "for shift-JIS<br><br>set cindent<br>language message zh_CN.utf-8<br>"for jp language<br>"language message jp.utf-8<br><br>"language message <br>"解决乱码菜单<br>source $VIMRUNTIME/delmenu.vim<br>source $VIMRUNTIME/menu.vim<br>"set font<br>set guifont=Nsimsun<br><br><br>set nobackup<br><br>set nobackup<br>colorscheme koehler<br>source $VIMRUNTIME/vimrc_example.vim<br>source $VIMRUNTIME/mswin.vim<br>behave mswin<br><br>set diffexpr=MyDiff()<br>function MyDiff()<br>&nbsp; let opt = '-a --binary '<br>&nbsp; if &amp;diffopt =~ 'icase' | let opt = opt . '-i ' | endif<br>&nbsp; if &amp;diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif<br>&nbsp; let arg1 = v:fname_in<br>&nbsp; if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif<br>&nbsp; let arg2 = v:fname_new<br>&nbsp; if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif<br>&nbsp; let arg3 = v:fname_out<br>&nbsp; if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif<br>&nbsp; let eq = ''<br>&nbsp; if $VIMRUNTIME =~ ' '<br>&nbsp;&nbsp;&nbsp; if &amp;sh =~ '\&lt;cmd'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let cmd = '""' . $VIMRUNTIME . '\diff"'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let eq = '"'<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'<br>&nbsp;&nbsp;&nbsp; endif<br>&nbsp; else<br>&nbsp;&nbsp;&nbsp; let cmd = $VIMRUNTIME . '\diff'<br>&nbsp; endif<br>&nbsp; silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' &gt; ' . arg3 . eq<br>endfunction<br><br>" color default<br>:colorscheme darkblue<br>" language english<br>:lang eng<br><br>let fcomm = "fenc"<br>let optval = eval('&amp;'.fcomm)<br>if optval=="cp936"<br>&nbsp;&nbsp;&nbsp; set guifont=Nsimsun<br>&nbsp;&nbsp;&nbsp; "echo "CP936"<br>elseif optval=="cp932"<br>&nbsp;&nbsp;&nbsp; set guifont=msmincho<br>elseif optval=="sjis"<br>&nbsp;&nbsp;&nbsp; set guifont=msmincho<br>endif<br><br><br><div align="left"><br>另外，还有一些有用的插件，见<br>http://learn.tsinghua.edu.cn:8080/2005212716/html/vimplugins.html<br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1186508.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41812/" target="_blank">[新闻]微软宣布将斥资1亿美元购买Novell证书</a>]]></description></item><item><title>typedef与函数指针 (转载)</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/06/1184942.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Tue, 06 May 2008 04:56:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/06/1184942.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1184942.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/06/1184942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1184942.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1184942.html</trackback:ping><description><![CDATA[<div align="left"><span id="ArticleContent1_ArticleContent1_lblContent"><div><font color="#a0a0a0" size="3"><em><span style="color: rgb(153, 51, 0);">在typedef的使用中，最麻烦的是指向函数的指针，如果没有下面的函数，你知道下面这个表达式的定义以及如何使用它吗？</span></em></font></div>
<span style="color: rgb(153, 51, 0);">
<div>&nbsp;</div>
<div><font size="3"><strong><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue;">int</span></strong><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><font color="#000000"> (*</font><strong><span style="color: red;">s_calc_func</span></strong><font color="#000000">(</font><strong><span style="color: blue;">char</span></strong><font color="#000000"> op))(</font><strong><span style="color: blue;">int</span></strong><font color="#000000">, </font><strong><span style="color: blue;">int</span></strong><font color="#000000">);</font></span></font></div>
<div>&nbsp;</div>
<div>如果不知道，请看下面的程序，里面有比较详细的说明</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">定义四个函数</span></em></font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> <strong>add</strong>(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>);</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> <strong>sub</strong>(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>);</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> <strong>mul</strong>(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>);</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> <strong>div</strong>(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>);</font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">定义指向这类函数的指针</span></em></font></div>
<div><font size="2"><strong><span style="color: blue;">typedef</span></strong> <strong><span style="color: blue;">int</span></strong> (*<strong>FP_CALC</strong>)(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>);</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">我先不介绍，大家能看懂下一行的内容吗？</span></em></font></div>
<div><font size="2"><strong><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: blue;">int</span></strong><span style="background: rgb(217, 217, 217) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> (*<strong><span style="color: red;">s_calc_func</span></strong>(<strong><span style="color: blue;">char</span></strong> op))(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>);</span></font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">下一行的内容与上一行完全相同，</span></em></font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">定义一个函数</span></em><em><span style="color: rgb(153, 51, 0);">calc_func</span></em><em><span style="color: rgb(153, 51, 0);">，它根据操作字符</span></em><em><span style="color: rgb(153, 51, 0);"> op </span></em><em><span style="color: rgb(153, 51, 0);">返回指向相应的计算函数的指针</span></em></font></div>
<div><font size="2"><strong>FP_CALC</strong> calc_func(<strong><span style="color: blue;">char</span></strong> op); </font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">根据</span></em><em><span style="color: rgb(153, 51, 0);"> op </span></em><em><span style="color: rgb(153, 51, 0);">返回相应的计算结果值</span></em></font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> calc(<strong><span style="color: blue;">int</span></strong> a, <strong><span style="color: blue;">int</span></strong> b, <strong><span style="color: blue;">char</span></strong> op);</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> add(<strong><span style="color: blue;">int</span></strong> a, <strong><span style="color: blue;">int</span></strong> b)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> a + b;</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> sub(<strong><span style="color: blue;">int</span></strong> a, <strong><span style="color: blue;">int</span></strong> b)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> a - b;</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> mul(<strong><span style="color: blue;">int</span></strong> a, <strong><span style="color: blue;">int</span></strong> b)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> a * b;</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> div(<strong><span style="color: blue;">int</span></strong> a, <strong><span style="color: blue;">int</span></strong> b)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> b? a/b : -1;</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">这个函数的用途与下一个函数作业和调用方式的完全相同，</span></em></font></div>
<div><font size="2"><em><span style="color: rgb(153, 51, 0);">// </span></em><em><span style="color: rgb(153, 51, 0);">参数为</span></em><em><span style="color: rgb(153, 51, 0);">op</span></em><em><span style="color: rgb(153, 51, 0);">，而不是最后的两个整形</span></em></font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> (*s_calc_func(<strong><span style="color: blue;">char</span></strong> op)) (<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> calc_func(op);</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><strong>FP_CALC</strong> calc_func(<strong><span style="color: blue;">char</span></strong> op)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">switch</span></strong> (op)</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; {</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">case</span></strong> '+': <strong><span style="color: blue;">return</span></strong> add;</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">case</span></strong> '-': <strong><span style="color: blue;">return</span></strong> sub;</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">case</span></strong> '*': <strong><span style="color: blue;">return</span></strong> mul;</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">case</span></strong> '/': <strong><span style="color: blue;">return</span></strong> div;</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">default</span></strong>:</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> <strong><span style="color: blue;">NULL</span></strong>;</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; }</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">return</span></strong> <strong><span style="color: blue;">NULL</span></strong>;</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><strong><span style="color: blue;">int</span></strong> calc(<strong><span style="color: blue;">int</span></strong> a, <strong><span style="color: blue;">int</span></strong> b, <strong><span style="color: blue;">char</span></strong> op)</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong>FP_CALC</strong> fp = calc_func(op); <em><span style="color: rgb(153, 51, 0);">// </span></em></span><em><span style="color: rgb(153, 51, 0);">下面是类似的直接定义指向函数指针变量</span></em></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em><span style="color: rgb(153, 51, 0);">// </span></em></span><em><span style="color: rgb(153, 51, 0);">下面这行是不用</span></em><em><span style="color: rgb(153, 51, 0);">typedef</span></em><em><span style="color: rgb(153, 51, 0);">，来实现指向函数的指针的例子，麻烦！</span></em></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">int</span></strong> (*s_fp)(<strong><span style="color: blue;">int</span></strong>, <strong><span style="color: blue;">int</span></strong>) = s_calc_func(op);</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <em><span style="color: rgb(153, 51, 0);">//<strong> ASSERT</strong>(fp == s_fp);&nbsp;// </span></em></span><em><span style="color: rgb(153, 51, 0);">可以断言这俩是相等的</span></em></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">if</span></strong> (fp) <strong><span style="color: blue;">return</span></strong> fp(a, b);</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">else</span></strong> <strong><span style="color: blue;">return</span></strong> -1;</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><strong><span style="color: blue;">void</span></strong> test_fun()</font></div>
<div><font size="2">{</font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; <strong><span style="color: blue;">int</span></strong> a = 100, b = 20;</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp;&nbsp; printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));</span></font></div>
<div><font size="2">}</font></div>
<div><font size="2">&nbsp;</font></div>
<div><font size="2"><strong>运行结果</strong></font></div>
<div><font size="2"><span>&nbsp;&nbsp; calc(100, 20, +) = 120</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp; calc(100, 20, -) = 80</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp; calc(100, 20, *) = 2000</span></font></div>
<div><font size="2"><span>&nbsp;&nbsp; calc(100, 20, /) = 5</span></font></div>
</span></span></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1184942.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41811/" target="_blank">[新闻]携程谷歌将联合发旅游榜单</a>]]></description></item><item><title>Vim - 容易忘记但又比较常用的操作 (之一)</title><link>http://www.cnblogs.com/shipfi/archive/2008/05/04/1182400.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Sun, 04 May 2008 14:16:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/05/04/1182400.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1182400.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/05/04/1182400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1182400.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1182400.html</trackback:ping><description><![CDATA[<div align="left">(一) 容易忘记但又比较常用的操作:<br>&nbsp;&nbsp; (1) 移动<br>&nbsp;&nbsp;&nbsp; w/W : 移至一个字(word)字首, 大小写区别分别为忽略标点符号<br>&nbsp;&nbsp;&nbsp; e/E : 移至一个字尾 , 大小写区别同上<br>&nbsp;&nbsp;&nbsp; b/B : 移至前一个字首<br>&nbsp;&nbsp;&nbsp; H/M/L : 移至屏幕顶/屏幕中/屏幕尾<br>&nbsp;&nbsp;&nbsp; :n 移至n行行首,或nG<br><br>&nbsp;&nbsp;&nbsp; ( : 移至下一个句子<br>&nbsp;&nbsp;&nbsp; ) : 移至上一个句子<br>&nbsp;&nbsp;&nbsp; } : 移至下一个段落<br>&nbsp;&nbsp;&nbsp; { : 移至上一个段落 <br><br>&nbsp;&nbsp; (2) 匹配<br>&nbsp;&nbsp;&nbsp; % : 匹配{} / [] / ()<br><br>&nbsp;&nbsp; (3) 操作<br>&nbsp;&nbsp;&nbsp; J : 将下一行整行接至本行<br><br>&nbsp;&nbsp; (4) 删除<br>&nbsp;&nbsp;&nbsp; d0/d^&nbsp; : 删除至行首<br>&nbsp;&nbsp;&nbsp; d$&nbsp;&nbsp;&nbsp;&nbsp; : 删除至行尾<br><br>&nbsp;&nbsp; (5) 取代及还原<br>&nbsp;&nbsp;&nbsp;&nbsp; cc/S : 取代整行内容.<br>&nbsp;&nbsp;&nbsp; &nbsp;cw&nbsp;&nbsp; : 取代一个英文字<br>&nbsp;&nbsp;&nbsp; &nbsp;C/c$ : 取代至行尾<br>&nbsp;&nbsp;&nbsp; &nbsp;c0/c^: 取代至行首<br>&nbsp;&nbsp;&nbsp; &nbsp;R/s&nbsp; : 进行取代模式 /R为覆盖式取代,S为插入式取代<br><br>&nbsp;&nbsp; (6) 加上数目字:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5J&nbsp;&nbsp; : 将5行并成一行<br>&nbsp;&nbsp;&nbsp; &nbsp; 5i A : 按Esc键后,插入5个A.<br>&nbsp;&nbsp;&nbsp; &nbsp; 2i sys : 插入syssyssys.<br><br>&nbsp;&nbsp; (7) 格式化文本:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gg=G : 全文本缩进<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :ce(nter)&nbsp; : 本行文字居中<br>&nbsp;&nbsp;&nbsp; &nbsp; :ri(ght)&nbsp;&nbsp; : 本行文字靠右<br>&nbsp;&nbsp;&nbsp; &nbsp; :le(ft)&nbsp;&nbsp;&nbsp; : 本行文字靠左<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gqap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 整段重排&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp; gqq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 本行重排<br>&nbsp;&nbsp;&nbsp; &nbsp; gqG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 全文重排<br>&nbsp;&nbsp;&nbsp; &nbsp; 如果是利用 visual mode 所標記起來的部份，只要按 gq 就會只重排被標記的部份。<br><br>&nbsp;&nbsp; (8) 复制(yank)<br>&nbsp;&nbsp;&nbsp; &nbsp; y2y&nbsp; : 复制2行<br>&nbsp;&nbsp;&nbsp; &nbsp; y2w&nbsp; : 复制2个字<br>&nbsp;&nbsp;&nbsp; &nbsp; y1G&nbsp; : 复制到档首<br>&nbsp;&nbsp;&nbsp; &nbsp; yG&nbsp;&nbsp; : 复制到档尾<br>&nbsp;&nbsp;&nbsp; &nbsp; y^／y0&nbsp;&nbsp; : 复制到行首<br>&nbsp;&nbsp;&nbsp; &nbsp; y$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 复制到行尾<br>&nbsp;&nbsp;&nbsp; &nbsp; "ayy : 将本行文字复制到a缓冲区<br>&nbsp;&nbsp;&nbsp; &nbsp; "ap&nbsp; : 将a缓冲区文本粘贴到当前文本<br>&nbsp;&nbsp;&nbsp; &nbsp; :reg : 列出所有registers的代码和容<br>&nbsp;&nbsp;&nbsp; &nbsp; "+yy : 将本行复制到全局缓冲区。:reg 指令中"+<br>&nbsp;&nbsp;&nbsp; &nbsp; 表示全局缓冲，复制到全局缓冲后，可以用其它软件进行复制/粘贴操作。<br>&nbsp;&nbsp;&nbsp; &nbsp; "+p&nbsp; : 从全局缓冲粘贴到当前文本。<br>&nbsp;&nbsp;&nbsp; &nbsp; “*yy : 在vim中选中文本后（反白显示），该文件就会被复制到"*缓冲区<br><br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1182400.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41810/" target="_blank">[新闻]商刊:Google不可能永远领先 微软寄希望于时间</a>]]></description></item><item><title>自定义实现的signal函数</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/23/1167858.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Wed, 23 Apr 2008 09:25:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/23/1167858.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1167858.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/23/1167858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1167858.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1167858.html</trackback:ping><description><![CDATA[摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include&lt;signal.h&gt;#include&lt;stdio.h&gt;#include&lt;setjmp.h&gt;/**//**signalfunctionusesigacti&nbsp;&nbsp;<a href='http://www.cnblogs.com/shipfi/archive/2008/04/23/1167858.html'>阅读全文</a><img src ="http://www.cnblogs.com/shipfi/aggbug/1167858.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41809/" target="_blank">[新闻]微软下周四将发布IE 8 Beta 2,正式版将于11月推出</a>]]></description></item><item><title>调试用的宏代码</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/22/1166362.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Tue, 22 Apr 2008 14:29:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/22/1166362.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1166362.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/22/1166362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1166362.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1166362.html</trackback:ping><description><![CDATA[以下是可以直接用来在C源程序中使用的宏函数，用来得到一些信息。包括打印源文件名，行数，日期，时间等。<br><br>对于这些调试信息，还可以进行扩充。<br><br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 255);">#define</span><span style="color: rgb(0, 0, 0);">&nbsp;DEBUG_PRINT&nbsp;&nbsp;printf(&nbsp;"File:&nbsp;%s;\nLine:&nbsp;%d;\n"&nbsp;\</span><span style="color: rgb(0, 0, 0);"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">Date:&nbsp;%s;\nTime:&nbsp;%s;\n</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;\<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">Is&nbsp;stand&nbsp;STDC:%s;\n</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,&nbsp;\<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__FILE__,__LINE__,&nbsp;\<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__DATE__,__TIME__,&nbsp;\<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(__STDC__)</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">yes</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">no</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"></span></div><br><img src ="http://www.cnblogs.com/shipfi/aggbug/1166362.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41808/" target="_blank">[新闻]Ubuntu老大手下得力干将被Mozilla挖角</a>]]></description></item><item><title>Cscope 的使用</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/21/1164146.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Mon, 21 Apr 2008 08:36:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/21/1164146.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1164146.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/21/1164146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1164146.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1164146.html</trackback:ping><description><![CDATA[<div align="left">在vim中，使用Cscope来快速定位函数的定义，查找函数的原型，很方便。<br><br>在我Fedora8的机器中，已经默认安装了cscope这个程序。<br><br>刚刚使用cscope，不是很熟悉，很多“先进的”功能留待以后慢慢挖掘。 这里先写一下vim中简单的使用cscope，以便能够在源代码中：<br>&nbsp;1. 快速切换至函数的定义。<br>&nbsp;2. 函数的声明.<br>&nbsp;3. 查找某个函数被使用的情况。<br><br>首先，让vim支持cscope,在~/.vimrc中加入：<br>"set cscopequickfix=s-,c-,d-,i-,t-,e-"<br><br>其次，要在源代码目录内生成相关的cscope的信息.<br>这里以libpcap代码为例<br>#cd /usr/code/libpcap<br>#cscope -Rbq<br><br>#把生成的cscope文件导入到vim中来<br>#:cs add /usr/code/libpcap/cscope.out /usr/code/libpcap/<br><br>下面就可以在vim中进行实际演练操作了.<br><br>1.把光标移到某个函数上，使用Ctrl+],就可以跳到函数的定义中.<br><br>2.查找某个函数的声明和定义：<br>&nbsp; :cs find g strcpy<br><br>3.如果出现找出多个函数声明和定义的情况，可以使用quickFix窗口进行选择切换：<br>&nbsp;&nbsp; :cw<br><br>另外，更多功能可以查找相关的帮助，以下转载了一些cs find的技巧. 可以用得着.<br><br>-----以下为转载的.&nbsp; 作者(吴垠)<br>--------http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx<br>cscope的主要功能是通过同的子命令"find"来实现的<br>"cscope find"的用法:<br>cs find c|d|e|f|g|i|s|t name<br>            <table style="width: 50%; text-align: left;" border="1" cellpadding="2" cellspacing="2">                <tbody>                    <tr>                        <td style="vertical-align: top; width: 20%;">0 或 s</td>                        <td style="vertical-align: top;">查找本 C 符号(可以跳过注释)</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">1 或 g</td>                        <td style="vertical-align: top;">查找本定义</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">2 或 d</td>                        <td style="vertical-align: top;">查找本函数调用的函数</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">3 或 c</td>                        <td style="vertical-align: top;">查找调用本函数的函数</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">4 或 t</td>                        <td style="vertical-align: top;">查找本字符串</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">6 或 e</td>                        <td style="vertical-align: top;">查找本 egrep 模式</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">7 或 f</td>                        <td style="vertical-align: top;">查找本文件</td>                    </tr>                    <tr>                        <td style="vertical-align: top;">8 或 i</td>                        <td style="vertical-align: top;">查找包含本文件的文件</td>                    </tr>                </tbody>            </table>            <br>如果每次查找都要输入一长串命令的话还真是件讨人厌的事情, Cscope的帮助手册中推荐了一些快捷键的用法, 下面是其中一组, 也是我用的, 将下面的内容添加到~/.vimrc中, 并重启vim:<br>            <table style="width: 538px; height: 174px; text-align: left;" border="0" cellpadding="2" cellspacing="2">                <tbody>                    <tr>                        <td style="vertical-align: top; background-color: rgb(204, 204, 204);">nmap &lt;C-_&gt;s :cs find s &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br>nmap &lt;C-_&gt;g :cs find g &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br>nmap &lt;C-_&gt;c :cs find c &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br>nmap &lt;C-_&gt;t :cs find t &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br>nmap &lt;C-_&gt;e :cs find e &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;<br>nmap &lt;C-_&gt;f :cs find f &lt;C-R&gt;=expand("&lt;cfile&gt;")&lt;CR&gt;&lt;CR&gt;<br>nmap &lt;C-_&gt;i :cs find i ^&lt;C-R&gt;=expand("&lt;cfile&gt;")&lt;CR&gt;$&lt;CR&gt;<br>nmap &lt;C-_&gt;d :cs find d &lt;C-R&gt;=expand("&lt;cword&gt;")&lt;CR&gt;&lt;CR&gt;</td>                    </tr>                </tbody>            </table>            当光标停在某个你要查找的词上时, 按下&lt;C-_&gt;g, 就是查找该对象的定义, 其他的同理.<br>按这种组合键有一点技巧,按了&lt;C-_&gt;后要马上按下一个键,否则屏幕一闪就回到nomal状态了<br>&lt;C-_&gt;g的按法是先按"Ctrl+Shift+-", 然后很快再按"g"<br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1164146.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41806/" target="_blank">[新闻]丁丁网正加速区域扩张 第三轮融资已排入日程</a>]]></description></item><item><title>Bash脚本编程－－学习篇1</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/19/1161751.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Sat, 19 Apr 2008 15:37:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/19/1161751.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1161751.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/19/1161751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1161751.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1161751.html</trackback:ping><description><![CDATA[<div align="left">在bash脚本编程中，有些地方比较容易迷惑，也容易出错。<br>今天就碰到一例，例如：<br><br><br>if["$UID" -ne "$ROOT_UID"]<br>then<br>&nbsp;&nbsp;&nbsp;&nbsp; echo "Must be root to run this script"<br>&nbsp;&nbsp;&nbsp;&nbsp; exit $E_NOTROOT<br>fi<br><br>就以上几行代码，就有两处错误。<br><br>1） if和[之间没有空格。 产生错误。<br>2)&nbsp; [和"之间，"和]之间没有空格，产生错误。<br><br>也许是写C代码写习惯了，不经意间就像写C程序一样的语法和格式。<br>其实，为什么要有空格也比较好理解，因为是shell脚本嘛,最终还是执行的shell命令。如果没有空格，以上语句：<br>if["$UID" -ne "$ROOT_UID"]<br>shell完全可以理解成：<br>if["$UID" －－＞由于没有空格，它会不会是命令呢？？？？<br><br>所以，在写shell脚本的时候，空格是一定要注意的。<br><br><br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1161751.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41805/" target="_blank">[新闻]张亚勤一改陈永正做法 微软举报洪磊为推广Vista</a>]]></description></item><item><title>一个通用的调用shell命令及打印退出状态的C语言实现</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/18/1160124.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Fri, 18 Apr 2008 08:31:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/18/1160124.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1160124.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/18/1160124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1160124.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1160124.html</trackback:ping><description><![CDATA[摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1#include&lt;stdio.h&gt;2#include&lt;stdlib.h&gt;3#include&lt;unistd.h&gt;4#include&lt;string.h&gt;5#i&nbsp;&nbsp;<a href='http://www.cnblogs.com/shipfi/archive/2008/04/18/1160124.html'>阅读全文</a><img src ="http://www.cnblogs.com/shipfi/aggbug/1160124.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>转载：浅议Unix的defunct进程(“僵尸”进程)</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/18/1159578.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Fri, 18 Apr 2008 03:27:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/18/1159578.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1159578.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/18/1159578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1159578.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1159578.html</trackback:ping><description><![CDATA[最近在看Stevens的《Unix环境编程》,其中第八章讲到了进程的控制，里面有关于僵死进程的描述，但看完后还是不是很了解。<br><br>网上有一篇《浅议Unix的defunct进程》的文章，其原理描述的比较详细有用，所以转载到此。<br><br><font color="#ff0000">

			本文出自:http://www2.ccw.com.cn 作者: 张道新 赵国明 </font><br><br>在Unix系统管理中，当用ps命令
观察进程的执行状态时，经常看到某些进程的状态栏为defunct，这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程，但在进程表
（processs
table）中仍占了一个位置（slot）。由于进程表的容量是有限的，所以，defunct进程不仅占用系统的内存资源，影响系统的性能，而且如果其数
目太多，还会导致系统瘫痪。<br><br>我们知道，每个Unix进程在进程表里都有一个进入点（entry），核心程序执行该进程时使用到的一切信息
都存储在进入点。当用ps命令察看系统中的进程信息时，看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后，核心进程就会在进程
表中给这个新进程分配一个进入点，然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期
后，它会执行exit()系统调用，此时原来进程表中的数据会被该进程的退出码（exit
code）、执行时所用的CPU时间等数据所取代，这些数据会一直保留到系统将它传递给它的父进程为止。由此可见，defunct进程的出现时间是在子进
程终止后，但是父进程尚未读取这些数据之前。利用这一点我们可以用下面的程序建立一个defunct 进程：<br><br><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">&nbsp;1</span><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><span style="color: rgb(0, 0, 0);">#include&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdio.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;2</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">sys</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">main.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;3</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">stdlib.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;4</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">unistd.h</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;5</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"><br></span><span style="color: rgb(0, 128, 128);">&nbsp;6</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;main()<br></span><span style="color: rgb(0, 128, 128);">&nbsp;7</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_93_256_Open_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_93_256_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_93_256_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_93_256_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_93_256_Closed_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_93_256_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_93_256_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_93_256_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_93_256_Closed_Text" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;"><img src="http://www.cnblogs.com/images/dot.gif"></span><span id="Codehighlighter1_93_256_Open_Text"><span style="color: rgb(0, 0, 0);">{<br></span><span style="color: rgb(0, 128, 128);">&nbsp;8</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">fork())<br></span><span style="color: rgb(0, 128, 128);">&nbsp;9</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_115_183_Open_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_115_183_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_115_183_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_115_183_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_115_183_Closed_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_115_183_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_115_183_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_115_183_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_115_183_Closed_Text" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255); display: none;"><img src="http://www.cnblogs.com/images/dot.gif"></span><span id="Codehighlighter1_115_183_Open_Text"><span style="color: rgb(0, 0, 0);">{<br></span><span style="color: rgb(0, 128, 128);">10</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(“child&nbsp;pid</span><span style="color: rgb(0, 0, 0);">=%</span><span style="color: rgb(0, 0, 0);">d\n”,&nbsp;getpid());<br></span><span style="color: rgb(0, 128, 128);">11</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">)<br></span><span style="color: rgb(0, 128, 128);">12</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br></span><span style="color: rgb(0, 128, 128);">13</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: rgb(128, 0, 128);">20</span><span style="color: rgb(0, 0, 0);">);<br></span><span style="color: rgb(0, 128, 128);">14</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf(“parent&nbsp;pid</span><span style="color: rgb(0, 0, 0);">=%</span><span style="color: rgb(0, 0, 0);">d&nbsp;\n”,&nbsp;getpid());<br></span><span style="color: rgb(0, 128, 128);">15</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: rgb(128, 0, 128);">0</span><span style="color: rgb(0, 0, 0);">);<br></span><span style="color: rgb(0, 128, 128);">16</span><span style="color: rgb(0, 0, 0);"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div><br><br>当
上述程序以后台的方式执行时，第8行强迫程序睡眠20秒，让用户有时间输入ps -e指令，观察进程的状态。当父进程执行终止后，再用ps
-e命令观察时，我们会发现defunct进程也随之消失。这是因为父进程终止后，init 进程会接管父进程留下的这些“孤儿进程”（orphan
process），而这些“孤儿进程”执行完后，它在进程表中的进入点将被删除。如果一个程序设计上有缺陷，就可能导致某个进程的父进程一直处于睡眠状态
或是陷入死循环，那么当该子进程执行结束后就变成了defunct进程，这个defunct 进程可能会一直留在系统中直到系统重新启动。<br><br>如果我们将上述程序略作修改，在第8行sleep()系统调用前执行wait()或waitpid()系统调用，则子进程在终止后会立即把它在进程表中的数据返回给父进程，此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。<br><br>由于调度程序无法选中Defunct 进程，所以不能用kill命令删除Defunct 进程，惟一的方法只有重启系统。<br><br><br><div align="left"><br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1159578.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41802/" target="_blank">[新闻]微软Office 14即将展开Alpha测试</a>]]></description></item><item><title>Ctags 的使用</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/12/1150824.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Sat, 12 Apr 2008 15:32:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/12/1150824.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1150824.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/12/1150824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1150824.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1150824.html</trackback:ping><description><![CDATA[1. 在源程序中的最上层目录键入ctags命令：<br>&nbsp;&nbsp;&nbsp; 例如，在/home/shipfi/Code/Qoe目录下键入：<br>&nbsp;&nbsp;&nbsp; #ctags -R<br>&nbsp;&nbsp; 以上命令会在当前目录下生成tags文件。<br><br>2. 当使用vim打开文件后，键入以下命令：<br>&nbsp;&nbsp; :set tags=/home/shipfi/Code/Qoe/tags<br><br>3.以上设置后，就可以在源文件中使用Ctrl+]来进行源文件中的相关函数的跳转。<br><br>4.也可以将这句话放到~/.vimrc中去, 如果你经常在这个工程编程的话.<br><br>5.如果此时你还想再跳回刚才的位置, 你还可以按Ctrl-t<br><br>6.修改程序后, tags文件不能自动rebuild, 你必须手动再运行一下命令:<br>&nbsp; #ctags -R<span style="color: rgb(0, 0, 0);"><br><br><br>关于taglist.及更多的vim操作，可查看：<br>http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx<br></span><img src ="http://www.cnblogs.com/shipfi/aggbug/1150824.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41801/" target="_blank">[新闻]《星际争霸2》新图</a>]]></description></item><item><title>闲时需要补充的几个知识</title><link>http://www.cnblogs.com/shipfi/archive/2008/04/11/1148124.html</link><dc:creator>shipfi</dc:creator><author>shipfi</author><pubDate>Fri, 11 Apr 2008 03:28:00 GMT</pubDate><guid>http://www.cnblogs.com/shipfi/archive/2008/04/11/1148124.html</guid><wfw:comment>http://www.cnblogs.com/shipfi/comments/1148124.html</wfw:comment><comments>http://www.cnblogs.com/shipfi/archive/2008/04/11/1148124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/shipfi/comments/commentRss/1148124.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/shipfi/services/trackbacks/1148124.html</trackback:ping><description><![CDATA[<div align="left"><br><b>为了提高工作效率，以下几个知识点需要在有闲暇或者专门抽取时间加紧学习，并熟练使用.</b><br><br>1.awk,sed的熟练使用.<br>&nbsp; ---处理文本，数据的一把利器.<font color="#cc0033">Linux</font> 和<font color="#ff0000">UNIX </font>工具箱中最有用的工具之一.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 争取熟练掌握.<br><br>2.bash编程.<br>&nbsp; ---Unix/Linux下基础的东东. 会及大提高效率. 需要多加练习.<br><br>3.gdb, strace的使用.<br>&nbsp; ---程序调试，跟踪. 在Unix/Linux下写程序不可避免要用到.<br><br>4. vim熟练使用.<br>&nbsp; ---一个优秀的文本编辑器. 熟练使用后，及大提高写代码，操作文件的效率.<br><br>5.正则表达式的学习.<br>&nbsp; ---匹配，替换，操作字符利器.<br><br>6.python脚本语言学习.<br>&nbsp; ---让解决实际应用尽可能简单化.<br><br><br>好像就这么多了， 希望一切顺利吧.<br></div><img src ="http://www.cnblogs.com/shipfi/aggbug/1148124.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41800/" target="_blank">[新闻]Google放出Android开发路线图</a>]]></description></item></channel></rss>