﻿<?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>C++博客-&lt;table border="0" cellspacing="0" cellpadding="0" style="margin-left:5%;display:inline;height:30px;"&gt;&lt;tr&gt;&lt;td style="font-weight:bolder; font-size:16px; line-height:30px;"&gt;一年十二月&amp;nbsp&amp;nbsp谁主春秋&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size:14px; line-height:30px;"&gt;关注：基础系统工程 密码学 人工智能&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;-随笔分类-System</title><link>http://www.cppblog.com/qinqing1984/category/17605.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 26 Oct 2023 04:44:20 GMT</lastBuildDate><pubDate>Thu, 26 Oct 2023 04:44:20 GMT</pubDate><ttl>60</ttl><item><title>Windows异常分发与子系统图表集 -- 摘自Windows内核原理与实现</title><link>http://www.cppblog.com/qinqing1984/archive/2023/10/24/230155.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Tue, 24 Oct 2023 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2023/10/24/230155.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/230155.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2023/10/24/230155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/230155.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/230155.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/intel-x86-hardware-exception.png" width="711" height="638" alt="" /><br />
<img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/intel-x86-exception-trap-frame-stack.png" width="698" height="481" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/window-exception-dispatch.png" width="728" height="777" alt="" /><br /><hr /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-subsystem-arch.png" width="698" height="391" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/win32ksys-sys-service.png" width="703" height="276" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-winstation-desktop.png" width="694" height="467" alt="" /><hr /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/window-subsys-message-flow.png" width="694" height="318" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-subsys-msghook-type.png" width="706" height="818" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-subsys-msghook-handle.png" width="690" height="437" alt="" /><hr /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-subsys-graphics-arch.png" width="691" height="481" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-gdi-lineto-may-execute-path.png" width="702" height="344" alt="" /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-video-port-and-mini-port-driver.png" width="692" height="365" alt="" /><hr /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/windows-vista-show-drive-model.png" width="694" height="506" alt="" /><img src ="http://www.cppblog.com/qinqing1984/aggbug/230155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2023-10-24 15:25 <a href="http://www.cppblog.com/qinqing1984/archive/2023/10/24/230155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈Linux共享库库函数挂钩检测</title><link>http://www.cppblog.com/qinqing1984/archive/2023/09/26/230105.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Tue, 26 Sep 2023 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2023/09/26/230105.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/230105.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2023/09/26/230105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/230105.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/230105.html</trackback:ping><description><![CDATA[<div>Linux共享库库函数挂钩主流两种方法。一是替换函数对应的GOT/PLT条目，GOT/PLT原理类似Windows的IAT；二是inline挂钩，即替换函数序言的几个字节（x86是5或7字节）为jmp/call，若发现稍远处有jmp或call（前提在<span style="color: #ff00ff;">入口基本块</span>内，若不在入口基本块内要修改分支控制条件，这有点复杂也无必要），则其目标地址可被替换，这样就不用替换序言的几字节了。Windows的IAT挂钩检测很方便，因为dll的baseaddr及size可通过API VirtualQueryEx（<a href="https://learn.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualqueryex" target="_blank">https://learn.microsoft.com/zh-cn/windows/win32/api/memoryapi/nf-memoryapi-virtualqueryex</a>）或toolhelp库的Module32First/Module32Next（<a href="https://learn.microsoft.com/zh-cn/windows/win32/api/tlhelp32/nf-tlhelp32-module32first" target="_blank">https://learn.microsoft.com/zh-cn/windows/win32/api/tlhelp32/nf-tlhelp32-module32first</a>）接口来获取。同理linux也可以拿到有两种方法，一种是读/proc/pid/maps（这里pid为实际目标进程号）获取so库代码段的baseaddr和size，另一种用dl_iterate_phdr（<a href="https://man7.org/linux/man-pages/man3/dl_iterate_phdr.3.html" target="_blank">https://man7.org/linux/man-pages/man3/dl_iterate_phdr.3.html</a>）拿到代码段（pt_load类型+可执行标志）的baseaddr及size。只要模块(代码段)的baseaddr及size确定了，检测方法同IAT，即看替换函数地址是否不在代码段空间内，若不在或地址不是原函数则认为被挂钩了，否则需进一步用针对inline挂钩法的检测处理，见下文描述。另外dladdr（<a href="https://man7.org/linux/man-pages/man3/dladdr.3.html" target="_blank">https://man7.org/linux/man-pages/man3/dladdr.3.html</a>）判断一个地址是否跟一个so库及符号相关，因此也可用于检测挂钩。如果是inline挂钩法，那么分析函数入口基本块内（不管替换序言几字节还是已有jmp/call目标地址，都在入口基本块）jmp/call的目标地址（最好用成熟的反汇编引擎分析，比如llvm的mc库反汇编功能，或<a href="https://salsa.debian.org/debian/distorm3" target="_blank">https://salsa.debian.org/debian/distorm3</a>），看是否超出so库的代码段空间</div> <img src ="http://www.cppblog.com/qinqing1984/aggbug/230105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2023-09-26 16:47 <a href="http://www.cppblog.com/qinqing1984/archive/2023/09/26/230105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kretprobe探究思考</title><link>http://www.cppblog.com/qinqing1984/archive/2023/09/13/230081.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Tue, 12 Sep 2023 18:26:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2023/09/13/230081.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/230081.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2023/09/13/230081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/230081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/230081.html</trackback:ping><description><![CDATA[<div>曾因朋友问到监控，致使我探究了kretprobe的实现，想到编译中的<span style="color: #ff6600;"><strong>尾调用优化</strong></span>，作个小结</div><div>​1. kretprobe_trampoline_holder该跳转函数无参是必须的或说最好的通用设计，因为替换返回地址是非正常程序流程，即被探测函数的调用者无感知，不存在为跳转函数准备入参。若要设计传参且只读，则不会破坏被探测函数调用者的上下文，但跳转函数内部流程怎么用参数是个问题，这需要一种约定</div><div>​2. 跳转函数为调用trampoline_handler准备入参，即在栈上构造一个（不完整的）pt_regs，再把它地址即栈顶赋给rdi，rdi是x86_64上传入第一参数使用的寄存器，同时预留一个栈单元存放原返回地址（为什么要预留？因为被探测函数返回时，其调用者存放返回地址的栈空间被释放了，所以得在跳转函数内造一个）。由于trampoline_handler内调到用户自定义handler而传入pt_regs，因此自定义handler内要注意最好别改动pt_regs，否则会破坏被探测函数调用者的上下文</div><div>​3. 表面看kretprobe的实现流程有点像尾调用优化，但有本质区别。后者中被调尾函数直接释放父调用者的栈帧，就可恢复到父调用者的返回地址；前者不能这样干，因为被探测函数的返回地址被替换了，所以需要一个时地（时机地点）恢复，而这时地正是跳转函数的收尾序列代码，把原来的返回地址放于上述2所讲的预留栈单元，这样最后的ret指令弹出它并跳到原返回地址执行。为保证恢复后正常执行，还得恢复被探测函数调用者的上下文即寄存器信息（无须恢复栈内容，因为上述1讲到了跳转函数是无参的）<br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/kretprobe_trampoline_handler2.png" width="720" height="1181" alt="" /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/x86_save_regs_string.png" width="720" height="1415" alt="" /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/x86_struct_pt_regs.png" width="720" height="1420" alt="" /><br /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/kretprobe_trampoline_handler.png" width="720" height="1506" alt="" /></div> <img src ="http://www.cppblog.com/qinqing1984/aggbug/230081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2023-09-13 02:26 <a href="http://www.cppblog.com/qinqing1984/archive/2023/09/13/230081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Rust构建WebAssembly</title><link>http://www.cppblog.com/qinqing1984/archive/2021/12/13/217881.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Mon, 13 Dec 2021 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2021/12/13/217881.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/217881.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2021/12/13/217881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/217881.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/217881.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 12pt;">目录</strong><br />
<img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/rust-webassembly.png" width="730" height="513" alt="" /><br />
<br />
下载：<a href="/Files/qinqing1984/基于Rust构建WebAssembly.doc">基于Rust构建WebAssembly</a>
</div><img src ="http://www.cppblog.com/qinqing1984/aggbug/217881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2021-12-13 15:21 <a href="http://www.cppblog.com/qinqing1984/archive/2021/12/13/217881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于VSS可传输卷影拷贝的备份架构</title><link>http://www.cppblog.com/qinqing1984/archive/2019/11/06/216970.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Wed, 06 Nov 2019 10:01:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2019/11/06/216970.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/216970.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2019/11/06/216970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/216970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/216970.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt;">部署图</strong><br />&nbsp; &nbsp;<img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/vss_transportable_backup_arch.png" width="820" height="473" alt="" /><br />&nbsp; &nbsp;传统的vss备份架构由于备份应用部署在应用服务器内，因此比较耗应用服务器的CPU和IO，特别是拷贝大量的文件，为了降低对应用服务器的干扰，可采用server-free架构，将耗时的拷贝移到另一机器即备份服务器实现，而应用服务器只负责占用资源及耗时很少的打快照。这种架构运用了vss可传输卷影拷贝的特性，要求快照处于共享存储中，适用于Windows Server 2003 sp1以上版本<br /><br /><span style="font-size: 12pt;"><strong>协作流程图</strong></span><br />&nbsp; &nbsp;<img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/vss_transportable_backup_cooperate.png" width="820" height="816" alt="" /><br />&nbsp; &nbsp;VSS快照代理端的SetContext要求设置成<span style="color: #993366;">VSS_CTX_APP_BACKUP | VSS_VOLSNAP_ATTR_TRANSPORTABLE</span><img src ="http://www.cppblog.com/qinqing1984/aggbug/216970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2019-11-06 18:01 <a href="http://www.cppblog.com/qinqing1984/archive/2019/11/06/216970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell（11）: 创建和删除so库软链接</title><link>http://www.cppblog.com/qinqing1984/archive/2019/11/05/216967.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Tue, 05 Nov 2019 10:17:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2019/11/05/216967.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/216967.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2019/11/05/216967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/216967.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/216967.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt">脚本概述</strong><br />&nbsp; &nbsp;由于某些sdk或软件依赖众多的第三方库，而从官网下载到windows主机或从linux传到windows时，所依赖的so库往往丢失符号链接，给编译运行带来不便，因此编写了<span style="color: #800000"><strong>ctlsolink</strong></span>脚本，用于自动为单个so或某目录下的众多so或创建/删除一级/二级符号链接。该脚本的用法如下:<br />&nbsp; &nbsp;<span>&#9679;&nbsp;第1参数为mk或rm子命令，mk表示创建，rm表示删除<br /></span><span>&nbsp; &nbsp;&#9679;&nbsp;第2参数为文件或目录<br />&nbsp; &nbsp;</span><span>&#9679;&nbsp;第3参数是可选的-r，且只能是-r，如果指定了，则表示不断递归子目录<br /><br /><strong></strong></span><span style="font-size: 12pt"><strong>脚本实现</strong></span><span><br /></span>&nbsp; &nbsp;考虑到so库带版本一般多为libx.so.1，libx.so.1.2，libx.so.1.2.3这三种形式(x为库名)，对于前一种创建/删除一级符号链接即可，后两种则创建/删除二级符号链接。为了精确地抽出一级和二级链接名称，这里使用awk来匹配，用shell变量的最短匹配模式从尾部逐步删除点号及数字，核心代码如下&nbsp;&nbsp;&nbsp; 
<div align="center">
<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$dir</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;!</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$self_dir</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;]&nbsp;||&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$name</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;!</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$self_name</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;echo&nbsp;$name&nbsp;|&nbsp;aw</span><span style="color: #000000">k&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">{if($0~/</span><span style="color: #ff00ff">\.so\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}$</span><span style="color: #000000">/)&nbsp;exit&nbsp;0;&nbsp;else&nbsp;exit&nbsp;1}</span><span style="color: #000000">';&nbsp;then</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name</span><span style="color: #000000">=</span><span style="color: #000000">${name</span><span style="color: #ff0000">%</span><span style="color: #000000">.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name</span><span style="color: #000000">=</span><span style="color: #000000">${link_name%.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name</span><span style="color: #000000">=</span><span style="color: #000000">${link_name%.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name2</span><span style="color: #000000">=</span><span style="color: #000000">${name</span><span style="color: #ff0000">%</span><span style="color: #000000">.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name2</span><span style="color: #000000">=</span><span style="color: #000000">${link_name2%.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;echo&nbsp;$name&nbsp;|&nbsp;awk&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">{if($0~/</span><span style="color: #ff00ff">\.so\.[0-9]{1,}\.[0-9]{1,}$</span><span style="color: #000000">/)&nbsp;exit&nbsp;0;&nbsp;else&nbsp;exit&nbsp;1}';&nbsp;then</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name</span><span style="color: #000000">=</span><span style="color: #000000">${name</span><span style="color: #ff0000">%</span><span style="color: #000000">.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name</span><span style="color: #000000">=</span><span style="color: #000000">${link_name%.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name2</span><span style="color: #000000">=</span><span style="color: #000000">${name</span><span style="color: #ff0000">%</span><span style="color: #000000">.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;echo&nbsp;$name&nbsp;|&nbsp;awk&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">{if($0~/</span><span style="color: #ff00ff">\.so\.[0-9]{1,}$</span><span style="color: #000000">/)&nbsp;exit&nbsp;0;&nbsp;else&nbsp;exit&nbsp;1}';&nbsp;then&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #008080">13</span><span style="color: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_name</span><span style="color: #000000">=</span><span style="color: #000000">${name</span><span style="color: #ff0000">%</span><span style="color: #000000">.[</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">]</span><span style="color: #000000">*</span><span style="color: #000000">}<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;$do_mk&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">yes</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">name=$name,&nbsp;link_name=$link_name,&nbsp;link_name2=$link_name2</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$link_name2</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ln&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">sf&nbsp;$name&nbsp;$link_name2<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ln&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">sf&nbsp;$link_name2&nbsp;$link_name<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ln&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">sf&nbsp;$name&nbsp;$link_name<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;$link_name2&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br /></span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;$link_name2<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;$link_name<br /></span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;fi</span></div></div></div>&nbsp;&nbsp;&nbsp;要注意的是，这儿不能使用%%删除最长匹配的尾部来得到<strong>link_name</strong>，因为它的模式是<span style="color: red">.[0-9]</span><span style="color: red">*</span><span style="color: #000000">，这</span>可能会错误地匹配了so前的部分，比如libx.1.so.2得到libx，而期望的是libx.1.so<br />&nbsp;&nbsp;&nbsp;完整脚本下载：<a href="/Files/qinqing1984/ctlsolink.zip">ctlsolink</a> <br /><br /><strong style="font-size: 12pt">运行效果</strong><br />&nbsp; &nbsp;初始状态<br />&nbsp; &nbsp;<img alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ctlsolink-init.png" width="800" height="497" /><br />&nbsp; &nbsp;运行ctlsolink创建软链接后<br />&nbsp; &nbsp;<img alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ctlsolink-mk.png" width="800" height="612" /><br />&nbsp; &nbsp;运行ctlsolink删除软链接后<br />&nbsp; &nbsp; <img alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ctlsolink-rm.png" width="800" height="625" />&nbsp; &nbsp; &nbsp;&nbsp; <img src ="http://www.cppblog.com/qinqing1984/aggbug/216967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2019-11-05 18:17 <a href="http://www.cppblog.com/qinqing1984/archive/2019/11/05/216967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于make依赖文件的自动生成</title><link>http://www.cppblog.com/qinqing1984/archive/2018/11/16/216067.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Fri, 16 Nov 2018 04:08:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2018/11/16/216067.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/216067.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2018/11/16/216067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/216067.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/216067.html</trackback:ping><description><![CDATA[<div>&nbsp; 在GNU make中文手册这本书中，3.14节讲到了依赖文件的自动生成，如下图<hr /><img src="http://www.cppblog.com/images/cppblog_com/qinqing1984/gnu-make-314.png" width="1419" height="657" alt="" /><br /><br /><div>&nbsp; 图中的规则对C源文件和Makefile在同一目录，是正确的。但是不在同一目录的又希望依赖文件在对应的目录下，比如src/log/log_file.c，希望依赖文件log_file.d生成在src/log/下。因为gcc（aix平台xlc编译器亦如此）生成的依赖文件内容中目标文件名没有带路径，例如下所示</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000;"><strong>log_file.o</strong></span>: src/log/log_file.c&nbsp;src/log/log_file.h&nbsp;src/log/log_type.h&nbsp;\<br />&nbsp;src/log/../base/io_ext.h</div><div><br />&nbsp; 所以sed就找不到src/log/log_file.o而替换了，改正后的规则如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->%.d:&nbsp;%.c<br />&nbsp;&nbsp;&nbsp;&nbsp;$(CC)&nbsp;$(CFLAGS)&nbsp;$(INCS)&nbsp;$&lt;&nbsp;$(MFLAGS)&nbsp;$@.$$$$<span style="color: #008000; ">;</span><span style="color: #008000; ">\</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;sed&nbsp;'s,<span style="color: #ff0000;">$(*F)</span>.o<span>[</span><span>&nbsp;:</span><span>]</span>*,<span style="color: #ff0000;">$*</span>.o&nbsp;$@: ,g'&nbsp;&lt;&nbsp;$@.$$$$&nbsp;&gt;&nbsp;$@<span style="color: #008000; ">;</span><span style="color: #008000; ">\</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;$(RM)&nbsp;$@.$$$$</div><div><br />&nbsp; 该规则对C源文件和Makefile在同一目录也适合，生成后的依赖文件内容如下<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><strong style="color: #800000;">src/log/log_file.o&nbsp;src/log/log_file.d</strong>: src/log/log_file.c&nbsp;src/log/log_file.h&nbsp;src/log/log_type.h&nbsp;\<br />&nbsp;src/log/../base/io_ext.h</div></div></div></div></div><img src ="http://www.cppblog.com/qinqing1984/aggbug/216067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2018-11-16 12:08 <a href="http://www.cppblog.com/qinqing1984/archive/2018/11/16/216067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（10）：支持开源库编译的Makefile</title><link>http://www.cppblog.com/qinqing1984/archive/2016/10/19/214345.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Wed, 19 Oct 2016 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2016/10/19/214345.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/214345.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2016/10/19/214345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/214345.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/214345.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt">脚本源码</strong><br />&nbsp;&nbsp;&nbsp;由于很多应用项目依赖诸多第三方开源库，这些开源库各有不同的核心目录、库目标和输出位置，这里的核心目录是指<span style="color: red;">仅产生so库</span>的工程目录，库目标是指<span style="color: red;">仅产生so库</span>的make目标，输出位置是相对于核心目录的，但不必是子目录，可用..来回溯到父目录的某位置，更高层目录的位置，依次类推。为了统一支持它们，使用了一些技巧，详见示例脚本如下 
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">.PHONY:&nbsp;all&nbsp;clean&nbsp;lib&nbsp;core<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />thirdlib</span><span style="color: #000000">=</span><span style="color: #000000">openssl</span><span style="color: #000000">-</span><span style="color: #000000">1.0</span><span style="color: #000000">.1u</span><span style="color: red">?</span><span style="color: #000000">build_ssl&nbsp;ACE_wrappers</span><span style="color: #000000">/</span><span style="color: #000000">ace&nbsp;json&nbsp;ncurses</span><span style="color: #000000">-</span><span style="color: #000000">6.0</span><span style="color: red">??</span><span style="color: #000000">lib<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />coremod</span><span style="color: #000000">=</span><span style="color: #000000">main<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: red">dir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;`echo&nbsp;$@&nbsp;|&nbsp;awk&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">F?&nbsp;</span><span style="color: #008000">'</span><span style="color: #008000">{print&nbsp;$$1}'`</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: red">aim&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;`echo&nbsp;$@&nbsp;|&nbsp;awk&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">F?&nbsp;</span><span style="color: #008000">'</span><span style="color: #008000">{print&nbsp;$$2}'`</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: red">out&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;`echo&nbsp;$@&nbsp;|&nbsp;awk&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">F?&nbsp;</span><span style="color: #008000">'</span><span style="color: #008000">{print&nbsp;$$3}'`</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000"><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />copy</span><span style="color: #000000">=\</span><span style="color: #000000">cp&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">Pf&nbsp;</span><span style="color: red">${dir}</span><span style="color: #000000">/</span><span style="color: red">${out}</span><span style="color: #000000">/*</span><span style="color: #000000">.so</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;output<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />define&nbsp;MAKE_SUBDIR<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">${dir},${aim},${out}</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$(MAKECMDGOALS)</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;!</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">clean</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(MAKE)&nbsp;</span><span style="color: red">${aim}&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">C&nbsp;</span><span style="color: red">${dir}</span><span style="color: #000000">;&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$$is_cp</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">eq&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(copy);&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />fi&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(MAKE)&nbsp;</span><span style="color: red">clean&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">C&nbsp;${dir};&nbsp;</span><span style="color: #000000">\</span><span style="color: #000000"><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />fi&nbsp;<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />endef<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />all:&nbsp;lib&nbsp;core<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />lib:&nbsp;$(thirdlib)<br /></span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(thirdlib)::<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span style="color: red">is_cp</span><span style="color: red">=</span><span style="color: red">1</span><span style="color: #000000">;&nbsp;$(MAKE_SUBDIR)<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />core:&nbsp;$(coremod)<br /></span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(coremod)::<br /></span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;@</span><span style="color: red">is_cp</span><span style="color: red">=</span><span style="color: red">0</span><span style="color: #000000">;&nbsp;$(MAKE_SUBDIR)<br /></span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />clean:&nbsp;$(thirdlib)&nbsp;$(coremod)</span></div></div></div><br /><span style="font-size: 16px;"><strong>实现技巧</strong></span><br />&nbsp;&nbsp;&nbsp;1）使用?作为分隔符，所分隔的3个域依次为核心目录、库目标、输出位置；使用awk来获取各域，分别为dir、aim和out；在运行过程中，值dir一定非空，而aim为空则表示默认目标，out为空表示输出位置即为dir目录。<br />&nbsp;&nbsp;&nbsp;2）copy为命令变量，功能为每当一个库编译完成后，将输出的so库拷贝到output下，并保持软链接；对于有的开源库，需在编译前，使用对应的选项来调用configure，使其生成so库。<br />&nbsp;&nbsp;&nbsp;3）为了重用代码，定义了MAKE_SUBDIR命令包，参数变量为is_cp，当is_cp为1时，表示当前编译的是依赖库，否则是主程序。&nbsp;<br />&nbsp;&nbsp;&nbsp;4）thirdlib和coremod为依赖文件，使用了双冒号规则，这样一来，只要在thirdlib中加入新的依赖库，指定核心目录、库目标和输出位置即可，其它地方不用改。<img src ="http://www.cppblog.com/qinqing1984/aggbug/214345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2016-10-19 15:11 <a href="http://www.cppblog.com/qinqing1984/archive/2016/10/19/214345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（9）：自动化批量编译</title><link>http://www.cppblog.com/qinqing1984/archive/2016/09/28/214307.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Wed, 28 Sep 2016 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2016/09/28/214307.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/214307.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2016/09/28/214307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/214307.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/214307.html</trackback:ping><description><![CDATA[<div><span style="font-size: 12pt"><strong>脚本概述</strong></span><br />&nbsp;&nbsp;&nbsp;当需要在很多（比如几十至几百）台机器上编译同一程序时，如果一个个地手工拷贝源码、再编译，那么效率就很低，为了能大量节省手工、并行地编译，因此写了一个脚本，该脚本基于自动化脚本语言expect（expect基于tcl）实现，基本原理是针对每个远程主机，创建一个子进程，在该子进程内先调用scp拷贝源码到远程主机，再用ssh登录到远程主机、发送cd、configure和make命令，交互期间的命令输出多用正则分析，最终的编译输出保存到当前目录output子目录下。其命令行参数说明如下：<br />&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; font-style: normal; text-indent: 0px; display: inline !important; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; font-size: 13px; font-weight: normal; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px">&#9679;</span>&nbsp;第1参数为远程主机配置文件：一个多行文本文件，每行格式为IP 用户名 密码，空格符分隔，支持#注释。<br />&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; font-style: normal; text-indent: 0px; display: inline !important; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; font-size: 13px; font-weight: normal; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px">&#9679;</span>&nbsp;第2参数为本地主机源码目录：要求该目录存在Makefile和configure文件。<br />&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; font-style: normal; text-indent: 0px; display: inline !important; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; font-size: 13px; font-weight: normal; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px">&#9679;</span>&nbsp;第3参数为远程主机目标目录：用于存放源码的位置。<br /><br /><span style="font-size: 12pt"><strong>脚本实现</strong></span><br />&nbsp;&nbsp;&nbsp;<strong><a id="copy_file">拷贝源码</a></strong></div>
<div align="center"></div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #000000">proc&nbsp;</span><span style="color: #800000"><strong>copy_file</strong></span><span style="color: #000000">&nbsp;{host&nbsp;user&nbsp;srcdir&nbsp;dstdir&nbsp;passwd&nbsp;{</span><span style="color: #0000ff">to</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">}&nbsp;}&nbsp;{<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[catch&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">spawn&nbsp;scp&nbsp;-rq&nbsp;$srcdir&nbsp;$user@$host:$dstdir</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;msg]&nbsp;{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_error&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">failed&nbsp;to&nbsp;spawn&nbsp;scp:&nbsp;$msg\n</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;timeout&nbsp;$</span><span style="color: #0000ff">to</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">expect_after&nbsp;eof</span><span style="color: #000000">&nbsp;{&nbsp;<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_error&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$host&nbsp;scp&nbsp;died&nbsp;unexpectedly\n</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;expect&nbsp;{<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">(yes/no)?</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;{&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">yes\r</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;exp_continue&nbsp;}<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">re&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">(?:P|p)assword:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;{&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$passwd\r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout&nbsp;{&nbsp;do_timeout&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$host&nbsp;scp</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;expect&nbsp;{<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">full_buffer</span><span style="color: #000000">&nbsp;{&nbsp;exp_continue&nbsp;}<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&nbsp;timeou</span><span style="color: #ff0000">t</span><span style="color: #000000">&nbsp;{&nbsp;exp_continue&nbsp;}<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eof&nbsp;<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />}</span></div></div></div>
<div>&nbsp;&nbsp;&nbsp;第2行调用spawn命令执行scp命令，并用catch捕捉错误；当执行成功后，第12行用expect等待远端输出（超时默认为10秒），第13、14行自动输入用户名和密码，当过程中网络连接断开时，会匹配到第8行的eof；当输出完成连接关闭时，会匹配到第21行的eof；如果输出太多超过expect内部的buffer时，会匹配到第19行的full_buffer，这里由于为了提高效率，使用了静默方式的scp，因些实际会匹配到第20行的timeout，不管匹配到哪种情况，都要继续直到eof。<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;<strong>执行编译</strong></div>
<div align="center"></div>
<div align="center"></div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #000000">proc&nbsp;</span><span style="color: #800000"><strong>do_make</strong></span><span style="color: #000000">&nbsp;{host&nbsp;user&nbsp;passwd&nbsp;subdir&nbsp;{</span><span style="color: #0000ff">to</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">}&nbsp;}&nbsp;{<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[catch&nbsp;{spawn&nbsp;ssh&nbsp;$user@$host}&nbsp;msg&nbsp;]&nbsp;{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_error&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">failed&nbsp;to&nbsp;spawn&nbsp;ssh:&nbsp;$msg\n</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;timeout&nbsp;$</span><span style="color: #0000ff">to</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;expect_after&nbsp;eof&nbsp;{&nbsp;<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_error&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$host&nbsp;ssh&nbsp;died&nbsp;unexpectedly\n</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;expect&nbsp;{&nbsp;&nbsp;<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">*yes/no</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;{&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">yes\r</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;exp_continue&nbsp;}<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">re&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">(?:P|p)assword:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;{&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$passwd\r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}&nbsp;&nbsp;<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout&nbsp;{&nbsp;do_timeout&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$host&nbsp;ssh</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&nbsp;wait_cmd&nbsp;$spawn_id&nbsp;passwd</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #ff0000">cd</span><span style="color: #000000">&nbsp;$subdir\r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;wait_cmd&nbsp;$spawn_id&nbsp;cd<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #ff0000">source&nbsp;configure</span><span style="color: #000000">\r</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">24</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;wait_cmd&nbsp;$spawn_id&nbsp;configure<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">26</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #ff0000">make</span><span style="color: #000000">\r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">27</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;wait_cmd&nbsp;$spawn_id&nbsp;make<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">29</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;send&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">exit\r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;expect&nbsp;eof&nbsp;&nbsp;<br /></span><span style="color: #008080">31</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />}</span></div></div></div>
<div>&nbsp;&nbsp;&nbsp;关于spawn和expect的解释与上节<a href="#copy_file">拷贝源码</a>相同，不同的是依次发送命令cd、source configure、make，每个命令须等到命令提示符后（调用自定义函数wait_cmd）再发下一个，最后发送exit退出ssh、导致连接关闭，匹配到最后一行的eof。对于有的项目源码，可能没有或不用配置，那么configure文件可以不存在或内容为空，如果不存在导致报错也没关系，不影响make；如果configure出错，那么make也会出错。这里使用source是为了使配置在当前shell中生效。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<strong>主循环</strong></div>
<div align="center"></div>
<div align="center"></div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;f&nbsp;[open&nbsp;$file&nbsp;r]<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;curtime&nbsp;[clock&nbsp;seconds]<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #ff0000">log_user&nbsp;</span><span style="color: #ff0000">0</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;s&nbsp;{[:blank:]}<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;pattern&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">^(\[^#$s]+)\[$s]+(\[^$s]+)\[$s]+(\[^$s]+)</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;{&nbsp;[gets&nbsp;$f&nbsp;line]&nbsp;!</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;}&nbsp;{<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;{&nbsp;![</span><span style="color: #ff0000">regexp</span><span style="color: #000000">&nbsp;$pattern&nbsp;[</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;trimleft&nbsp;$line]&nbsp;?&nbsp;host&nbsp;user&nbsp;passwd]&nbsp;}&nbsp;{<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;send_user&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$host&nbsp;$user&nbsp;$passwd\n</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">13</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;{&nbsp;![fork]&nbsp;}&nbsp;{<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;filename&nbsp;output</span><span style="color: #000000">/</span><span style="color: #000000">${host}_[clock&nbsp;format&nbsp;$curtime&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">format&nbsp;%y.%m.%d_%H.%M.%S].log<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log_file&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">noappend&nbsp;</span><span style="color: #ff0000">-</span><span style="color: #ff0000">a</span><span style="color: #000000">&nbsp;$filename<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy_file&nbsp;$host&nbsp;$user&nbsp;$srcdir&nbsp;$dstdir&nbsp;$passwd&nbsp;</span><span style="color: #000000">30</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do_make&nbsp;$host&nbsp;$user&nbsp;$passwd&nbsp;$subdir&nbsp;</span><span style="color: #000000">30</span><span style="color: #000000"><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_user&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$host&nbsp;finish\n</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">22</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000"><br /></span><span style="color: #008080">23</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">24</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" />}</span></div></div></div>
<div>&nbsp;&nbsp;&nbsp;打开远程主机配置文件，读取每一行直到文件尾，忽略注释行，用正则提取IP、用户名和密码，创建子进程，按IP和当前时间命名log文件（由于前面调用log_user 0关闭了控制台输出，因此为了能记录输出到日志文件，一定要加-a选项），最后调用函数copy_file和do_make。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;完整脚本下载：<a href="/Files/qinqing1984/autobuild.zip">autobuild.zip</a></div><img src ="http://www.cppblog.com/qinqing1984/aggbug/214307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2016-09-28 11:04 <a href="http://www.cppblog.com/qinqing1984/archive/2016/09/28/214307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一种拦截Linux动态库API的方法及装置</title><link>http://www.cppblog.com/qinqing1984/archive/2016/08/25/214213.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Thu, 25 Aug 2016 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2016/08/25/214213.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/214213.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2016/08/25/214213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/214213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/214213.html</trackback:ping><description><![CDATA[<strong style="font-size: 14pt">描述</strong><br />
&nbsp;&nbsp;&nbsp;拦截Linux动态库API的常规方法，是基于动态符号链接覆盖技术实现的，基本步骤是<br />&nbsp; &nbsp; 1. 重命名要拦截的目标动态库。<br />&nbsp; &nbsp; 2. 创建新的同名动态库，定义要拦截的同名API，在API内部调用原动态库对应的API。这里的同名是指与重命名前动态库前的名称相同。<br />
&nbsp;&nbsp;&nbsp;显而易见，如果要拦截多个不同动态库中的API，那么必须创建多个对应的同名动态库，这样一来不仅繁琐低效，还必须被优先链接到客户二进制程序中（根据动态库链接原理，对重复ABI符号的处理是选择优先链接的那个动态库）。 另外在钩子函数的实现中，若某调用链调用到了原API，则会引起死循环而崩溃。本方法通过直接修改ELF文件中的动态库API入口表项，解决了常规方法的上述问题。 <br />
<br />
<strong style="font-size: 14pt">特点</strong><br />
&nbsp;&nbsp;&nbsp;<strong style="color: red">1.</strong> 不依赖于动态库链接顺序。<br />
&nbsp;&nbsp;&nbsp;<strong style="color: red">2.</strong> 能拦截多个不同动态库中的多个API。<br />
&nbsp;&nbsp;&nbsp;<strong style="color: red">3.</strong> 支持运行时动态链接的拦截。<br />
&nbsp;&nbsp;&nbsp;<strong style="color: red">4.</strong> 钩子函数内的实现体，若调用到原API，则不会死循环。 <br />
<br />
<hr />
<strong style="font-size: 14pt">实现</strong><br />
&nbsp;&nbsp;&nbsp;<strong style="font-size: 12pt">拦截映射表</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了支持特点2和3，建立了一个拦截映射表，这个映射表有2级。第1级为ELF文件到它的API钩子映射表，键为ELF文件句柄，值为API钩子映射表；第2级为API到它的钩子函数映射表，键为API名称，值为包含最老原函数地址和最新钩子函数地址的结构体，如下图<br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/api_hook_map.png" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当最先打开ELF文件成功时，会在第1级映射表中插入记录；反之当最后关闭同一ELF文件时，就会从中移除对应的记录。当第一次挂钩动态库API时，就会在第2级映射表插入记录；反之卸钩同一API时，就会从中删除对应的记录。<br />
<br />
&nbsp;&nbsp;&nbsp;<strong style="font-size: 12pt">计算ELF文件的映像基地址</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;计算映像基地址是为了得到ELF中动态符号表和重定位链接过程表的内容，因为这些表的位置都是相对于基地址的偏移量，该算法在打开ELF文件时执行，如下图<br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/elf_baseaddr_algo.png" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXE文件为可执行文件，DYN文件为动态库。对于可执行文件，映射基地址为可执行装载段的虚拟地址；对于动态库，可通过任一API的地址减去它的偏移量得到，任一API的地址可通过调用libdl.so库API dlsym得到，偏移量通过查询动态链接符号表得到。<br />
<br />
&nbsp;&nbsp;&nbsp;<strong style="font-size: 12pt">打开ELF文件</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了支持特点2即拦截不同动态库的多个API，节省每次挂钩API前要打开并读文件的开销，独立提供了打开ELF文件的接口操作，流程如下图<br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/elf_open.png" /></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若输入ELF文件名为空，则表示打开当前进程的可执行文件，此时要从伪文件系统/proc/self/exe读取文件路径名，以正确调用系统调用open。当同一ELF文件被多次打开时，只须递增结构elf的引用计数。<br />
<br />
&nbsp;&nbsp;&nbsp;<strong style="font-size: 12pt">挂钩API</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当打开ELF文件后，就可挂钩API了，流程如下图<br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/elf_hook_api.png" /></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当第一次挂钩时，需要保存原函数以供后面卸钩；第二次以后继续挂钩同一API时，更新钩子函数，但原函数不变。&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt"><strong>卸钩API</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当打开ELF文件后，就可卸钩API了，流程如下图<br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/elf_unhook_api.png" /></div>
<br />
&nbsp;&nbsp;&nbsp;<strong style="font-size: 12pt">关闭ELF文件</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为提供了打开ELF文件的接口操作，所以得配有关闭ELF文件的接口操作。当不需要挂钩API的时候，就可以关闭ELF文件了，流程如下图<br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/elf_close.png" /></div>
<br />
<hr /><strong style="font-size: 14pt;">运行时动态拦截装置</strong><br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/run_dyn_hook_mod.png" /></div>
&nbsp;&nbsp;&nbsp;在初始化模块中打开当前可执行文件，挂钩libdl.so库的API dlopen和dlsym；在转换模块中，按动态库句柄和API名称在拦截映射表中查找钩子函数，若找到则返回钩子函数，否则返回调用dlsym的结果；在销毁模块中，卸钩dlopen和dlsym。<br />
当动态库被进程加载的时候，会调用初始化模块；当被进程卸载或进程退出的时候，会调用销毁模块；当通过dlsym调用API时，则会在dlsym的钩子函数中调用转换模块。通过环境变量LD_PRELOAD将动态库libhookapi.so设为预加载库，这样就能拦截到所有进程对dlopen及dlsym的调用，进而拦截到已挂钩动态库API的调用。<img src ="http://www.cppblog.com/qinqing1984/aggbug/214213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2016-08-25 11:10 <a href="http://www.cppblog.com/qinqing1984/archive/2016/08/25/214213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一种根据dentry获取绝对路径名的实现方法</title><link>http://www.cppblog.com/qinqing1984/archive/2016/08/24/214229.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Wed, 24 Aug 2016 11:22:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2016/08/24/214229.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/214229.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2016/08/24/214229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/214229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/214229.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;本方法适用于linux 2.6.x内核。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp;1. </strong>先获取dentry所属文件系统对应的挂载点，基本原理是遍历文件系统vfsmount树，找到与dentry有相同超级块的vfsmount，实现如下
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;spinlock_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">vfsmnt_lock;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><strong><span style="color: #800000; font-size: 10pt">next_mnt</span></strong>(<span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p,&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">root)<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_109_403_Open_Image" onclick="this.style.display='none'; Codehighlighter1_109_403_Open_Text.style.display='none'; Codehighlighter1_109_403_Closed_Image.style.display='inline'; Codehighlighter1_109_403_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_109_403_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_109_403_Closed_Text.style.display='none'; Codehighlighter1_109_403_Open_Image.style.display='inline'; Codehighlighter1_109_403_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_109_403_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_109_403_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;list_head&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mnt_mounts.next;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_186_347_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_347_Open_Text.style.display='none'; Codehighlighter1_186_347_Closed_Image.style.display='inline'; Codehighlighter1_186_347_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_186_347_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_186_347_Closed_Text.style.display='none'; Codehighlighter1_186_347_Open_Image.style.display='inline'; Codehighlighter1_186_347_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(next&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">p</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mnt_mounts)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_186_347_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_186_347_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_200_344_Open_Image" onclick="this.style.display='none'; Codehighlighter1_200_344_Open_Text.style.display='none'; Codehighlighter1_200_344_Closed_Image.style.display='inline'; Codehighlighter1_200_344_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_200_344_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_200_344_Closed_Text.style.display='none'; Codehighlighter1_200_344_Open_Image.style.display='inline'; Codehighlighter1_200_344_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_200_344_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_200_344_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(p&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mnt_child.next;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(next&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">p</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mnt_parent</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mnt_mounts)<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">-&gt;</span><span style="color: #000000">mnt_parent;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;list_entry(next,&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount,&nbsp;mnt_child);<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800000"><strong>get_dentry_mnt</strong></span>(<span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;dentry&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dentry)<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_468_812_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_812_Open_Text.style.display='none'; Codehighlighter1_468_812_Closed_Image.style.display='inline'; Codehighlighter1_468_812_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_468_812_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_468_812_Closed_Text.style.display='none'; Codehighlighter1_468_812_Open_Image.style.display='inline'; Codehighlighter1_468_812_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_468_812_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_468_812_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">root;<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;fs_struct&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">fs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;current</span><span style="color: #000000">-&gt;</span><span style="color: #000000">fs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;read_lock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">fs</span><span style="color: #000000">-&gt;</span><span style="color: #0000ff">lock</span><span style="color: #000000">);<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fs</span><span style="color: #000000">-&gt;</span><span style="color: #000000">root.mnt;<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;mntget(root);<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;read_unlock(</span><span style="color: #000000">&amp;</span><span style="color: #000000">fs</span><span style="color: #000000">-&gt;</span><span style="color: #0000ff">lock</span><span style="color: #000000">);<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;spin_lock(vfsmnt_lock);<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img id="Codehighlighter1_689_754_Open_Image" onclick="this.style.display='none'; Codehighlighter1_689_754_Open_Text.style.display='none'; Codehighlighter1_689_754_Closed_Image.style.display='inline'; Codehighlighter1_689_754_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_689_754_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_689_754_Closed_Text.style.display='none'; Codehighlighter1_689_754_Open_Image.style.display='inline'; Codehighlighter1_689_754_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root;&nbsp;p;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;next_mnt(p,root))</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_689_754_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_689_754_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img id="Codehighlighter1_722_751_Open_Image" onclick="this.style.display='none'; Codehighlighter1_722_751_Open_Text.style.display='none'; Codehighlighter1_722_751_Closed_Image.style.display='inline'; Codehighlighter1_722_751_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_722_751_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_722_751_Closed_Text.style.display='none'; Codehighlighter1_722_751_Open_Image.style.display='inline'; Codehighlighter1_722_751_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>if(<span style="color: red;">p-&gt;mnt_sb&nbsp;== dentry-&gt;d_sb</span>)<span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_722_751_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_722_751_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mntget(p);<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;spin_unlock(vfsmnt_lock);<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;mntput(root);<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p;<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;next_mnt函数实现了<span style="color: red;">先根遍历</span>法，遍历以root为根的文件系统挂载点，p为遍历过程中的当前结点，返回p的下一个挂载点；vfsmnt_lock可通过内核函数kallsyms_on_each_symbol或kallsyms_lookup_name查找获得。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp;2. </strong>再调用内核函数d_path，接口封装如下<br />
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #800000"><strong>get_dentry_path</strong></span>(<span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;dentry&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dentry,</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">buf,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len)<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_63_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_277_Open_Text.style.display='none'; Codehighlighter1_63_277_Closed_Image.style.display='inline'; Codehighlighter1_63_277_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_63_277_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_63_277_Closed_Text.style.display='none'; Codehighlighter1_63_277_Open_Image.style.display='inline'; Codehighlighter1_63_277_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_63_277_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_63_277_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;vfsmount&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">mnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;get_dentry_mnt(dentry);<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_139_262_Open_Image" onclick="this.style.display='none'; Codehighlighter1_139_262_Open_Text.style.display='none'; Codehighlighter1_139_262_Closed_Image.style.display='inline'; Codehighlighter1_139_262_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_139_262_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_139_262_Closed_Text.style.display='none'; Codehighlighter1_139_262_Open_Image.style.display='inline'; Codehighlighter1_139_262_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(mnt)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_139_262_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_139_262_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_160_189_Open_Image" onclick="this.style.display='none'; Codehighlighter1_160_189_Open_Text.style.display='none'; Codehighlighter1_160_189_Closed_Image.style.display='inline'; Codehighlighter1_160_189_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_160_189_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_160_189_Closed_Text.style.display='none'; Codehighlighter1_160_189_Open_Image.style.display='inline'; Codehighlighter1_160_189_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;path&nbsp;ph&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_160_189_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_160_189_Open_Text"><span style="color: #000000">{.dentry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dentry,&nbsp;.mnt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mnt}</span></span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d_path(</span><span style="color: #000000">&amp;</span><span style="color: #000000">ph,buf,len);<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(IS_ERR(p))<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mntput(mnt);<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
</div>
</div><img src ="http://www.cppblog.com/qinqing1984/aggbug/214229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2016-08-24 19:22 <a href="http://www.cppblog.com/qinqing1984/archive/2016/08/24/214229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一种动态跟踪TCP连接与进程相关性的方法</title><link>http://www.cppblog.com/qinqing1984/archive/2016/07/13/213925.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Wed, 13 Jul 2016 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2016/07/13/213925.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/213925.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2016/07/13/213925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/213925.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/213925.html</trackback:ping><description><![CDATA[<strong style="font-size: 14pt">描述</strong><br />
&nbsp;&nbsp;&nbsp;TCP连接跟踪是网络流控和防火墙中的一项重要的基础技术，当运用于主机时，连接必与进程相关联，要么是主动发出的，要么是被动接受的，当后代进程被动态创建时，由于文件描述符的继承，一个连接就会被这个进程树中的所有进程共享；当一个进程发出或接受多个连接时，就拥有了多个连接。本方法可用于网络安全产品中，监控TCP连接及所属进程，能准确并动态地知道一个连接被哪些进程共享，一个进程拥有哪些连接。 <br /><span style="font-size: 14pt"><strong>
<br />特点</strong></span><br />
&nbsp;&nbsp;&nbsp;操作系统自带的netstat工具只是关联到了一个根进程，无法看到拥有该连接的所有进程，查看进程拥有的全部连接也不方便。该方法的特点是实时跟踪、查看连接与进程相关信息方便、支持连接的管控。<br />
<br />
<span style="font-size: 14pt"><strong>
<hr />
实现</strong></span><br />
&nbsp;&nbsp;&nbsp;本方法通过内核安全的十字链表实现了连接与进程的相关性，连接信息结构体含有一个所属进程链表头，进程信息结构体含有一个拥有连接链表头，通过十字链表结点链接，x方向链接到进程的连接链表，y方向链接到连接的进程链表，如下图所示
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/task_conn_2d.png" /></div>
&nbsp;&nbsp;&nbsp;进程1为根进程，进程2，...，进程n为进程1的后代进程；连接1，连接2，...，连接n为进程1产生的连接。node(x,y)为十字链表结点，用于关联连接与进程，x对应进程编号，y对应连接编号，每个node包含了所属的连接和进程指针，每行和每列都是一个双向循环链表（循环未画出），每个链表用一个自旋锁同步操作。<br />
&nbsp;&nbsp;&nbsp;动态跟踪的过程包括4个方面：进程创建、进程退出、连接产生、连接销毁。在Linux下，可通过拦截内核函数do_fork挂钩进程创建，拦截do_exit挂钩进程退出；可通过拦截inet_stream_ops的成员函数connect和accept挂钩连接产生，拦截成员函数release挂钩连接销毁。下面为4个方面对应的流程图，由于所有外层加锁前已禁止本地中断和内核抢占，因此内层加锁前就不必再禁止本地中断和内核抢占了。<br />
<br />
&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt"><strong>进程创建</strong></span><br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/task_fork.png" /></div>
&nbsp;&nbsp;&nbsp;将copy_node插入到c的进程链表末尾，即为y方向增加（下同）；插入到p的连接链表末尾，为x方向增加（下同）。<br />
<br />
&nbsp;&nbsp;&nbsp;<strong style="font-size: 12pt">进程退出</strong><br />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/task_exit.png" /></div>
&nbsp;&nbsp;&nbsp;从c的进程链表中移除node，即为y方向移除（下同）；再从p的连接链表中移除node，即为x方向移除（下同）。<br />
<br />
<hr width="98%" />
&nbsp; &nbsp;<span style="font-size: 12pt"><strong>连接产生</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当进程发出连接或接受连接时，调用此流程。
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/attach_task_conn.png" /></div>
<br />
&nbsp; &nbsp;<strong style="font-size: 12pt">连接销毁<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当某个进程销毁连接时，调用此流程。
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/deatch_task_conn.png" /></div><img src ="http://www.cppblog.com/qinqing1984/aggbug/213925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2016-07-13 11:24 <a href="http://www.cppblog.com/qinqing1984/archive/2016/07/13/213925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（8）：使用awk定位反汇编输出</title><link>http://www.cppblog.com/qinqing1984/archive/2015/10/27/212109.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Tue, 27 Oct 2015 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2015/10/27/212109.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/212109.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2015/10/27/212109.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/212109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/212109.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt">脚本概述</strong><br />&nbsp;&nbsp;&nbsp;由于使用objdump反汇编linux内核的输出太多（2.6.32-220.el6.x86_64统计结果为1457706行），而很多时候只是想查看特定部分的机器码与汇编指令，例如函数的入口、堆栈、调用了哪个函数等，为了高效和通用，因此编写了一个简单的awk脚本，其命令行参数说明如下：<br />&nbsp;&nbsp;&nbsp;&#9679; SLINE表示匹配的起始行号（不小于1），SPAT表示匹配的起始行模式，这两个只能有一个生效，当都有效时，以SLINE为准。<br />&nbsp;&nbsp;&nbsp;&#9679; NUM表示从起始行开始的连续输出行数（不小于1，含起始行），EPAT表示匹配的结束行模式，这两个只能有一个生效，当都有效时，以NUM为准。<br /><br /><strong style="font-size: 12pt">脚本实现</strong><br />&nbsp;&nbsp;&nbsp;<strong>检查传值</strong><br />&nbsp;&nbsp;&nbsp;由于向脚本传入的值在BEGIN块内没生效，在动作块{}和END块内有效，但若在{}内进行检查则太低效，因为处理每条记录都要判断，所以为了避免在{}内进行多余的判断，就在BEGIN块内解析命令行参数来间接获得传值，当传值无效时，给出提示并退出。 
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">for</span><span style="color: #000000">(k</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;k</span><span style="color: #000000">&lt;</span><span style="color: #000000">ARGC;</span><span style="color: #000000">++</span><span style="color: #000000">k){<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">ARGV[k]<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">==</span><span style="color: #000000">match(str,</span><span style="color: #000000">"</span><span style="color: #000000">SLINE=</span><span style="color: #000000">"</span><span style="color: #000000">)){<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SLINE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;substr(str,</span><span style="color: #000000">7</span><span style="color: #000000">)<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">==</span><span style="color: #000000">match(str,</span><span style="color: #000000">"</span><span style="color: #000000">SPAT=</span><span style="color: #000000">"</span><span style="color: #000000">)){<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPAT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;substr(str,</span><span style="color: #000000">6</span><span style="color: #000000">)<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">==</span><span style="color: #000000">match(str,</span><span style="color: #000000">"</span><span style="color: #000000">NUM=</span><span style="color: #000000">"</span><span style="color: #000000">)){<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;substr(str,</span><span style="color: #000000">5</span><span style="color: #000000">)<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">1</span><span style="color: #000000">==</span><span style="color: #000000">match(str,</span><span style="color: #000000">"</span><span style="color: #000000">EPAT=</span><span style="color: #000000">"</span><span style="color: #000000">)){<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EPAT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;substr(str,</span><span style="color: #000000">6</span><span style="color: #000000">)<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">14 &nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(SLINE</span><span style="color: #000000">&lt;=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;SPAT</span><span style="color: #000000">==</span><span style="color: #000000">""</span><span style="color: #000000">){<br /></span><span style="color: #008080">15</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;rangeshow&nbsp;must&nbsp;specifies&nbsp;valid&nbsp;SLINE&nbsp;which&nbsp;must&nbsp;be&nbsp;greater&nbsp;than&nbsp;0,&nbsp;or&nbsp;SPAT&nbsp;which&nbsp;can't&nbsp;be&nbsp;empty</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">17</span><span style="color: #000000">&nbsp; }<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">19</span><span style="color: #000000">&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">(NUM</span><span style="color: #000000">&lt;=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;EPAT</span><span style="color: #000000">==</span><span style="color: #000000">""</span><span style="color: #000000">){<br /></span><span style="color: #008080">20</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;rangeshow&nbsp;must&nbsp;specifies&nbsp;valid&nbsp;NUM&nbsp;which&nbsp;must&nbsp;be&nbsp;greater&nbsp;than&nbsp;0,&nbsp;or&nbsp;EPAT&nbsp;which&nbsp;can't&nbsp;be&nbsp;empty</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}</span></div></div></div><br />&nbsp;&nbsp;&nbsp;<strong>结束处理</strong><br />&nbsp;&nbsp;&nbsp;当处理了NUM条记录或匹配了结束行模式时，应退出动作块{}。&nbsp;&nbsp;&nbsp; 
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">0</span><span style="color: #000000">==</span><span style="color: #000000">start_nr){&nbsp;<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;<img alt="" src="http://www.cppblog.com/Images/dot.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(NUM</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(NR</span><span style="color: #000000">&lt;</span><span style="color: #000000">start_nr</span><span style="color: #000000">+</span><span style="color: #000000">NUM)&nbsp;{<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">matched_nr<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;$</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">matched_nr<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;$</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">0</span><span style="color: #000000">!</span><span style="color: #000000">=</span><span style="color: #000000">match($</span><span style="color: #000000">0</span><span style="color: #000000">,EPAT))<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />}</span></div></div></div><br />&nbsp;&nbsp;&nbsp;完整脚本下载：<a title="rangeshow" href="/Files/qinqing1984/rangeshow.zip">rangeshow</a>。<br /><br /><strong style="font-size: 12pt">脚本示例<br /></strong>&nbsp;&nbsp;&nbsp;查看linux内核第10000行开始的10条指令，如下图<br />&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/awk_rangeshow_10000_10.png" /><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;查看linux内核函数do_fork入口开始的10条指令，如下图&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/awk_rangeshow_do_fork_10.png" /><br /><br />&nbsp;&nbsp;&nbsp;查看linux内核第10000行开始到callq的一段指令，如下图<br />&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/awk_rangeshow_10000_callq.png" /><br /><br />&nbsp;&nbsp;&nbsp;查看linux内核函数do_exit入口到调用profile_task_exit的一段指令，如下图&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/awk_rangeshow_do_exit_profile_task_exit.png" /> <img src ="http://www.cppblog.com/qinqing1984/aggbug/212109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2015-10-27 15:36 <a href="http://www.cppblog.com/qinqing1984/archive/2015/10/27/212109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（7）：nginx升级与恢复</title><link>http://www.cppblog.com/qinqing1984/archive/2015/01/19/209572.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Sun, 18 Jan 2015 16:36:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2015/01/19/209572.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/209572.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2015/01/19/209572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/209572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/209572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 脚本概述&nbsp;&nbsp;&nbsp;nginx是一款著名的开源web服务器，为方便升级与恢复，编写了一个简单的脚本，因为升级备份了可执行文件和配置文件（后缀名为old），所以可用于恢复。当升级时，若nginx正在运行，则不中断服务进行平滑升级，否则直接拷贝覆盖；当恢复时，若nginx正在运行，则不中断服务进行平滑恢复，否则直接拷贝覆盖。是否正在运行根据pid来判断，而pid从pid文件读取...&nbsp;&nbsp;<a href='http://www.cppblog.com/qinqing1984/archive/2015/01/19/209572.html'>阅读全文</a><img src ="http://www.cppblog.com/qinqing1984/aggbug/209572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2015-01-19 00:36 <a href="http://www.cppblog.com/qinqing1984/archive/2015/01/19/209572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于TLS FIFO的进程间通信模型</title><link>http://www.cppblog.com/qinqing1984/archive/2014/12/01/208992.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Sun, 30 Nov 2014 16:13:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2014/12/01/208992.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/208992.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2014/12/01/208992.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/208992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/208992.html</trackback:ping><description><![CDATA[&nbsp; &nbsp;众所周知，TLS是指线程局部存储，FIFO是Unix中的命名管道，可用于无关进程间的通信，而本文描述的TLS FIFO是指这样一种机制：如果一个线程在每次IO操作时，若没有连接，则先连接到FIFO服务端，再将连接关联到这个线程的TLS中，这里的连接即创建并打开唯一的FIFO，之后的读写就在这个FIFO连接上进行；当FIFO连接断开时，在下次IO操作时会自动重连。这样一来，用户程序就只要调用相关的IO操作，而不必管理连接，极大地简化了程序。使用FIFO通信前先要创建FIFO再打开它，其中创建是最重要的操作，结果有3种情况：成功、失败和已存在。<br />
<br/>
<strong style="font-size:12pt">结构定义</strong>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->typedef&nbsp;<span style="color: #0000ff">struct</span>&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">int</span>&nbsp;fd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">char</span>&nbsp;*name;<br />
}ipc_fifo_t;</div>
</div>
</div>
&nbsp; fd存储FIFO文件描述符，name存储FIFO文件系统路径名。<br />
<br/>
<div>
<strong style="font-size:12pt">接口函数</strong><br />
<strong>&nbsp; </strong>&#9679;<strong>&nbsp;</strong>创建FIFO</div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div align="left"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">ipc_fifo_t</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;ipc_fifo_make(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">path,mode_t&nbsp;mode);</span></div>
</div>
</div>
<div>&nbsp; path指定FIFO路径，可以是绝对路径或相对路径，mode指定访问权限，若成功则返回一个FIFO结构，否则为NULL；通常被ipc_fifo_open调用。<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp; <strong>&#9679;</strong>&nbsp;打开FIFO</div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div align="left"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ipc_fifo_open(ipc_fifo_t&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">f,</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">path,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;flag,mode_t&nbsp;mode);</span></div>
</div>
</div>
<div>&nbsp; flag指定打开标志，如果包含了O_CREAT标志，那么调用ipc_fifo_make创建新的FIFO对象并在打开成功后替换*f，否则如果*f为空，就分配并初始化一个fifo结构；mode指定访问权限，仅当创建时生效。虽然f为输入输出参数，但操作失败时不会影响它，也就是说没有副作用。<br />
<br />
&nbsp; <strong>&#9679;&nbsp;</strong>发送数据&nbsp;&nbsp;&nbsp;</div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div align="left"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">ssize_t&nbsp;ipc_fifo_write(ipc_fifo_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">f,</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">data,size_t&nbsp;size);</span></div>
</div>
</div>
&nbsp; 如果成功则返回已发送的字节数，否则返回-1，errno表示出错代码。<br />
&nbsp;&nbsp;&nbsp;<br />
<strong>&nbsp; &#9679;&nbsp;</strong>接收数据
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div align="left"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">ssize_t&nbsp;ipc_fifo_read(ipc_fifo_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">f,</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">data,size_t&nbsp;size);</span></div>
</div>
</div>
<div>&nbsp; 如果成功则返回已发送的字节数，否则返回-1，errno表示出错代码。</div>
<br />
<strong>&nbsp; &#9679;&nbsp;</strong>关闭FIFO
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div align="left"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ipc_fifo_close(ipc_fifo_t&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">f);</span></div>
</div>
</div>
<div>&nbsp; 当通信结束的时候，应该调用此函数来关闭FIFO，它会先删除FIFO文件和关闭文件描述符，最后释放fifo结构。<br />
<br />
<strong>&nbsp; &#9679;&nbsp;</strong>获取TLS FIFO</div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
<div align="left"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">ipc_fifo_t</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;ipc_fifo_tls_get();</span></div>
</div>
</div>
<div>&nbsp; 该函数一般被发送数据接口调用，若成功则返回一个FIFO结构，否则为NULL；每个线程对应一个FIFO对象，对于同一线程，获取的是同一个FIFO对象，而后便可调用ipc_fifo_write来发送数据。</div>
<br />
<div><strong style="font-size:12pt">工作流程</strong></div>
<div><strong style="font-size: 10pt">&nbsp; 创建FIFO</strong><hr />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/fifo_make.PNG" width="570" height="484" /></div>
</div>
<div>&nbsp; 适用于FIFO客户端和服务端，但服务端由于要异步处理众多FIFO客户端，因此要注意以下2个问题，这也是使用FIFO技术通信的一些细节。</div>
<div>&nbsp; 1）必须以<span style="color: red;">非阻塞读写方式</span>打开知名FIFO，即以O_CREAT|O_RDWR|O_NONBLOCK标志来调用ipc_fifo_open，这样才不会阻塞等待某个客户端以同步写方式打开知名FIFO而返回，因为它使用O_RDWR标志，这样自己既读又写，加上O_NONBLOCK，就立即返回了。</div>
<div>&nbsp; 2）必须以<span style="color: red;">非阻塞只读方式</span>打开对应客户端FIFO，即以O_RDONLY|O_NONBLOCK标志调用ipc_fifo_open，这样就不会阻塞接受客户端建立连接而返回。</div>
<br />
<strong style="font-size: 10pt">&nbsp; 建立FIFO连接</strong><hr />
<div>
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/tls_fifo_create.PNG" width="630" height="497" /></div>
&nbsp; 适用于FIFO客户端，被发送数据接口调用，考虑到服务端可能事先没有打开知名FIFO来监听连接，所以这里先以<span style="color: red;">异步方式写打开</span><span style="color: red;">知名FIFO</span><span style="color: red;">，</span>如果成功则改以<span style="color: red;">阻塞方式发送唯一路径名</span>到服务端，如果发送完全后，接着以<span style="color: red;">同步方式写打开唯一FIFO</span>，这是为了等待服务端打开了对应的唯一FIFO。</div>
<br />
<div><strong style="font-size: 10pt">&nbsp; 发送数据</strong></div>
<hr />
<div align="center"><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/fifo_tls_write.PNG" width="485" height="484" /></div>
&nbsp; 适用于FIFO客户端，当TLS中没有关联对应的FIFO时，则先调用fifo_tls_get进入建立FIFO连接流程，而后再发数据。
<img src ="http://www.cppblog.com/qinqing1984/aggbug/208992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2014-12-01 00:13 <a href="http://www.cppblog.com/qinqing1984/archive/2014/12/01/208992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（6）: TCP内核调优与转储设置</title><link>http://www.cppblog.com/qinqing1984/archive/2014/03/24/206316.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Mon, 24 Mar 2014 10:44:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2014/03/24/206316.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/206316.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2014/03/24/206316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/206316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/206316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;为了方便更改系统tcp内核的一些参数，编写ktcpopt脚本如下 
<div align="center"></div>
<div align="center"></div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#!&nbsp;/bin/bash&nbsp;<br /></span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#&nbsp;ktcpopt&nbsp;<br /></span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sed&nbsp;-i&nbsp;'/net.ipv4.tcp_syncookies\|net.ipv4.tcp_tw_reuse\|net.ipv4.tcp_tw_recycle\|net.ipv4.tcp_fin_timeout\|net.ipv4.tcp_max_syn_backlog\|net.ipv4.tcp_max_tw_buckets\|net.ipv4.ip_local_port_range/d'&nbsp;/etc/sysctl.conf<br /></span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sed&nbsp;-i&nbsp;'$a\</span><span style="color: red;">net.ipv4.tcp_syncookies=1</span><span style="color: #000000">\n</span><span style="color: red;">net.ipv4.tcp_tw_reuse=1</span><span style="color: #000000">\n</span><span style="color: red;">net.ipv4.tcp_tw_recycle=1</span><span style="color: #000000">\n</span><span style="color: red;">net.ipv4.tcp_fin_timeout=30</span><span style="color: #000000">\n</span><span style="color: red;">net.ipv4.tcp_max_syn_backlog=8192</span><span style="color: #000000">\n</span><span style="color: red;">net.ipv4.tcp_max_tw_buckets=5000</span><span style="color: #000000">\n</span><span style="color: red;">net.ipv4.ip_local_port_range=10000&nbsp;65000</span><span style="color: #000000">'&nbsp;/etc/sysctl.conf</span></div></div></div><br />&nbsp;&nbsp;为了方便配置程序的崩溃调试，编写coredump脚本如下 
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#!&nbsp;/bin/bash<br /></span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#&nbsp;coredump<br /></span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sed&nbsp;-i&nbsp;'/ulimit&nbsp;-c&nbsp;unlimited\|export&nbsp;core_path=\/tmp\/corefiles\|mkdir&nbsp;-p&nbsp;$core_path\|echo&nbsp;"0"&nbsp;&gt;&nbsp;\/proc\/sys\/kernel\/core_uses_pid\|echo&nbsp;"$core_path\/%e"&nbsp;&gt;&nbsp;\/proc\/sys\/kernel\/core_pattern/d'&nbsp;~/.bashrc<br /></span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sed&nbsp;-i&nbsp;'$a\</span><span style="color: red;">ulimit&nbsp;-c&nbsp;unlimited</span><span style="color: #000000">\n</span><span style="color: red;">export&nbsp;core_path=/tmp/corefiles</span><span style="color: #000000">\n</span><span style="color: red;">mkdir&nbsp;-p&nbsp;$core_path</span><span style="color: #000000">\n</span><span style="color: red;">echo&nbsp;"0"&nbsp;&gt;&nbsp;/proc/sys/kernel/core_uses_pid</span><span style="color: #000000">\n</span><span style="color: red;">echo&nbsp;"$core_path/%e"&nbsp;&gt;&nbsp;/proc/sys/kernel/core_pattern</span><span style="color: #000000">'&nbsp;~/.bashrc</span></div></div></div>
<div align="left"><br />&nbsp;&nbsp;&nbsp;从以上2个脚本可以看出，为避免每次调用脚本时增加重复行以致配置文件逐渐变大，先删除已经存在的相关配置，再在末尾增加。这里使用了sed来实现直接在文件中删除和增加，其中由于删除操作的匹配模式有多个，因此使用了|符号并用\转义，并且第2个脚本模式文本中含有/符号，这与sed本身的模式限定符/存在歧义，因此也用了\转义；增加使用$a\命令来实现在文件末尾增加配置，并用\n换行。</div> <img src ="http://www.cppblog.com/qinqing1984/aggbug/206316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2014-03-24 18:44 <a href="http://www.cppblog.com/qinqing1984/archive/2014/03/24/206316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（5）: 自动生成并安装服务脚本</title><link>http://www.cppblog.com/qinqing1984/archive/2014/01/03/205140.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Fri, 03 Jan 2014 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2014/01/03/205140.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/205140.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2014/01/03/205140.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/205140.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/205140.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt">脚本概述</strong><br />&nbsp;&nbsp;&nbsp;一般地，当在目标机器编译安装某个服务程序后，为了使服务能开机自启动和关机自停止，则需要将其添加为系统服务。但不同的Linux系统管理服务的方法不同，如Ubuntu使用update-rc.d命令，而RedHat则使用chkconfig命令。因此为了能自动识别系统的类型，减少人工控制，编写了一个简单的autosrv脚本，要求至少1个最多2个参数，特点如下：<br />&nbsp;&nbsp;&nbsp;&#9679; 第1个参数只能为install或uninstall，表示安装或卸载服务。<br />&nbsp;&nbsp;&nbsp;&#9679; 第2参数是可选的，表示系统名称，如果没有指定，那么会自动识别，若出现提示错误，则表示应该要显式指定系统名称了。<br /><br /><strong style="font-size: 12pt">脚本实现</strong><br />
<div align="center"></div></span>
<div align="center"></div>
<div align="center"></div>
<div align="center"></div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#!&nbsp;/bin/bash<br /></span><span style="color: #008080">&nbsp;&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#&nbsp;autosrv<br /></span><span style="color: #008080">&nbsp;&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />if&nbsp;[&nbsp;$#&nbsp;-lt&nbsp;1&nbsp;];&nbsp;then<br /></span><span style="color: #008080">&nbsp;&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Usage:&nbsp;$(basename&nbsp;"$0")&nbsp;install&nbsp;|&nbsp;uninstall&nbsp;[sysname]"<br /></span><span style="color: #008080">&nbsp;&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;exit<br /></span><span style="color: #008080">&nbsp;&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />elif&nbsp;[&nbsp;"$1"&nbsp;!=&nbsp;"install"&nbsp;-a&nbsp;"$1"&nbsp;!=&nbsp;"uninstall"&nbsp;];&nbsp;then<br /></span><span style="color: #008080">&nbsp;&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"The&nbsp;first&nbsp;parameter&nbsp;must&nbsp;be&nbsp;install&nbsp;or&nbsp;uninstall"&nbsp;<br /></span><span style="color: #008080">&nbsp;&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;exit<br /></span><span style="color: #008080">&nbsp;10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />fi<br /></span><span style="color: #008080">&nbsp;11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />action=$1<br /></span><span style="color: #008080">&nbsp;13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sysname=$2<br /></span><span style="color: #008080">&nbsp;14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />srv_path=/etc/init.d/srv_name<br /></span><span style="color: #008080">&nbsp;15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />if&nbsp;[&nbsp;-z&nbsp;"$sysname"&nbsp;];&nbsp;then<br /></span><span style="color: #008080">&nbsp;17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;sysname=`lsb_release&nbsp;-a&nbsp;|&nbsp;sed&nbsp;-n&nbsp;'2p'&nbsp;|&nbsp;awk&nbsp;'{if($0~/[Uu][Bb][Uu][Nn][Tt][Uu]/)&nbsp;print&nbsp;"ubuntu";&nbsp;else&nbsp;if($0~/[Dd][Ee][Bb][Ii][Aa][Nn]/)&nbsp;print&nbsp;"debian";&nbsp;else&nbsp;if($0~/[Rr][Ee][Dd][Hh][Aa][Tt]/)&nbsp;print&nbsp;"redhat";&nbsp;else&nbsp;if($0~/[Cc][Ee][Nn][Tt][Oo][Ss]/)&nbsp;print&nbsp;"centos";&nbsp;else&nbsp;print&nbsp;""}'`<br /></span><span style="color: #008080">&nbsp;18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;-z&nbsp;"$sysname"&nbsp;];&nbsp;then<br /></span><span style="color: #008080">&nbsp;19</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Unknown&nbsp;system,&nbsp;please&nbsp;manual&nbsp;special&nbsp;it&nbsp;with&nbsp;the&nbsp;second&nbsp;parameter"<br /></span><span style="color: #008080">&nbsp;20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit<br /></span><span style="color: #008080">&nbsp;21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">&nbsp;22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Current&nbsp;system&nbsp;is&nbsp;$sysname"<br /></span><span style="color: #008080">&nbsp;23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />fi<br /></span><span style="color: #008080">&nbsp;24</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />create_file_ubu</span><span style="color: #000000">ntu_debia</span><span style="color: #000000">n()<br /></span><span style="color: #008080">&nbsp;26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;27</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />cat&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&lt;&nbsp;END&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;$srv_path<br /></span><span style="color: #008080">&nbsp;28</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#!&nbsp;/bin/bash<br /></span><span style="color: #008080">&nbsp;29</span><span style="color: #000000"><img style="color: #ff0000" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">.&nbsp;/lib/lsb/init-functions</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;30</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;31</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />END<br /></span><span style="color: #008080">&nbsp;32</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />cat&nbsp;srv_name.body&nbsp;&gt;&gt;&nbsp;$srv_path<br /></span><span style="color: #008080">&nbsp;33</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;34</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;35</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />create_file_redhat_centos()<br /></span><span style="color: #008080">&nbsp;36</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;37</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />cat&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&lt;&nbsp;END&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;$srv_path<br /></span><span style="color: #008080">&nbsp;38</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#!&nbsp;/bin/bash<br /></span><span style="color: #008080">&nbsp;39</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">#chkconfig:2345&nbsp;90&nbsp;10</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;40</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">#description: srv name</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;41</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;42</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">.&nbsp;/etc/rc.d/init.d/functions</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;43</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;44</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />END<br /></span><span style="color: #008080">&nbsp;45</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />cat&nbsp;srv_name.body&nbsp;&gt;&gt;&nbsp;$srv_path<br /></span><span style="color: #008080">&nbsp;46</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;47</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;48</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />chmod_file()<br /></span><span style="color: #008080">&nbsp;49</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;50</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;chmod&nbsp;u+x&nbsp;$srv_path<br /></span><span style="color: #008080">&nbsp;51</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;52</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;53</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />remove_file()<br /></span><span style="color: #008080">&nbsp;54</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;55</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;-f&nbsp;$srv_path<br /></span><span style="color: #008080">&nbsp;56</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;57</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;58</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />install_ubuntu_debian()<br /></span><span style="color: #008080">&nbsp;59</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;60</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;create_file_ubuntu_debian<br /></span><span style="color: #008080">&nbsp;61</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;chmod_file<br /></span><span style="color: #008080">&nbsp;62</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">update-rc.d</span><span style="color: #000000">&nbsp;srv_name&nbsp;</span><span style="color: #ff0000">defaults&nbsp;90&nbsp;10</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;63</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;64</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;65</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />uninstall_ubuntu_debian()<br /></span><span style="color: #008080">&nbsp;66</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;67</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">update-rc.d&nbsp;-f</span><span style="color: #000000">&nbsp;srv_name&nbsp;</span><span style="color: #ff0000">remove</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;68</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;remove_file<br /></span><span style="color: #008080">&nbsp;69</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;70</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;71</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />install_redhat_centos()<br /></span><span style="color: #008080">&nbsp;72</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;73</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;create_file_redhat_centos<br /></span><span style="color: #008080">&nbsp;74</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;chmod_file<br /></span><span style="color: #008080">&nbsp;75</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">chkconfig&nbsp;</span><span style="color: #ff0000">--add</span><span style="color: #000000">&nbsp;srv_name<br /></span><span style="color: #008080">&nbsp;76</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;77</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;78</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />uninstall_redhat_centos()<br /></span><span style="color: #008080">&nbsp;79</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />{<br /></span><span style="color: #008080">&nbsp;80</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">chkconfig&nbsp;</span><span style="color: #ff0000">--</span><span style="color: #ff0000">del&nbsp;</span><span style="color: #000000">srv_name<br /></span><span style="color: #008080">&nbsp;81</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;remove_file<br /></span><span style="color: #008080">&nbsp;82</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />}<br /></span><span style="color: #008080">&nbsp;83</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;84</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />case&nbsp;"$sysname"&nbsp;in<br /></span><span style="color: #008080">&nbsp;85</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ubuntu|debian)<br /></span><span style="color: #008080">&nbsp;86</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;"$action"&nbsp;=&nbsp;"install"&nbsp;];&nbsp;then<br /></span><span style="color: #008080">&nbsp;87</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install_ubuntu_debian<br /></span><span style="color: #008080">&nbsp;88</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;else<br /></span><span style="color: #008080">&nbsp;89</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uninstall_ubuntu_debian<br /></span><span style="color: #008080">&nbsp;90</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">&nbsp;91</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;;;<br /></span><span style="color: #008080">&nbsp;92</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;93</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;redhat|centos)<br /></span><span style="color: #008080">&nbsp;94</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;"$action"&nbsp;=&nbsp;"install"&nbsp;];&nbsp;then<br /></span><span style="color: #008080">&nbsp;95</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;install_redhat_centos<br /></span><span style="color: #008080">&nbsp;96</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;else<br /></span><span style="color: #008080">&nbsp;97</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uninstall_redhat_centos<br /></span><span style="color: #008080">&nbsp;98</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">&nbsp;99</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;;;<br /></span><span style="color: #008080">100</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">101</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;*)<br /></span><span style="color: #008080">102</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Currently&nbsp;only&nbsp;support&nbsp;ubuntu,&nbsp;debian,&nbsp;redhat&nbsp;and&nbsp;centos&nbsp;system"<br /></span><span style="color: #008080">103</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;exit<br /></span><span style="color: #008080">104</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;;;<br /></span><span style="color: #008080">105</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />esac</span></div></div></div>&nbsp;&nbsp;&nbsp;从上可知，自动识别的方法是获取<span style="color: #ff0000">lsb_release -a</span>返回的文本再使用awk来匹配<span style="color: #ff0000">ubuntu</span>,<span style="color: #ff0000">redhat</span>,<span style="color: #ff0000">debian</span>,<span style="color: #ff0000">centos</span>这几个子串(忽略大小写)。要注意的是，返回的文本可能有所不同。<br /><br />&nbsp;&nbsp;&nbsp;当系统安装了LSB模块时，返回结果如下<br />&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/redhat-lsb-release.jpg" width="1028" height="111" /><br /><br />&nbsp;&nbsp;&nbsp;没有安装时，返回结果如下<br />&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ubuntu-lsb-release-2.jpg" width="1028" height="92" /><br />
<div align="left">&nbsp;&nbsp;&nbsp;无论哪种情况，要提取分析的都是第2行文本，因此使用了<span style="color: #ff0000">sed -n '2p'</span>。srv_name.body是不同系统相同的用于生成最终服务脚本的部分代码文件，通常包含了start,stop,status,restart几个函数，只是没有包含前面的一部分，而这部分则由autosrv脚本来根据不同的系统生成不同的代码。</div><img src ="http://www.cppblog.com/qinqing1984/aggbug/205140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2014-01-03 17:11 <a href="http://www.cppblog.com/qinqing1984/archive/2014/01/03/205140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（4）: 使用sed删除行尾的^M字符</title><link>http://www.cppblog.com/qinqing1984/archive/2013/08/08/202415.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Thu, 08 Aug 2013 11:06:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2013/08/08/202415.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/202415.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2013/08/08/202415.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/202415.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/202415.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;由于从其它平台如windows传输文件到类unix平台时，用vim等编辑工具打开时，有时会发现行尾有^M，其实这就是控制字符CR，ASCII码为13。为方便删除这个字符，编写了一个简单的dos2unix脚本，最多带2个参数，特点如下：<br />&nbsp;&nbsp;&nbsp;&#9679;&nbsp;第1个参数表示目标文件或目录，当为文件时则处理非脚本本身的文件，当为目录时则根据第2个参数是否递归处理子目录。 <br />
<div align="left">&nbsp;&nbsp;&nbsp;&#9679; 第2个参数当且仅当第1个参数为目录时有效，表示是否递归处理子目录，当为空时则不处理，为-r时则处理。</div>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">bin</span><span style="color: #000000">/</span><span style="color: #000000">bash<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#&nbsp;dos2unix<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />self_name</span><span style="color: #000000">=</span><span style="color: #000000">$(basename&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$0</span><span style="color: #000000">"</span><span style="color: #000000">)<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />self_dir</span><span style="color: #000000">=</span><span style="color: #000000">$(cd&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$(dirname&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">"</span><span style="color: #000000">;pwd)<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />transform_file()<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_107_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_107_326_Open_Text.style.display='none'; Codehighlighter1_107_326_Closed_Image.style.display='inline'; Codehighlighter1_107_326_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_107_326_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_107_326_Closed_Text.style.display='none'; Codehighlighter1_107_326_Open_Image.style.display='inline'; Codehighlighter1_107_326_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_107_326_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_107_326_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">$(basename&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">)<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;dir</span><span style="color: #000000">=</span><span style="color: #000000">$(dirname&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">)<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$dir</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dir</span><span style="color: #000000">=</span><span style="color: #000000">$(pwd)<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$dir</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$self_dir</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;]&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$name</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$self_name</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mv&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">.old<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">sed&nbsp;'s</span><span style="color: #ff0000">/^</span><span style="color: #ff0000">M$</span><span style="color: #ff0000">//</span><span style="color: #ff0000">g'&nbsp;$</span><span style="color: #ff0000">1.old&nbsp;&gt;&nbsp;$1</span><span style="color: #008000"><br /></span><span style="color: #008080">19</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">.old<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />transform_dir()<br /></span><span style="color: #008080">24</span><span style="color: #000000"><img id="Codehighlighter1_345_562_Open_Image" onclick="this.style.display='none'; Codehighlighter1_345_562_Open_Text.style.display='none'; Codehighlighter1_345_562_Closed_Image.style.display='inline'; Codehighlighter1_345_562_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_345_562_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_345_562_Closed_Text.style.display='none'; Codehighlighter1_345_562_Open_Image.style.display='inline'; Codehighlighter1_345_562_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_345_562_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_345_562_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;local pdir=$(pwd)</span><span style="color: #000000"><br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;cd $1</span><span style="color: #000000"><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp; for s in `ls`<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;do </span><span style="color: #000000"><br /></span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ -f "$s" ]; then</span><span style="color: #000000"><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">transform_file&nbsp;"$s"</span></span><span style="color: #000000"><br /></span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br /></span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$s</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$2</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">eq&nbsp;"</span><span style="color: #000000">1"</span><span style="color: #000000">&nbsp;];&nbsp;then</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br /></span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">transform_dir&nbsp;"$s"&nbsp;"</span><span style="color: #ff0000">1"</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi&nbsp;<br /></span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;done&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #000000"><font color="#008080">39</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;cd $pdir<br /></span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}&nbsp;<br /></span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">42</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />transform()<br /></span><span style="color: #008080">43</span><span style="color: #000000"><img id="Codehighlighter1_577_907_Open_Image" onclick="this.style.display='none'; Codehighlighter1_577_907_Open_Text.style.display='none'; Codehighlighter1_577_907_Closed_Image.style.display='inline'; Codehighlighter1_577_907_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_577_907_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_577_907_Closed_Text.style.display='none'; Codehighlighter1_577_907_Open_Image.style.display='inline'; Codehighlighter1_577_907_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_577_907_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_577_907_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #008080">45</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">transform_file&nbsp;"$</span><span style="color: #ff0000">1"</span><span style="color: #000000"><br /></span><span style="color: #008080">46</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">else</span><span style="color: #000000"><br /></span><span style="color: #008080">47</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$2</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #000000"><font color="#008080">48</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_r</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000"><br /></span><span style="color: #000000"><font color="#008080">49</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">else</span><span style="color: #000000"><br /></span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$2</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">-r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #008080">51</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_r</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">52</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">else</span><span style="color: #000000"><br /></span><span style="color: #008080">53</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;$(basename&nbsp;$0)&nbsp;directory&nbsp;-r</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">54</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">55</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">56</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">57</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #000000"><font color="#008080">58</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #000000"><font color="#008080">59</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">transform_dir&nbsp;"$</span><span style="color: #ff0000">1"</span><span style="color: #ff0000">&nbsp;"$is_r"</span><span style="color: #000000"><br /></span><span style="color: #008080">60</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">else</span><span style="color: #000000"><br /></span><span style="color: #008080">61</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1&nbsp;is&nbsp;neither&nbsp;file&nbsp;nor&nbsp;directory</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">62</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">63</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">64</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;fi<br /></span><span style="color: #008080">65</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">66</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">67</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">if</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then<br /></span><span style="color: #000000"><font color="#008080">68</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;transform&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;$</span><span style="color: #000000">2</span><span style="color: #000000"><br /></span><span style="color: #000000"><font color="#008080">69</font><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">else</span><span style="color: #000000"><br /></span><span style="color: #008080">70</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;$(basename&nbsp;$0)&nbsp;file&nbsp;or&nbsp;directory&nbsp;[-r]</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">71</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br /></span><span style="color: #008080">72</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />fi</span></div></div></div> <img src ="http://www.cppblog.com/qinqing1984/aggbug/202415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2013-08-08 19:06 <a href="http://www.cppblog.com/qinqing1984/archive/2013/08/08/202415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Linux平台的高级IO扩展函数</title><link>http://www.cppblog.com/qinqing1984/archive/2013/08/02/202310.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Fri, 02 Aug 2013 11:44:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2013/08/02/202310.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/202310.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2013/08/02/202310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/202310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/202310.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于read、readv、write和writev函数一次读或写有时并不能满足所要求的数据，因此需要多次调用直到要求的字节数或者出错。针对这4个系统调用，编写了对应的xxxn版本，实现如下 Code highlighting produced by Actipro CodeHighlighter (freeware)http:...&nbsp;&nbsp;<a href='http://www.cppblog.com/qinqing1984/archive/2013/08/02/202310.html'>阅读全文</a><img src ="http://www.cppblog.com/qinqing1984/aggbug/202310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2013-08-02 19:44 <a href="http://www.cppblog.com/qinqing1984/archive/2013/08/02/202310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算Linux系统和进程CPU及内存使用率</title><link>http://www.cppblog.com/qinqing1984/archive/2013/05/31/200727.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Fri, 31 May 2013 11:04:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2013/05/31/200727.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/200727.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2013/05/31/200727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/200727.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/200727.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基本原理&nbsp;&nbsp;&nbsp;1）系统CPU使用率等于两个时间点的CPU非空闲时间差除以CPU时间总量差得到的百分比，这两者可从/proc/stat文件获得。&nbsp;&nbsp;&nbsp;2）系统内存使用率等于系统物理内存消耗量除以系统物理内存总量(memtotal，以KB为单位)得到的百分比，这两者可从/proc/meminfo文件获得。&nbsp;&nbsp;&nbsp;3...&nbsp;&nbsp;<a href='http://www.cppblog.com/qinqing1984/archive/2013/05/31/200727.html'>阅读全文</a><img src ="http://www.cppblog.com/qinqing1984/aggbug/200727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2013-05-31 19:04 <a href="http://www.cppblog.com/qinqing1984/archive/2013/05/31/200727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（3）: 使用awk统计磁盘空间</title><link>http://www.cppblog.com/qinqing1984/archive/2012/11/01/194166.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Thu, 01 Nov 2012 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2012/11/01/194166.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/194166.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2012/11/01/194166.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/194166.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/194166.html</trackback:ping><description><![CDATA[&#160;&#160;&#160;本文以统计磁盘文件系统已用空间为例说明awk的用法，使用命令df可获得磁盘文件系统的相关信息，如下图所示 
<div align="left">&#160;&#160;&#160;&#160;&#160;&#160;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ubuntu-normal-df-2.jpg" /></div>&#160;&#160;&#160;第3列Used便是已用空间的数据，这是正常的情形。当第1列Filesystem文本过长时，就有可能换行输出，这是特殊的情形，如下图所示 
<div align="left">&#160;&#160;&#160;&#160;&#160;&#160;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ubuntu-special-df.JPG" /></div>&#160;&#160;&#160;针对这两种情形，如何写出有效的命令脚本来统计Used列的数据和呢？从上面两图观察对比显然可得，以空白符开头的文本行便是特殊情形，需要计算的是第2列；而正常情形的文本行，便是第3列。因此可得出awk脚本:&#160;&#160;&#160;<span style="color: #ff0000">a</span><span style="color: red">wk '{ if($0~/^ /) s+=$2; else s+=$3;} END{ print "Used total is: "s }'</span><span style="color: #00000">。<br /></span><span style="color: red"><br /></span>&#160;&#160;&#160;用于正常情形，输出如下 
<div align="left">&#160;&#160;&#160;&#160;&#160;&#160;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ubuntu-normal-df-awk.jpg" />&#160;&#160;&#160;<br />&#160;&#160;&#160;而特殊情形，则输出如下</div>
<div align="left">&#160;&#160;&#160;&#160;&#160;&#160;<img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/qinqing1984/ubuntu-special-df-awk.JPG"/></div>  <img src ="http://www.cppblog.com/qinqing1984/aggbug/194166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2012-11-01 17:47 <a href="http://www.cppblog.com/qinqing1984/archive/2012/11/01/194166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（2）: 查看TCP服务器的性能</title><link>http://www.cppblog.com/qinqing1984/archive/2012/09/04/189437.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Tue, 04 Sep 2012 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2012/09/04/189437.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/189437.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2012/09/04/189437.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/189437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/189437.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;为方便查看特定TCP服务器进程的CPU、内存和网络连接情况，编写了一个简单的脚本perf.sh，其原理是指定--tcp或-t选项来调用netstat命令，指定aux -T选项参数调用ps命令，对输出结果根据进程名称或PID调用grep过滤；为了输出结果的可读性，先调用ps和netstat，用head取出保存大多是说明描述性的头几行。这里的实现具有如下特点：<br />
&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; display: inline !important; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&#9679;</span> 支持单独查看CPU和内存利用率，或网络连接情况，或两者皆可，name表示进程名，address表示网络地址<br />
&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; display: inline !important; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&#9679;</span> 支持输出重定向，使用exec实现将标准输出重定向到file文件，当没指定-o file选项参数时，则为标准输出<br />
&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; display: inline !important; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&#9679;</span> 支持设置刷新时间，当没指定-t seconds选项参数时，则默认为3秒&nbsp;<br />
&nbsp;&nbsp;&nbsp;<span style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; display: inline !important; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&#9679;</span> <span style="line-height: 19px; widows: 2; text-transform: none; background-color: #ffffff; font-variant: normal; font-style: normal; text-indent: 0px; display: inline !important; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: #4b4b4b; font-weight: normal; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">支持显示多线程，当指定-m选项时，则显示多个线程的情况，默认不显示</span>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">bin</span><span style="color: #000000">/</span><span style="color: #000000">bash<br />
</span><span style="color: #008080">&nbsp;&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#perf.sh<br />
</span><span style="color: #008080">&nbsp;&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />name</span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />address</span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />file</span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />seconds</span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />show_mthread</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />is_count</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">getopts</span><span style="color: #000000">&nbsp;:p:n:o:t:mv&nbsp;opt<br />
</span><span style="color: #008080">&nbsp;12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;$opt&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;p)&nbsp;&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">$OPTARG<br />
</span><span style="color: #008080">&nbsp;15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;n)&nbsp;&nbsp;address</span><span style="color: #000000">=</span><span style="color: #000000">$OPTARG<br />
</span><span style="color: #008080">&nbsp;17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;o)&nbsp;&nbsp;file</span><span style="color: #000000">=</span><span style="color: #000000">$OPTARG<br />
</span><span style="color: #008080">&nbsp;19</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;t)&nbsp;&nbsp;seconds</span><span style="color: #000000">=</span><span style="color: #000000">$OPTARG<br />
</span><span style="color: #008080">&nbsp;21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;m)&nbsp;&nbsp;show_mthread</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;24</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;v)&nbsp;&nbsp;is_count</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;'</span><span style="color: #000000">?</span><span style="color: #000000">')&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$0:&nbsp;invalid&nbsp;option&nbsp;-$OPTARG</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&amp;</span><span style="color: #000000">2</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;27</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;$0&nbsp;[-p&nbsp;name]&nbsp;[-n&nbsp;address]&nbsp;[-o&nbsp;file]&nbsp;[-t&nbsp;seconds]&nbsp;[-m]</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&amp;</span><span style="color: #000000">2</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;28</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">exit&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;29</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">&nbsp;30</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">esac</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;31</span><span style="color: #000000"><img style="color: #0000ff" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">done</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;32</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;33</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />shift&nbsp;$((OPTIND</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">))<br />
</span><span style="color: #008080">&nbsp;34</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;35</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$name</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">a&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$address</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;36</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: red">&nbsp;&nbsp;</span><span style="color: #000000">print</span><span style="color: #000000">f&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage&nbsp;$(basename&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;[-p&nbsp;name]&nbsp;[-n&nbsp;address]&nbsp;[-o&nbsp;file]&nbsp;[-t&nbsp;seconds]&nbsp;[-m]\nname&nbsp;or&nbsp;address&nbsp;must&nbsp;not&nbsp;be&nbsp;null\n</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;37</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">exit&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;38</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;39</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;40</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$seconds</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;41</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;seconds</span><span style="color: #000000">=</span><span style="color: #000000">3</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;42</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;43</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;44</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />psflag</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">aux</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;45</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$show_mthread</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;46</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;psflag</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">$psflag&nbsp;-T</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;47</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;48</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;49</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />psheader</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">`</span><span style="color: #ff0000">ps&nbsp;</span><span style="color: #000000">$psflag&nbsp;|&nbsp;head&nbsp;-n&nbsp;1`</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;50</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />sortflag</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-k3nr&nbsp;-k4nr</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #339966">#sort&nbsp;by&nbsp;descend&nbsp;order&nbsp;according&nbsp;to&nbsp;cpu&nbsp;and&nbsp;mem&nbsp;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;51</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;52</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />netflag</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-an&nbsp;--tcp&nbsp;--inet</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;53</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />netheader</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">`</span><span style="color: #ff0000">netstat&nbsp;</span><span style="color: #000000">$netflag&nbsp;|&nbsp;head&nbsp;-n&nbsp;2`</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;54</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />is_exist</span><span style="color: #000000">=</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;55</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;56</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />show_process_info()<br />
</span><span style="color: #008080">&nbsp;57</span><span style="color: #000000"><img id="Codehighlighter1_938_1180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_938_1180_Open_Text.style.display='none'; Codehighlighter1_938_1180_Closed_Image.style.display='inline'; Codehighlighter1_938_1180_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_938_1180_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_938_1180_Closed_Text.style.display='none'; Codehighlighter1_938_1180_Open_Image.style.display='inline'; Codehighlighter1_938_1180_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_938_1180_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_938_1180_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;58</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;59</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">255</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;60</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;61</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">&nbsp;62</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">`</span><span style="color: #ff0000">ps</span><span style="color: #000000">&nbsp;$psflag&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">grep&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">E&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">grep&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">E&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">v&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">gdb|grep|$0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">sort&nbsp;</span><span style="color: #000000">$sortflag`<br />
</span><span style="color: #008080">&nbsp;63</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$result</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;64</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_exist</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;65</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;66</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is_exist</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;67</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">uptime&nbsp;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&nbsp;</span><span style="color: #008080">68</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$psheader</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;69</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$result</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;70</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;71</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;72</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;73</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;74</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />show_net_connection()<br />
</span><span style="color: #008080">&nbsp;75</span><span style="color: #000000"><img id="Codehighlighter1_1205_1465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1205_1465_Open_Text.style.display='none'; Codehighlighter1_1205_1465_Closed_Image.style.display='inline'; Codehighlighter1_1205_1465_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1205_1465_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1205_1465_Closed_Text.style.display='none'; Codehighlighter1_1205_1465_Open_Image.style.display='inline'; Codehighlighter1_1205_1465_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1205_1465_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1205_1465_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;76</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">z&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;77</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">255</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;78</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;79</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br />
</span><span style="color: #008080">&nbsp;80</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">`</span><span style="color: #ff0000">netstat&nbsp;&nbsp;</span><span style="color: #000000">$netflag&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">grep&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">E&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">`&nbsp;<br />
</span><span style="color: #008080">&nbsp;81</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$result</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;82</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$netheader</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;83</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$is_count</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;84</span><span style="color: #000000"><img id="Codehighlighter1_1400_1411_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1400_1411_Open_Text.style.display='none'; Codehighlighter1_1400_1411_Closed_Image.style.display='inline'; Codehighlighter1_1400_1411_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1400_1411_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1400_1411_Closed_Text.style.display='none'; Codehighlighter1_1400_1411_Open_Image.style.display='inline'; Codehighlighter1_1400_1411_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$result</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">awk&nbsp;'</span><span style="color: #000000">/^</span><span style="color: #000000">tcp</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1400_1411_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1400_1411_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">S[$NF]&nbsp;}</span></span><span style="color: #000000">&nbsp;END</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1416_1444_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1416_1444_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(a&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;S)&nbsp;print&nbsp;a,&nbsp;S[a]&nbsp;}</span></span><span style="color: #000000">'<br />
</span><span style="color: #008080">&nbsp;85</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;86</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;87</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;88</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;89</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;90</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />tmpfile</span><span style="color: #000000">=</span><span style="color: #000000">`mktemp&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">tmp</span><span style="color: #000000">/</span><span style="color: #000000">per.XXXXXXXXXXXX`<br />
</span><span style="color: #008080">&nbsp;91</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;92</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;93</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;94</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;95</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;$tmpfile<br />
</span><span style="color: #008080">&nbsp;96</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;97</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;98</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;show_process_info&nbsp;$name<br />
</span><span style="color: #008080">&nbsp;99</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;show_net_connection&nbsp;$address<br />
</span><span style="color: #008080">100</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000"><br />
</span><span style="color: #008080">101</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">102</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;sleep&nbsp;$seconds<br />
</span><span style="color: #008080">103</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">104</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then&nbsp;</span><span style="color: #000000"><br />
</span><span style="color: #008080">105</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&gt;&amp;-</span><span style="color: #000000"><br />
</span><span style="color: #008080">106</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">107</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$is_exist</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">108</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;$tmpfile&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;$file<br />
</span><span style="color: #008080">109</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">110</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">111</span><span style="color: #000000"><img id="Codehighlighter1_1781_1790_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1781_1790_Open_Text.style.display='none'; Codehighlighter1_1781_1790_Closed_Image.style.display='inline'; Codehighlighter1_1781_1790_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1781_1790_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1781_1790_Closed_Text.style.display='none'; Codehighlighter1_1781_1790_Open_Image.style.display='inline'; Codehighlighter1_1781_1790_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size</span><span style="color: #000000">=</span><span style="color: #000000">`ls&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">l&nbsp;$file&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;awk&nbsp;'</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1781_1790_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1781_1790_Open_Text"><span style="color: #000000">{print&nbsp;$</span><span style="color: #000000">5</span><span style="color: #000000">}</span></span><span style="color: #000000">'`<br />
</span><span style="color: #008080">112</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;$size&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">ge&nbsp;$(expr&nbsp;</span><span style="color: #000000">1024</span><span style="color: #000000">&nbsp;\</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1024</span><span style="color: #000000">&nbsp;\</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">113</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">dev</span><span style="color: #000000">/</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;$file&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">114</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">115</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
</span><span style="color: #008080">116</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clear<br />
</span><span style="color: #008080">117</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">fi</span><span style="color: #000000"><br />
</span><span style="color: #008080">118</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">done</span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;最后顺便提下，上面是查看某单个服务器进程的性能，若要查看整体服务器系统的性能，可以运用vmstat、iostat和free等命令。 <img src ="http://www.cppblog.com/qinqing1984/aggbug/189437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2012-09-04 16:35 <a href="http://www.cppblog.com/qinqing1984/archive/2012/09/04/189437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用Makefile文件及应用</title><link>http://www.cppblog.com/qinqing1984/archive/2012/08/16/187398.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Thu, 16 Aug 2012 11:29:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2012/08/16/187398.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/187398.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2012/08/16/187398.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/187398.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/187398.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><strong>原理</strong></span><br />&nbsp; &nbsp;<span>在linux平台下编译由多个源码文件或目录组成的项目工程时，需要编写make脚本即Makefile文件来编译，当项目工程宠大时，</span><span style="font-family: Verdana">这种方式比单纯地使用gcc命令行方便快捷，且易于维护。由于具体工程的源码文件数量的多少及名称的不同，因此编写一个较为通用的Makefile文件，</span><span style="font-family: Verdana">来实现编译各种不同的工程，具有重要的参考意义和价值。本文展示了通用Makefile.in文件及其应用示例。</span><font face="Verdana"><span>Makefile.in文件，顾名思义，内部实现用的，应由外部具体的Makefile文件提供具体的命令行参数来调用，它包括exe,static,share三个规则目标，</span><span>因此支持可执行文件、动态库和静态库三种工程的编译，而每种工程又支持debug和release两种版本，默认为release版本，在编译时会自动创建debug或</span><span>release目录来存放所有中间文件*.o和*.d。在其脚本源码中，详见下面实现，小写变量为内部所有，大写变量为make命令行提供的参数，目前支持以下几种命令行参数：</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp; 1）输出名称：OUT_NAME，对于库工程，内部自动添加lib前缀</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp; 2）输出路径：OUT_PATH，</span></font> <span style="font-family: Verdana">末尾反斜杠/</span><span>可有可无</span><br /><font face="Verdana"><span>&nbsp; &nbsp; &nbsp;3）源码路径：SR</span><span>C_PATH，</span></font><span> </span><span style="font-family: Verdana">末尾反</span><span style="font-family: Verdana">斜杠/可有可无</span><br /><font face="Verdana"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4）依赖动态库路径：SHARE_PATH，不带库名称的路径，</span></font> <span style="font-family: Verdana">末尾反斜杠/</span><span>可有可无&nbsp;</span><br /><font face="Verdana"><span>&nbsp; &nbsp; &nbsp;5）依赖动态库名称：SHARE_LIB，不带库路径的名称，内部自动添加-l前缀</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp; 6）依赖静态库路径：STATIC_PATH，不带库名称的路径，</span></font> <span style="font-family: Verdana">末</span><span style="font-family: Verdana">尾反斜杠/可有可无</span><br /><font face="Verdana"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7）依赖静态库路径：STATIC_LIB，不带库路径的名称</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp; 8）预定义宏：MACROS，内部自动添加-D前缀</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp; 9）编译模式：MODE，表示编译成debug或release版本</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于头文件包含的支持，这里没有提供命令行参数，在内部它固定为SRC_PATH、/usr/include和/usr/local/include三个路径，对于大多数的工程，应该</span><span>够用了。</span><span><br /><br /></span><span style="font-size: 12pt"><strong>实现</strong></span><span style="font-size: 12pt"> 
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">#</span><span style="color: #008000">Makefile.in</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span><br /></span><span style="color: #008080">&nbsp;3</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />inc_path&nbsp;</span><span>:=</span><span>&nbsp;$(SRC_PATH)&nbsp;</span><span>/</span><span>usr</span><span>/</span><span>include&nbsp;</span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>include<br /></span><span style="color: #008080">&nbsp;4</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />inc_path&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">addprefix&nbsp;</span><span>-</span><span>I</span><span>,</span><span>$(inc_path))<br /></span><span style="color: #008080">&nbsp;5</span><span><img style="color: #0000ff" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>SHARE_PATH&nbsp;</span><span>+=</span><span>&nbsp;</span><span>/</span><span>usr</span><span>/</span><span>lib&nbsp;</span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>lib<br /></span><span style="color: #008080">&nbsp;6</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>SHARE_PATH&nbsp;&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">addprefix&nbsp;</span><span>-</span><span>L</span><span>,</span><span>$(SHARE_PATH))<br /></span><span style="color: #008080">&nbsp;7</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>SHARE_LIB&nbsp;&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">if</span><span>&nbsp;$(SHARE_LIB)</span><span>,</span><span>$(</span><span style="color: #993300">addprefix&nbsp;</span><span>-</span><span>l</span><span>,</span><span>$(SHARE_LIB)))<br /></span><span style="color: #008080">&nbsp;8</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>STATIC_PATH&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">patsubst&nbsp;</span><span>%/,%,</span><span>$(STATIC_PATH))&nbsp;<br /></span><span style="color: #008080">&nbsp;9</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>STATIC_LIB&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">if</span><span style="color: #993300">&nbsp;</span><span>$(STATIC_PATH)</span><span>,</span><span>$(</span><span style="color: #993300">if</span><span style="color: #993300">&nbsp;</span><span>$(STATIC_LIB)</span><span>,</span><span>$(</span><span style="color: #993300">addprefix&nbsp;</span><span>$(STATIC_PATH)</span><span>/,</span><span>$(STATIC_LIB))))<br /></span><span style="color: #008080">10</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>SRC_PATH&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">patsubst&nbsp;</span><span>%/,%,</span><span>$(SRC_PATH))<br /></span><span style="color: #008080">11</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>MACROS&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">addprefix&nbsp;</span><span>-</span><span>D</span><span>,</span><span>$(MACROS))<br /></span><span style="color: #008080">12</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">13</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />cxxflags&nbsp;</span><span>:=</span><span>&nbsp;</span><span>-</span><span>Wall&nbsp;$(MACROS)<br /></span><span style="color: #008080">14</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">15</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">ifeq&nbsp;</span><span>($(MODE)</span><span>,</span><span>debug)<br /></span><span style="color: #008080">16</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;cxxflags&nbsp;</span><span>+=</span><span>&nbsp;</span><span>-</span><span>g&nbsp;<br /></span><span style="color: #008080">17</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;tmp_path&nbsp;</span><span>:=</span><span>&nbsp;$(SRC_PATH)</span><span>/</span><span>debug<br /></span><span style="color: #008080">18</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">else</span><span><br /></span><span style="color: #008080">19</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;cxxflags&nbsp;</span><span>+=</span><span>&nbsp;</span><span>-</span><span>O2&nbsp;</span><span>-</span><span>DNDEBUG&nbsp;<br /></span><span style="color: #008080">20</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;tmp_path&nbsp;</span><span>:=</span><span>&nbsp;$(SRC_PATH)</span><span>/</span><span>release<br /></span><span style="color: #008080">21</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">endif</span><span><br /></span><span style="color: #008080">22</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">23</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />lib_name&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">addprefix&nbsp;</span><span>lib</span><span>,</span><span>$(OUT_NAME))<br /></span><span style="color: #008080">24</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">25</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />srcs&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">wildcard&nbsp;</span><span>$(SRC_PATH)</span><span>/*.</span><span>c)&nbsp;$(</span><span style="color: #993300">wildcard&nbsp;</span><span>$(SRC_PATH)</span><span>/*.</span><span>cpp)<br /></span><span style="color: #008080">26</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />deps&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">patsubst&nbsp;</span><span>%.</span><span>c</span><span>,%.</span><span>d</span><span>,</span><span>$(</span><span style="color: #993300">patsubst&nbsp;</span><span>%.</span><span>cpp</span><span>,%.</span><span>d</span><span>,</span><span>$(srcs)))<br /></span><span style="color: #008080">27</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />deps&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">foreach</span><span style="color: #993300">&nbsp;</span><span>dep</span><span>,</span><span>$(deps)</span><span>,</span><span>$(</span><span style="color: #993300">notdir&nbsp;</span><span>$(dep)))<br /></span><span style="color: #008080">28</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />deps&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">addprefix&nbsp;</span><span>$(tmp_path)</span><span>/,</span><span>$(deps))<br /></span><span style="color: #008080">29</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">30</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />objs&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">patsubst&nbsp;</span><span>%.</span><span>c</span><span>,%.</span><span>o</span><span>,</span><span>$(</span><span style="color: #993300">patsubst&nbsp;</span><span>%.</span><span>cpp</span><span>,%.</span><span>o</span><span>,</span><span>$(srcs)))<br /></span><span style="color: #008080">31</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />objs&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">foreach</span><span style="color: #993300">&nbsp;</span><span>obj</span><span>,</span><span>$(objs)</span><span>,</span><span>$(</span><span style="color: #993300">notdir&nbsp;</span><span>$(obj)))<br /></span><span style="color: #008080">32</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />objs&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">addprefix&nbsp;</span><span>$(tmp_path)</span><span>/,</span><span>$(objs))<br /></span><span style="color: #008080">33</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">34</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />share_name&nbsp;&nbsp;</span><span>:=</span><span>&nbsp;$(tmp_path)</span><span>/</span><span>$(lib_name)</span><span>.</span><span>so<br /></span><span style="color: #008080">35</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />static_name&nbsp;</span><span>:=</span><span>&nbsp;$(tmp_path)</span><span>/</span><span>$(lib_name)</span><span>.</span><span>a<br /></span><span style="color: #008080">36</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />exe_name&nbsp;&nbsp;&nbsp;&nbsp;</span><span>:=</span><span>&nbsp;$(tmp_path)</span><span>/</span><span>$(OUT_NAME)<br /></span><span style="color: #008080">37</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">38</span><span><img style="color: #0000ff" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">override&nbsp;</span><span>MACROS&nbsp;</span><span>:=</span><span>&nbsp;$(</span><span style="color: #993300">if</span><span style="color: #993300">&nbsp;</span><span>$(MACROS)</span><span>,</span><span>$(</span><span style="color: #993300">addprefix&nbsp;</span><span>-</span><span>D</span><span>,</span><span>$(MACROS)))<br /></span><span style="color: #008080">39</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">40</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span>.</span><span style="color: #0000ff">PHONY</span><span>:</span><span>&nbsp;</span><span style="color: #ff0000">exe&nbsp;lib&nbsp;static&nbsp;share&nbsp;c</span><span style="color: #ff0000">lean&nbsp;c</span><span style="color: #ff0000">onfig</span><span><br /></span><span style="color: #008080">41</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">42</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />arflags&nbsp;&nbsp;&nbsp;&nbsp;</span><span>:=</span><span>&nbsp;</span><span>-</span><span>rc<br /></span><span style="color: #008080">43</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">44</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">defin</span><span style="color: #0000ff">e&nbsp;</span><span>MKDIR</span><span><br /></span><span style="color: #008080">45</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span>&nbsp;[&nbsp;</span><span>!</span><span>&nbsp;</span><span>-</span><span>d&nbsp;$(tmp_path)&nbsp;];&nbsp;</span><span style="color: #0000ff">then&nbsp;</span><span>\</span><span><br /></span><span style="color: #008080">46</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff00ff">mkdir</span><span style="color: #ff00ff">&nbsp;</span><span>$(tmp_path);</span><span>\</span><span><br /></span><span style="color: #008080">47</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">fi&nbsp;</span><span><br /></span><span style="color: #008080">48</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">endef</span><span><br /></span><span style="color: #008080">49</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">50</span><span><img style="color: #ff0000" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">config</span><span>:</span><span><br /></span><span style="color: #008080">51</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;@$(</span><span style="color: #0000ff">MKDIR</span><span>)<br /></span><span style="color: #008080">52</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">53</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">exe</span><span>:</span><span>&nbsp;</span><span style="color: #ff0000">config&nbsp;</span><span>$(exe_name)<br /></span><span style="color: #008080">54</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">55</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">lib</span><span>:</span><span>&nbsp;</span><span style="color: #ff0000">config&nbsp;</span><span style="color: #ff0000">static&nbsp;</span><span style="color: #ff0000">share</span><span><br /></span><span style="color: #008080">56</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">57</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">static</span><span>:</span><span>&nbsp;$(static_name)<br /></span><span style="color: #008080">58</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">59</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">share</span><span>:</span><span>&nbsp;$(share_name)<br /></span><span style="color: #008080">60</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">61</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(exe_name)</span><span>:</span><span>&nbsp;$(objs)&nbsp;<br /></span><span style="color: #008080">62</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@echo</span><span>&nbsp;</span><span>"</span><span>Linking&nbsp;to&nbsp;execute&nbsp;($@&nbsp;:&nbsp;$(objs)).</span><span>"</span><span><br /></span><span style="color: #008080">63</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(CXX)&nbsp;</span><span>-</span><span>o&nbsp;$@&nbsp;$(objs)&nbsp;$(SHARE_PATH)&nbsp;$(SHARE_LIB)&nbsp;$(STATIC_LIB)<br /></span><span style="color: #008080">64</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@cp</span><span>&nbsp;$(exe_name)&nbsp;$(OUT_PATH)&nbsp;<br /></span><span style="color: #008080">65</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">66</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(static_name)</span><span>:</span><span>&nbsp;$(objs)<br /></span><span style="color: #008080">67</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@echo</span><span>&nbsp;</span><span>"</span><span>Archive&nbsp;to&nbsp;static&nbsp;library&nbsp;($@&nbsp;[$(objs)]).</span><span>"</span><span><br /></span><span style="color: #008080">68</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(AR)&nbsp;$(arflags)&nbsp;$@&nbsp;$(objs)<br /></span><span style="color: #008080">69</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@cp</span><span>&nbsp;$(static_name)&nbsp;$(OUT_PATH)&nbsp;<br /></span><span style="color: #008080">70</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">71</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(share_name)</span><span>:</span><span>&nbsp;$(objs)<br /></span><span style="color: #008080">72</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@echo</span><span>&nbsp;</span><span>"</span><span>Linking&nbsp;to&nbsp;shared&nbsp;library&nbsp;($@&nbsp;[$(objs)]).</span><span>"</span><span><br /></span><span style="color: #008080">73</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(CXX)&nbsp;$(cxxflags)&nbsp;</span><span>-</span><span>o&nbsp;$@&nbsp;$(objs)&nbsp;</span><span>-</span><span>fPIC&nbsp;</span><span>-</span><span>shared<br /></span><span style="color: #008080">74</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@cp</span><span>&nbsp;$(share_name)&nbsp;$(OUT_PATH)&nbsp;<br /></span><span style="color: #008080">75</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">76</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(tmp_path)</span><span>/%.</span><span>o</span><span>:</span><span>&nbsp;$(SRC_PATH)</span><span>/%.</span><span>cpp&nbsp;$(tmp_path)</span><span>/%.</span><span>d<br /></span><span style="color: #008080">77</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@echo</span><span>&nbsp;</span><span>"</span><span>Compile&nbsp;$@&nbsp;($&lt;).</span><span>"</span><span><br /></span><span style="color: #008080">78</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(CXX)&nbsp;$(cxxflags)&nbsp;$(inc_path)&nbsp;</span><span>-</span><span>c&nbsp;$</span><span>&lt;</span><span>&nbsp;</span><span>-</span><span>o&nbsp;$@<br /></span><span style="color: #008080">79</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">80</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />$(tmp_path)</span><span>/%.</span><span>d</span><span>:</span><span>&nbsp;$(SRC_PATH)</span><span>/%.</span><span>cpp&nbsp;<br /></span><span style="color: #008080">81</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800080">@echo</span><span>&nbsp;</span><span>"</span><span>Compile&nbsp;$@&nbsp;($&lt;).</span><span>"</span><span><br /></span><span style="color: #008080">82</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(CXX)&nbsp;$(cxxflags)&nbsp;</span><span>-</span><span>MM&nbsp;$</span><span>&lt;</span><span>&nbsp;</span><span>-</span><span>o&nbsp;$@</span><span>.</span><span>$$$$;&nbsp;</span><span>\</span><span><br /></span><span style="color: #008080">83</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;sed&nbsp;</span><span>'</span><span>s,\($*\)\.o[&nbsp;:]*,\1.o&nbsp;$@:,&nbsp;g</span><span>'</span><span>&nbsp;</span><span>&lt;</span><span>&nbsp;$@</span><span>.</span><span>$$$$&nbsp;</span><span>&gt;</span><span>&nbsp;$@;&nbsp;</span><span>\</span><span><br /></span><span style="color: #008080">84</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span>-</span><span>f&nbsp;$@</span><span>.</span><span>$$$$<br /></span><span style="color: #008080">85</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">86</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span>-</span><span style="color: #0000ff">include&nbsp;</span><span>$(deps)<br /></span><span style="color: #008080">87</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">88</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">clean</span><span>:</span><span><br /></span><span style="color: #008080">89</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(RM)&nbsp;$(objs)&nbsp;$(deps)&nbsp;$(share_name)&nbsp;$(static_name)&nbsp;$(exe_name)</span></div></div></div><br /><strong>应用<br /></strong></span></font>&nbsp; &nbsp;<font face="Verdana"><span>这里假设有两个源码子目录netcomm和server，前者为动态库netcomm工程，后者为主程序server工程，它依赖netcomm库，每个目录下都有其自己的</span><span>Makefile，这个用于编译单个模块或主程序，它们的父目录为src，在这个目录下有两个Makefile文件，一个是Makefile.in，这个就是上面讲到的通用内部Makefile；</span><span>另一个是Makefile，这个用来联编所有的模块和主程序。<br /></span></font>&nbsp; &nbsp;<font face="Verdana"><span>先来看下netcomm的Makefile文件内容，</span><span>如下所示<br />
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span>path&nbsp;</span><span>:=</span><span>&nbsp;SRC_PATH</span><span>=.</span><span>&nbsp;OUT_PATH</span><span>=../../</span><span>output<br /></span><span style="color: #008080">&nbsp;2</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;3</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span>.</span><span style="color: #0000ff">PHONY</span><span>:</span><span>&nbsp;</span><span style="color: #ff0000">all&nbsp;debug&nbsp;release&nbsp;clean</span><span><br /></span><span style="color: #008080">&nbsp;4</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;5</span><span><img style="color: #ff0000" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">all</span><span>:</span><span style="color: #ff0000">&nbsp;debug&nbsp;release&nbsp;</span><span><br /></span><span style="color: #008080">&nbsp;6</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span><span><img style="color: #ff0000" alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">debug</span><span>:</span><span><br /></span><span style="color: #008080">&nbsp;8</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;lib&nbsp;MODE</span><span>=</span><span>debug&nbsp;OUT_NAME</span><span>=</span><span>netcommd&nbsp;$(path)<br /></span><span style="color: #008080">&nbsp;9</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">10</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">release</span><span>:</span><span><br /></span><span style="color: #008080">11</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;lib&nbsp;MODE</span><span>=</span><span>release&nbsp;OUT_NAME</span><span>=</span><span>netcomm&nbsp;$(path)<br /></span><span style="color: #008080">12</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">13</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">clean</span><span>:</span><span><br /></span><span style="color: #008080">14</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;clean&nbsp;MODE</span><span>=</span><span>debug&nbsp;OUT_NAME</span><span>=</span><span>netcommd&nbsp;$(path)<br /></span><span style="color: #008080">15</span><span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;clean&nbsp;MODE</span><span>=</span><span>release&nbsp;OUT_NAME</span><span>=</span><span>netcomm&nbsp;$(path)</span></div></div></div></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span></font>&nbsp; &nbsp;<font face="Verdana"><span>再看下server的Makefile文件内容，如下所示</span>&nbsp;&nbsp;&nbsp; 
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span>macros&nbsp;</span><span>:=</span><span>&nbsp;MACROS</span><span>=</span><span>"</span><span>_USE_MEM_POOL=1</span><span>"</span><span><br /></span><span style="color: #008080">&nbsp;2</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;3</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />path&nbsp;</span><span>:=</span><span>&nbsp;SRC_PATH</span><span>=.</span><span>&nbsp;OUT_PATH</span><span>=../../</span><span>output&nbsp;SHARE_PATH</span><span>=../../</span><span>output<br /></span><span style="color: #008080">&nbsp;4</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;5</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span>.</span><span style="color: #0000ff">PH</span><span style="color: #0000ff">ONY</span><span>:</span><span>&nbsp;</span><span style="color: #ff0000">all&nbsp;debug&nbsp;release&nbsp;c</span><span style="color: #ff0000">l</span><span style="color: #ff0000">e</span><span style="color: #ff0000">an&nbsp;</span><span><br /></span><span style="color: #008080">&nbsp;6</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;7</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">all</span><span>:</span><span style="color: #ff0000">&nbsp;debug&nbsp;release&nbsp;</span><span><br /></span><span style="color: #008080">&nbsp;8</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;9</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">debug</span><span>:</span><span><br /></span><span style="color: #008080">10</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;exe&nbsp;MODE</span><span>=</span><span>debug&nbsp;OUT_NAME</span><span>=</span><span>serverd&nbsp;SHARE_LIB</span><span>=</span><span style="font-weight: bold">"</span><span>netcommd</span><span style="font-weight: bold">"</span><span>&nbsp;$(macros)&nbsp;$(path)<br /></span><span style="color: #008080">11</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">12</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">release</span><span>:</span><span><br /></span><span style="color: #008080">13</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;exe&nbsp;MODE</span><span>=</span><span>release&nbsp;OUT_NAME</span><span>=</span><span>server&nbsp;SHARE_LIB</span><span>=</span><span style="font-weight: bold">"</span><span>netcomm</span><span style="font-weight: bold">"</span><span>&nbsp;$(macros)&nbsp;$(path)<br /></span><span style="color: #008080">14</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">15</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">clean</span><span>:</span><span><br /></span><span style="color: #008080">16</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;clean&nbsp;MODE</span><span>=</span><span>debug&nbsp;OUT_NAME</span><span>=</span><span>serverd&nbsp;$(path)<br /></span><span style="color: #008080">17</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span>-</span><span>f&nbsp;</span><span>../</span><span>Makefile</span><span>.</span><span>in&nbsp;clean&nbsp;MODE</span><span>=</span><span>release&nbsp;OUT_NAME</span><span>=</span><span>server&nbsp;$(path)</span></div></div></div>&nbsp;&nbsp;&nbsp;&nbsp;<br /></font>&nbsp; &nbsp;<font face="Verdana">最后看下src的Makefile文件内容，如下所示<br />
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span>.</span><span style="color: #0000ff">PHONY</span><span>:</span><span>&nbsp;</span><span style="color: #ff0000">all&nbsp;release&nbsp;debug&nbsp;clean</span><span><br /></span><span style="color: #008080">&nbsp;2</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;3</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">all</span><span>:</span><span style="color: #ff0000">&nbsp;debug&nbsp;release</span><span><br /></span><span style="color: #008080">&nbsp;4</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;5</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">debug</span><span>:</span><span><br /></span><span style="color: #008080">&nbsp;6</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;debug&nbsp;</span><span>-</span><span>C&nbsp;netcomm&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;debug&nbsp;</span><span>-</span><span>C&nbsp;server<br /></span><span style="color: #008080">&nbsp;8</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;9</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">release</span><span>:</span><span><br /></span><span style="color: #008080">10</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;release&nbsp;</span><span>-</span><span>C&nbsp;netcomm<br /></span><span style="color: #008080">11</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;release&nbsp;</span><span>-</span><span>C&nbsp;server<br /></span><span style="color: #008080">12</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">13</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #ff0000">clean</span><span>:</span><span><br /></span><span style="color: #008080">14</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;clean&nbsp;</span><span>-</span><span>C&nbsp;netcomm<br /></span><span style="color: #008080">15</span><span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;clean&nbsp;</span><span>-</span><span>C&nbsp;server</span></div></div></div></font>&nbsp; &nbsp;<span>以上所有脚本代码，在make 3.81下测试通过。 </span><img src ="http://www.cppblog.com/qinqing1984/aggbug/187398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2012-08-16 19:29 <a href="http://www.cppblog.com/qinqing1984/archive/2012/08/16/187398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell应用（1）: 搜索文本的几种方法</title><link>http://www.cppblog.com/qinqing1984/archive/2011/08/20/153971.html</link><dc:creator>春秋十二月</dc:creator><author>春秋十二月</author><pubDate>Sat, 20 Aug 2011 11:46:00 GMT</pubDate><guid>http://www.cppblog.com/qinqing1984/archive/2011/08/20/153971.html</guid><wfw:comment>http://www.cppblog.com/qinqing1984/comments/153971.html</wfw:comment><comments>http://www.cppblog.com/qinqing1984/archive/2011/08/20/153971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/qinqing1984/comments/commentRss/153971.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/qinqing1984/services/trackbacks/153971.html</trackback:ping><description><![CDATA[<strong>方法1：使用find和xargs命令</strong><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp; find&nbsp;dir | xargs grep str，dir是指某个目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; find file | xargs grep str，file是指某个文件<br />
&nbsp;&nbsp; 注意：这种方法，会递归搜索子目录<br />
<br />
<strong>方法2：直接使用grep命令</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; grep str dir/*，dir是指某个目录，但不递归搜索其子目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; grep&nbsp;-r&nbsp;str dir/*，使用-r选项，递归搜索其子目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; grep&nbsp;str file，file是指某个文件<br />
<br />
<strong>方法3：综合以上两种，写一个shell脚本，代码如下</strong>&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080">&nbsp;1</span><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#!&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">bin</span><span style="color: #000000">/</span><span style="color: #000000">bash<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#&nbsp;findstr.sh&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;$#&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">lt&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">2</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Usage:&nbsp;`basename&nbsp;$0`&nbsp;path&nbsp;name&nbsp;[option]</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />fi&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />path</span><span style="color: #000000">=</span><span style="color: #000000">$</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />name</span><span style="color: #000000">=</span><span style="color: #000000">$</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />shift&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />shift&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">option</span><span style="color: #000000">&nbsp;in&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$@</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;$</span><span style="color: #0000ff">option</span><span style="color: #000000">&nbsp;in<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">r)&nbsp;dir_op</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-r</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">i)&nbsp;lu_op</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">-i</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$option</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">invalid&nbsp;option</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">exit</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;;;<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;esac<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />done&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />grep_str_of_file()<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />{<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file</span><span style="color: #000000">=</span><span style="color: #000000">$</span><span style="color: #000000">1</span><span style="color: #000000"><br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">$</span><span style="color: #000000">2</span><span style="color: #000000"><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out</span><span style="color: #000000">=</span><span style="color: #000000">$(grep&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;$lu_op&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$str</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$out</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">a&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;!</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file:&nbsp;$out</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />}&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />find_str()<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />{<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;file&nbsp;in&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">/*</span><span style="color: #000000"><br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$dir_op</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">-r</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">a&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find_str&nbsp;$file&nbsp;$</span><span style="color: #000000">2</span><span style="color: #000000"><br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$file</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">47</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grep_str_of_file&nbsp;$file&nbsp;$</span><span style="color: #000000">2</span><span style="color: #000000"><br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done<br />
</span><span style="color: #008080">50</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;elif&nbsp;[&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">f&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">$1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;</span><span style="color: #0000ff">then</span><span style="color: #000000"><br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;grep_str_of_file&nbsp;$</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;$</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;fi<br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />}&nbsp;&nbsp;<br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br />
</span><span style="color: #008080">55</span><span style="color: #000000"><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />find_str&nbsp;$path&nbsp;$name</span></div>
</div>
</div>
&nbsp;&nbsp;这样一来，不管$1参数是目录还是文件，都能处理，使用示例如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;findstr /usr/include main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不递归搜索子目录，大小写敏感<br />
&nbsp;&nbsp;&nbsp;&nbsp;findstr /usr/include main -i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不递归搜索子目录，忽略大小写<br />
&nbsp;&nbsp;&nbsp;&nbsp;findstr /usr/include main -r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 递归搜索子目录，大小写敏感<br />
&nbsp;&nbsp;&nbsp;&nbsp;findstr /usr/include main -r&nbsp;&nbsp;-i&nbsp;&nbsp; 递归搜索子目录，忽略大小写</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;findstr main.cpp main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在文件中搜索，大小写敏感<br />
&nbsp;&nbsp;&nbsp;&nbsp;findstr main.cpp main -i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在文件中搜索，忽略大小写&nbsp;<br />
<br />
&nbsp;&nbsp;上面所述的示例中，str不限于特定的文本，可以是带正则表达式的匹配模式。而第3种方法，也可以用sed替换grep来显示文本行，在此基础上能作更多的处理，比如格式化显示、统计匹配的文本个数、搜索策略等，在此就不详究了。  <img src ="http://www.cppblog.com/qinqing1984/aggbug/153971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/qinqing1984/" target="_blank">春秋十二月</a> 2011-08-20 19:46 <a href="http://www.cppblog.com/qinqing1984/archive/2011/08/20/153971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>