﻿<?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++博客-yesg</title><link>http://www.cppblog.com/yesg/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 01:04:45 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 01:04:45 GMT</pubDate><ttl>60</ttl><item><title>(  转载）Linux tcpdump命令详解</title><link>http://www.cppblog.com/yesg/archive/2012/08/26/188286.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Sat, 25 Aug 2012 18:15:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/08/26/188286.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/188286.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/08/26/188286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/188286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/188286.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux tcpdump命令详解简介用简单的话来定义tcpdump，就是：dump the traffic on a network，根据使用者的定义对网络上的数据包进行截获的包分析工具。&nbsp;tcpdump可以将网络中传送的数据包的&#8220;头&#8221;完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤，并提供and、or、not等逻辑语句来帮助你去掉无用的信息...&nbsp;&nbsp;<a href='http://www.cppblog.com/yesg/archive/2012/08/26/188286.html'>阅读全文</a><img src ="http://www.cppblog.com/yesg/aggbug/188286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-08-26 02:15 <a href="http://www.cppblog.com/yesg/archive/2012/08/26/188286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>if we want to ensure our ability to dump core, don't chdir to /</title><link>http://www.cppblog.com/yesg/archive/2012/07/17/183922.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Tue, 17 Jul 2012 10:40:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/17/183922.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/183922.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/17/183922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/183922.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/183922.html</trackback:ping><description><![CDATA[<div>TODO原因</div><img src ="http://www.cppblog.com/yesg/aggbug/183922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-17 18:40 <a href="http://www.cppblog.com/yesg/archive/2012/07/17/183922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Beansdb</title><link>http://www.cppblog.com/yesg/archive/2012/07/17/183851.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Tue, 17 Jul 2012 02:47:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/17/183851.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/183851.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/17/183851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/183851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/183851.html</trackback:ping><description><![CDATA[TODO<img src ="http://www.cppblog.com/yesg/aggbug/183851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-17 10:47 <a href="http://www.cppblog.com/yesg/archive/2012/07/17/183851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(收藏)source insight的一些用法</title><link>http://www.cppblog.com/yesg/archive/2012/07/13/183175.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Fri, 13 Jul 2012 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/13/183175.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/183175.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/13/183175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/183175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/183175.html</trackback:ping><description><![CDATA[<a href="http://xinzero.com/tag/source-insight">http://xinzero.com/tag/source-insight</a>&nbsp;<img src ="http://www.cppblog.com/yesg/aggbug/183175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-13 14:33 <a href="http://www.cppblog.com/yesg/archive/2012/07/13/183175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>error: expected specifier-qualifier-list before 'PQ'(suse上源码安装graphviz)</title><link>http://www.cppblog.com/yesg/archive/2012/07/10/182640.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Tue, 10 Jul 2012 08:43:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/10/182640.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/182640.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/10/182640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/182640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/182640.html</trackback:ping><description><![CDATA[<div>同事需要在suse上安装php的性能测试工具xhprof,图形化展示需要源码安装graphviz<br />选取的源码为graphviz-2.24.0.tar.gz,<br />安装步骤如下<br />1.tar xzvf graphviz-2.24.0.tar.gz<br />2.cd graphviz-2.24.0<br />3../configure<br />4.make<br />报了如下错误<br /><div>&nbsp;gcc -DHAVE_CONFIG_H -I. -I../.. -I../.. -I../../lib/common -I../../lib/gvc -I../../lib/pack -I../../lib/ortho -I../../lib/pathplan -I../../lib/graph -I../../lib/sparse -I../../lib/rbtree -I../../lib/sfdpgen -I../../lib/cdt -I/usr/local/include -g -O2 -Wno-unknown-pragmas -Wstrict-prototypes -Wpointer-arith -Wall -ffast-math -MT multispline.lo -MD -MP -MF .deps/multispline.Tpo -c multispline.c &nbsp;-fPIC -DPIC -o .libs/multispline.o</div><div>multispline.c:1228: error: expected specifier-qualifier-list before 'PQ'<br /><div>In file included from multispline.c:1224:</div><div>../../lib/ortho/fPQ.h:22:1: warning: this is the location of the previous definition</div><div>multispline.c:1234:1: warning: "N_IDX" redefined</div><div>../../lib/ortho/fPQ.h:23:1: warning: this is the location of the previous definition</div>查找multispline.c,<br />使用如下命令find . -name multispline.c&nbsp;,结果为<br /><div>./lib/neatogen/multispline.c</div><div>发现PQ定义在fPQ.h,当前路径下有fPQ.h还是无法编译<br /><div>cd graphviz-2.24.0<br /><div>&nbsp;find . -name "fPQ.h</div><div>./lib/neatogen/fPQ.h</div><div>./lib/ortho/fPQ.h</div>可能是文件不同或是被包含两次，具体没查<br /><div>cd lib/ortho/<br />mkdir -p bak<br />mv * bak<br /><br />然后cd ../neatogen/<br />单独编译neatogen运行make<br />成功<br />cd ../ortho&nbsp;<br />mv bak/*．<br /><br /><div>cd ../../<br />运行make,所有模块都可以编译了</div></div></div></div></div></div><img src ="http://www.cppblog.com/yesg/aggbug/182640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-10 16:43 <a href="http://www.cppblog.com/yesg/archive/2012/07/10/182640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(TODO)ACE读取ini配置文件</title><link>http://www.cppblog.com/yesg/archive/2012/07/08/182223.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Sun, 08 Jul 2012 11:05:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/08/182223.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/182223.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/08/182223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/182223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/182223.html</trackback:ping><description><![CDATA[ACE读取ini配置，需要使用两个类，ACE_Configuration_Heap和<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #cce8cf; ">ACE_Ini_ImpEXP<br />&nbsp;然后调用</span>
<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #cce8cf; ">get_string_value，好像</span>
<span style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #cce8cf; ">get_integer_value不好用</span><img src ="http://www.cppblog.com/yesg/aggbug/182223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-08 19:05 <a href="http://www.cppblog.com/yesg/archive/2012/07/08/182223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centos 5.6下面KosmosFS的安装</title><link>http://www.cppblog.com/yesg/archive/2012/07/07/182085.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Sat, 07 Jul 2012 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/07/182085.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/182085.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/07/182085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/182085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/182085.html</trackback:ping><description><![CDATA[参考文章<a href="http://blog.csdn.net/russell_tao/article/details/7207093">http://blog.csdn.net/russell_tao/article/details/7207093</a>&nbsp;<br />尝试过在centos6.0上编译不成功<br />需要安装的第三方软件如下<br /><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">openssl</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">openssl-devel</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">xfsprogs</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">xfsprogs-devel<br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">e2fsprogs<br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">e2fsprogs-devel<br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">log4cpp</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">boost</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">boost-devel<br />安装jkd,我安装在/usr/lib/jvm/jdk1.7.0_04</p><div></div>开始安装<p>&nbsp;</p>1.wget http://kosmosfs.googlecode.com/files/kfs-0.5.tar.gz<br />2.tar xzvf kfs-0.5.tar.gz<br />3.cd kfs-0.5<br />4.mkdir build<br />5.cd build<br />6.cmake ..<br />7.make<br />8.make install<br />后面参考文章<img src ="http://www.cppblog.com/yesg/aggbug/182085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-07 16:56 <a href="http://www.cppblog.com/yesg/archive/2012/07/07/182085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strace,ltrace功能</title><link>http://www.cppblog.com/yesg/archive/2012/07/06/181960.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Fri, 06 Jul 2012 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/06/181960.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/181960.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/06/181960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/181960.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/181960.html</trackback:ping><description><![CDATA[strace a.out用来查看a.out程序运行中有哪些系统调用<br />ltrace a.out用来查看a.out运行中有哪些库函数调用<img src ="http://www.cppblog.com/yesg/aggbug/181960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-06 19:14 <a href="http://www.cppblog.com/yesg/archive/2012/07/06/181960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（装载） linux 共享库知识整理</title><link>http://www.cppblog.com/yesg/archive/2012/07/06/181908.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Fri, 06 Jul 2012 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/06/181908.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/181908.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/06/181908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/181908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/181908.html</trackback:ping><description><![CDATA[<span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp;创建和使用静态库&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">创建一个静态库是相当简单的。通常使用 ar 程序把一些目标文件（.o）组合在一起，</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">成为一个单独的库，然后运行 ranlib，以给库加入一些索引信息。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">2&nbsp;&nbsp;创建和使用共享库</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">特殊的编译和连接选项</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">-D_REENTRANT&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;使得预处理器符号 _REENTRANT 被定义，这个符号激活一些宏特性。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">-fPIC&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 选项产生位置独立的代码。由于库是在运行的时候被调入，因此这个</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;选项是必需的，因为在编译的时候，装入内存的地址还不知道。如果</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;不使用这个选项，库文件可能不会正确运行。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">-shared&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;选项告诉编译器产生共享库代码。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">-Wl,-soname&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -Wl 告诉编译器将后面的参数传递到连接器。而 -soname 指定了</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;共享库的 soname。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp; ＃ 可以把库文件拷贝到 /etc/ld.so.conf 中列举出的任何目录中，并以</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">root 身份运行 ldconfig；或者</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp; ＃ 运行 export LD_LIBRARY_PATH='pwd'，它把当前路径加到库搜索路径中去。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">3&nbsp;&nbsp;使用高级共享库特性</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">1&gt; ldd 工具</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">ldd 用来显示执行文件需要哪些共享库, 共享库装载管理器在哪里找到了需要的共享库.&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">2&gt; soname&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">共享库的一个非常重要的，也是非常难的概念是 soname--简写共享目标名（short for shared object name）。这是一个为共享库（.so）文件而内嵌在控制数据中的名字。如前面提到的，每一个程序都有一个需要使用的库的清单。这个清单的内容是一系列库的 soname，如同 ldd 显示的那样，共享库装载器必须找到这个清单。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">soname 的关键功能是它提供了兼容性的标准。当要升级系统中的一个库时，并且新库的 soname 和老的库的 soname 一样，用旧库连接生成的程序，使用新的库依然能正常运行。这个特性使得在&nbsp;</span><a href="http://www.acejoy.com/forum-24-1.html" target="_blank" style="word-wrap: break-word; color: #336699; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: blue; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">Linux</a><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp;下，升级使用共享库的程序和定位错误变得十分容易。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">在 Linux 中，应用程序通过使用 soname，来指定所希望库的版本。库作者也可以通过保留或者改变 soname 来声明，哪些版本是相互兼容的，这使得程序员摆脱了共享库版本冲突问题的困扰。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">查看/usr/local/lib 目录，分析 MiniGUI 的共享库文件之间的关系&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">3&gt; 共享库装载器&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">当程序被调用的时候，Linux 共享库装载器（也被称为动态连接器）也自动被调用。它的作用是保证程序所需要的所有适当版本的库都被调入内存。共享库装载器名字是 ld.so 或者是 ld-linux.so，这取决于 Linux libc 的版本，它必须使用一点外部交互，才能完成自己的工作。然而它接受在环境变量和配置文件中的配置信息。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">文件 /etc/ld.so.conf 定义了标准系统库的路径。共享库装载器把它作为搜索路径。为了改变这个设置，必须以 root 身份运行 ldconfig 工具。这将更新 /etc/ls.so.cache 文件，这个文件其实是装载器内部使用的文件之一。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">可以使用许多环境变量控制共享库装载器的操作（表1-4+）。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;表 1-4+ 共享库装载器环境变量</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">变量&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;含义</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LD_AOUT_LIBRARY_PATH&nbsp; &nbsp;&nbsp; &nbsp; 除了不使用 a.out 二进制格式外，与 LD_LIBRARY_PATH 相同。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LD_AOUT_PRELOAD&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;除了不使用 a.out 二进制格式外，与 LD_PRELOAD 相同。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LD_KEEPDIR&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;只适用于 a.out 库；忽略由它们指定的目录。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LD_LIBRARY_PATH&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;将其他目录加入库搜索路径。它的内容应该是由冒号</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;分隔的目录列表，与可执行文件的 PATH 变量具有相同的格式。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;如果调用设置用户 ID 或者进程 ID 的程序，该变量被忽略。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LD_NOWARN&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;只适用于 a.out 库；当改变版本号是，发出警告信息。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LD_PRELOAD&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;首先装入用户定义的库，使得它们有机会覆盖或者重新定义标准库。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;使用空格分开多个入口。对于设置用户 ID 或者进程 ID 的程序，</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;只有被标记过的库才被首先装入。在 /etc/ld.so.perload 中指定</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;了全局版本号，该文件不遵守这个限制。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">4&gt; 使用 dlopen&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp; 另外一个强大的库函数是 dlopen()。该函数将打开一个新库，并把它装入内存。该函数主要用来加载库中的符号，这些符号在编译的时候是不知道的。比如 Apache Web&nbsp;</span><a href="http://www.acejoy.com/forum-9-1.html" target="_blank" style="word-wrap: break-word; color: #336699; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: blue; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">服务器</a><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">利用这个函数在运行过程中加载模块，这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时，都不需要重新编译了。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp; 可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义，并在 dl 库中实现。它需要两个参数：一个文件名和一个标志。文件名可以是我们学习过的库中的 soname。标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话，则立刻计算；如果设置的是 RTLD_LAZY，则在需要的时候才计算。另外，可以指定 RTLD_GLOBAL，它使得那些在以后才加载的库可以获得其中的符号。&nbsp;</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">&nbsp; &nbsp; 当库被装入后，可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数，以获得符号在库中的地址。使用这个地址，就可以获得库中特定函数的指针，并且调用装载库中的相应函数。 作者：perfectpdl 发表于2011-12-25 21:40:34&nbsp;</span><a href="http://blog.csdn.net/perfectpdl/article/details/7101721" target="_blank" style="word-wrap: break-word; color: #336699; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">原文链接</a>&nbsp;<img src ="http://www.cppblog.com/yesg/aggbug/181908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-06 16:57 <a href="http://www.cppblog.com/yesg/archive/2012/07/06/181908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)库函数和系统调用 </title><link>http://www.cppblog.com/yesg/archive/2012/07/06/181885.html</link><dc:creator>nk_ysg</dc:creator><author>nk_ysg</author><pubDate>Fri, 06 Jul 2012 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/yesg/archive/2012/07/06/181885.html</guid><wfw:comment>http://www.cppblog.com/yesg/comments/181885.html</wfw:comment><comments>http://www.cppblog.com/yesg/archive/2012/07/06/181885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yesg/comments/commentRss/181885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yesg/services/trackbacks/181885.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" style="word-wrap: break-word; empty-cells: show; border-collapse: collapse; table-layout: fixed; width: 1662px; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><tbody style="word-wrap: break-word; "><tr style="word-wrap: break-word; "><td id="postmessage_9839" style="word-wrap: break-word; font-size: 14px; ">系统调用（system call）是操作系统内核提供的函数，在内核态运行（kernel mode），属于函数中的低等下人，终身代号9527，虽然低等，但是谁也离不开他们，因为离开他们就没办法和内核打交道了，没办法和内核打交道就什么都歇菜了。。。<br style="word-wrap: break-word; " />linux3.0.0-14的系统调用有346个，可以在源码的 linux-3.0/arch/x86/kernel/syscall_table_32.S文件中找到所有的系统调用编号，如果以汇编的方法调用这些系统函数，那么放在EAX寄存器里面的值就是想要调用的函数的号码，把前20个贴在下面了，很多貌似很熟悉的吧：）ENTRY(sys_call_table)<br /><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_restart_syscall &nbsp; &nbsp; &nbsp; &nbsp;/* 0 - old "setup()" system call, used for restarting */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_exit</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long ptregs_fork</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_read</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_write</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_open &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* 5 */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_close</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_waitpid</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_creat</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_link</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_unlink &nbsp; &nbsp; &nbsp; &nbsp;/* 10 */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long ptregs_execve</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_chdir</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_time</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_mknod</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_chmod &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* 15 */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_lchown16</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_ni_syscall &nbsp; &nbsp; &nbsp; &nbsp;/* old break syscall holder */</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_stat</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_lseek</div><div>&nbsp; &nbsp; &nbsp; &nbsp; .long sys_getpid &nbsp; &nbsp; &nbsp; &nbsp;/* 20 */<br /><br /><span style="line-height: 21px; ">库函数是在系统调用上的一层包装，运行在用户态（user mode），打个比方吧，库函数相当于包工头，系统调用是工人，我们可以自己找工人分任务，但一般是把任务摊给包工头，包工头再去给工人分任务。</span><br style="word-wrap: break-word; line-height: 21px; " /><span style="line-height: 21px; ">所以虽然最终所有的工作都是系统调用做的，但是我们更通常的做法是调用库函数，有以下几个原因：</span><br style="word-wrap: break-word; line-height: 21px; " /><br style="word-wrap: break-word; line-height: 21px; " /><ul type="1" style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 14px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; "><li style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; ">库函数提供了抽象，抽象是个好东西，可以让我们把更多的注意力集中在要解决问题的核心。</li><li style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; ">库函数给我们提供的接口更人性化，所以调用起来更方便。</li><li style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; ">调用库函数更安全，内存管理不用自己太操心。</li><li style="word-wrap: break-word; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; list-style-position: initial; list-style-image: initial; ">调用库函数效率更高，程序跑的更快。虽然库函数最终是调用系统函数，但是库函数会比我们用更好的方式方法调用系统函数。<br /><br /><br />例子可以参考这篇文章<a href="http://blog.csdn.net/high_high/article/details/7102081">http://blog.csdn.net/high_high/article/details/7102081</a></li></ul></div></td></tr></tbody></table><img src ="http://www.cppblog.com/yesg/aggbug/181885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yesg/" target="_blank">nk_ysg</a> 2012-07-06 16:18 <a href="http://www.cppblog.com/yesg/archive/2012/07/06/181885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>