<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GlobStudio &#187; linux</title>
	<atom:link href="http://blog.globstudio.com/tag/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.globstudio.com</link>
	<description>记录成长历程，专注软件开发</description>
	<lastBuildDate>Wed, 14 Dec 2011 07:53:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[转]Linux下查看系统资源使用</title>
		<link>http://blog.globstudio.com/872.html</link>
		<comments>http://blog.globstudio.com/872.html#comments</comments>
		<pubDate>Fri, 20 May 2011 02:06:53 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[Linux开发]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[top]]></category>
		<category><![CDATA[vmstat]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=872</guid>
		<description><![CDATA[top: 主要参数 d：指定更新的间隔，以秒计算。 q：没有任何延迟的更新。如果使用者有超级用户，则top命令将会以最高的优先序执行。 c：显示进程完整的路径与名称。 S：累积模式，会将己完成或消失的子行程的CPU时间累积起来。 s：安全模式。 i：不显示任何闲置(Idle)或无用(Zombie)的行程。 n：显示更新的次数，完成后将会退出to 显示参数: PID（Process ID）：进程标示号。 USER：进程所有者的用户名。 PR：进程的优先级别。 NI：进程的优先级别数值。 VIRT：进程占用的虚拟内存值。 RES：进程占用的物理内存值。 SHR：进程使用的共享内存值。 S：进程的状态，其中S表示休眠，R表示正在运行，Z表示僵死状态，N表示该进程优先值是负数。 %CPU：该进程占用的CPU使用率。 %MEM：该进程占用的物理内存和总内存的百分比。 TIME＋：该进程启动后占用的总的CPU时间。 Command：进程启动的启动命令名称，如果这一行显示不下，进程会有一个完整的命令行。 top命令使用过程中，还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。 &#60;空格&#62;：立刻刷新。 P：根据CPU使用大小进行排序。 T：根据时间、累计时间排序。 q：退出top命令。 m：切换显示内存信息。 t：切换显示进程和CPU状态信息。 c：切换显示命令名称和完整命令行。 M：根据使用内存大小进行排序。 W：将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。 free 1.作用 free命令用来显示内存的使用情况，使用权限是所有用户。 2.格式 free [－b－k－m] [－o] [－s delay] [－t] [－V] 3.主要参数 －b －k －m：分别以字节（KB、MB）为单位显示内存使用情况。 －s delay：显示每隔多少秒数来显示一次内存使用情况。 －t：显示内存总和列。 －o：不显示缓冲区调节列。 uptime 18:59:15 up [...]]]></description>
			<content:encoded><![CDATA[<p>top:<br />
主要参数<br />
d：指定更新的间隔，以秒计算。<br />
q：没有任何延迟的更新。如果使用者有超级用户，则top命令将会以最高的优先序执行。<br />
c：显示进程完整的路径与名称。<br />
S：累积模式，会将己完成或消失的子行程的CPU时间累积起来。<br />
s：安全模式。<br />
i：不显示任何闲置(Idle)或无用(Zombie)的行程。<br />
n：显示更新的次数，完成后将会退出to</p>
<p><span id="more-872"></span><br />
显示参数:<br />
PID（Process ID）：进程标示号。<br />
USER：进程所有者的用户名。<br />
PR：进程的优先级别。<br />
NI：进程的优先级别数值。<br />
VIRT：进程占用的虚拟内存值。<br />
RES：进程占用的物理内存值。<br />
SHR：进程使用的共享内存值。<br />
S：进程的状态，其中S表示休眠，R表示正在运行，Z表示僵死状态，N表示该进程优先值是负数。<br />
%CPU：该进程占用的CPU使用率。<br />
%MEM：该进程占用的物理内存和总内存的百分比。<br />
TIME＋：该进程启动后占用的总的CPU时间。<br />
Command：进程启动的启动命令名称，如果这一行显示不下，进程会有一个完整的命令行。<br />
top命令使用过程中，还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。<br />
&lt;空格&gt;：立刻刷新。<br />
P：根据CPU使用大小进行排序。<br />
T：根据时间、累计时间排序。<br />
q：退出top命令。<br />
m：切换显示内存信息。<br />
t：切换显示进程和CPU状态信息。<br />
c：切换显示命令名称和完整命令行。<br />
M：根据使用内存大小进行排序。<br />
W：将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。</p>
<p>free<br />
1.作用<br />
free命令用来显示内存的使用情况，使用权限是所有用户。</p>
<p>2.格式<br />
free [－b－k－m] [－o] [－s delay] [－t] [－V]</p>
<p>3.主要参数<br />
－b －k －m：分别以字节（KB、MB）为单位显示内存使用情况。<br />
－s delay：显示每隔多少秒数来显示一次内存使用情况。<br />
－t：显示内存总和列。<br />
－o：不显示缓冲区调节列。</p>
<p>uptime<br />
18:59:15 up 25 min,  2 users,  load average: 1.23, 1.32, 1.21<br />
现在的时间<br />
系统开机运转到现在经过的时间<br />
连线的使用者数量<br />
最近一分钟，五分钟和十五分钟的系统负载<br />
参数： -V 显示版本资讯。</p>
<p>vmstat<br />
procs &#8212;&#8212;&#8212;&#8211;memory&#8212;&#8212;&#8212;- &#8212;swap&#8211; &#8212;&#8211;io&#8212;- &#8211;system&#8211; &#8212;-cpu&#8212;-<br />
r  b   swpd free   buff   cache    si   so    bi     bo    in    cs   us  sy  id wa<br />
0  1  24980 10792 8296  47316    5   19   205    52  1161   698  26  3  1  70<br />
1 观察磁盘活动情况<br />
磁盘活动情况主要从以下几个指标了解：<br />
bi：表示从磁盘每秒读取的块数(blocks/s)。数字越大，表示读磁盘的活动越多。<br />
bo：表示每秒写到磁盘的块数（blocks/s）。数字越大，表示写磁盘的活动越多。<br />
wa：cpu等待磁盘I／O（未决的磁盘IO）的时间比例。数字越大，表示文件系统活动阻碍cpu的情况越严重，因为cpu在等待慢速的磁盘系统提供数据。wa为0是最理想的。如果wa经常大于10，可能文件系统就需要进行性能调整了。<br />
2 观察cpu活动情况<br />
vmstat比top更能反映出cpu的使用情况：<br />
us：用户程序使用cpu的时间比例。这个数字越大，表示用户进程越繁忙。<br />
sy：系统调用使用cpu的时间比例。注意，NFS由于是在内核里面运行的，所以NFS活动所占用的cpu时间反映在sy里面。这个数字经常很大 的话，就需要注意是否某个内核进程，比如NFS任务比较繁重。如果us和sy同时都比较大的话，就需要考虑将某些用户程序分离到另外的服务器上面，以免互 相影响。<br />
id：cpu空闲的时间比例。<br />
wa：cpu等待未决的磁盘IO的时间比例。</p>
<p>iostat<br />
用于统计CPU的使用情况及tty设备、硬盘和CD-ROM的I/0量<br />
参数:<br />
-c      只显示CPU行<br />
-d      显示磁盘行<br />
-k      以千字节为单位显示磁盘输出<br />
-t       在输出中包括时间戳<br />
-x      在输出中包括扩展的磁盘指标</p>
<p>avg-cpu:  %user   %nice    %sys %iowait   %idle<br />
20.25    0.18    2.61   76.39    0.57<br />
%iowait 等待本地I/O时CPU空闲时间的百分比<br />
%idle 未等待本地I/O时CPU空闲时间的百分比</p>
<p>Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn<br />
hda               9.86       284.34        84.48     685407     2036<br />
每秒传输数（tps）、每秒512字节块读取数（Blk_read/s）、每秒512字节块写入数（Blk_wrtn/s）和512字节块读取（Blk_read）和写入（Blk_wrtn）的总数量。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/872.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux下误删除文件恢复(Ext3文件系统）</title>
		<link>http://blog.globstudio.com/821.html</link>
		<comments>http://blog.globstudio.com/821.html#comments</comments>
		<pubDate>Mon, 15 Nov 2010 03:44:03 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[Linux开发]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=821</guid>
		<description><![CDATA[今天又误删除了一些代码文件，还没提交到SVN的文件，郁闷，如果重写工作量非常巨大，还要找到了误删除恢复的方法。 方法请参考：http://blog.s135.com/linux_ext3_undelete/ 我已经成功恢复了。哈哈]]></description>
			<content:encoded><![CDATA[<p>今天又误删除了一些代码文件，还没提交到SVN的文件，郁闷，如果重写工作量非常巨大，还要找到了误删除恢复的方法。</p>
<p>方法请参考：<a href="http://blog.s135.com/linux_ext3_undelete/">http://blog.s135.com/linux_ext3_undelete/</a></p>
<p>我已经成功恢复了。哈哈</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/821.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何开发php扩展(续)</title>
		<link>http://blog.globstudio.com/814.html</link>
		<comments>http://blog.globstudio.com/814.html#comments</comments>
		<pubDate>Mon, 01 Nov 2010 07:49:24 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[PHP/Python]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=814</guid>
		<description><![CDATA[一，使用php.ini中的配置 打开yourextension.c 定义变量保存配置值 static char MerId[7] = { 0 }; 1).找到PHP_INI_BEGIN，去掉注释，添加你需要获取的的配置 PHP_INI_BEGIN() PHP_INI_ENTRY(“signorder.MerId”, “”, PHP_INI_ALL, NULL ) PHP_INI_END() 2)在PHP_MINIT_FUNCTION(youextension)中获取配置 取消REGISTER_INI_ENTRIES的注释 REGISTER_INI_ENTRIES(); strncpy(MerId, INI_STR(“signorder.MerId”, sizeof( MerId)-1); 3)打开PHP_MSHUTDOWN_FUNCTION(youextension)中 UNREGISTER_INI_ENTRIES();的注释 4)打开PHP_MINFO_FUNCTION中DISPLAY_INI_ENTRIES();的注释 在php.ini中配置signorder.MerId=”123456&#8243;，即可 二，函数返回值中返回数组 array_init(return_value); add_assoc_long(return_value, “errcode”, result ); add_assoc_string_ex(return_value, “sign”, sizeof(“sign”), ChkValue ); 如何开发php扩展(续) 一，使用php.ini中的配置打开yourextension.c定义变量保存配置值static char MerId[7] = { 0 }; 1).找到PHP_INI_BEGIN，去掉注释，添加你需要获取的的配置PHP_INI_BEGIN()    PHP_INI_ENTRY(“signorder.MerId”, “”, PHP_INI_ALL, NULL )PHP_INI_END() 2)在PHP_MINIT_FUNCTION(youextension)中获取配置取消REGISTER_INI_ENTRIES的注释 [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">一，使用php.ini中的配置</div>
<div id="_mcePaste">打开yourextension.c</div>
<div id="_mcePaste">定义变量保存配置值</div>
<div id="_mcePaste">static char MerId[7] = { 0 };</div>
<div id="_mcePaste">1).找到PHP_INI_BEGIN，去掉注释，添加你需要获取的的配置</div>
<div id="_mcePaste">PHP_INI_BEGIN()</div>
<div id="_mcePaste">PHP_INI_ENTRY(“signorder.MerId”, “”, PHP_INI_ALL, NULL )</div>
<div id="_mcePaste">PHP_INI_END()</div>
<div id="_mcePaste">2)在PHP_MINIT_FUNCTION(youextension)中获取配置</div>
<div id="_mcePaste">取消REGISTER_INI_ENTRIES的注释</div>
<div id="_mcePaste">REGISTER_INI_ENTRIES();</div>
<div id="_mcePaste">strncpy(MerId, INI_STR(“signorder.MerId”, sizeof( MerId)-1);</div>
<div id="_mcePaste">3)打开PHP_MSHUTDOWN_FUNCTION(youextension)中</div>
<div id="_mcePaste">UNREGISTER_INI_ENTRIES();的注释</div>
<div id="_mcePaste">4)打开PHP_MINFO_FUNCTION中DISPLAY_INI_ENTRIES();的注释</div>
<div id="_mcePaste">在php.ini中配置signorder.MerId=”123456&#8243;，即可</div>
<div><span id="more-814"></span></div>
<div id="_mcePaste">二，函数返回值中返回数组</div>
<div id="_mcePaste">array_init(return_value);</div>
<div id="_mcePaste">add_assoc_long(return_value, “errcode”, result );</div>
<div id="_mcePaste">add_assoc_string_ex(return_value, “sign”, sizeof(“sign”), ChkValue );</div>
<p>如何开发php扩展(续)<br />
一，使用php.ini中的配置打开yourextension.c定义变量保存配置值static char MerId[7] = { 0 };<br />
1).找到PHP_INI_BEGIN，去掉注释，添加你需要获取的的配置PHP_INI_BEGIN()    PHP_INI_ENTRY(“signorder.MerId”, “”, PHP_INI_ALL, NULL )PHP_INI_END()<br />
2)在PHP_MINIT_FUNCTION(youextension)中获取配置取消REGISTER_INI_ENTRIES的注释<br />
REGISTER_INI_ENTRIES();strncpy(MerId, INI_STR(“signorder.MerId”, sizeof( MerId)-1);<br />
3)打开PHP_MSHUTDOWN_FUNCTION(youextension)中UNREGISTER_INI_ENTRIES();的注释<br />
4)打开PHP_MINFO_FUNCTION中DISPLAY_INI_ENTRIES();的注释<br />
在php.ini中配置signorder.MerId=”123456&#8243;，即可<br />
二，函数返回值中返回数组array_init(return_value);add_assoc_long(return_value, “errcode”, result );add_assoc_string_ex(return_value, “sign”, sizeof(“sign”), ChkValue );</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/814.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[开源]替代Visio,开源流程图绘制软件 Dia</title>
		<link>http://blog.globstudio.com/702.html</link>
		<comments>http://blog.globstudio.com/702.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 01:35:39 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[Mywitter]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=702</guid>
		<description><![CDATA[Dia是开放源码的流程图软件，是GNU计划的一部分 Dia使用Python开发 项目主页:http://live.gnome.org/Dia]]></description>
			<content:encoded><![CDATA[<p>Dia是开放源码的流程图软件，是GNU计划的一部分<br />
Dia使用Python开发<br />
项目主页:<a href="http://live.gnome.org/Dia">http://live.gnome.org/Dia</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/702.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下获取当前运行进程的文件路径</title>
		<link>http://blog.globstudio.com/698.html</link>
		<comments>http://blog.globstudio.com/698.html#comments</comments>
		<pubDate>Mon, 29 Mar 2010 07:10:59 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=698</guid>
		<description><![CDATA[#include &#60;unistd .h&#62; int get_bin_pathname&#40; char *pathname &#41; &#123; FILE *fp = NULL; char _filename&#91;1024&#93; = &#123;0&#125;; &#160; int _pid = getpid&#40;&#41;; &#160; sprintf&#40;_filename, &#34;dirname `ls -n /proc/%d/exe &#124; awk '{if ($8==\&#34;-&#62;\&#34;) {print $19} else {if ($9==\&#34;-&#62;\&#34;) {print $10} else {print $11}}}'`&#34;, _pid&#41;; fp = popen&#40;_filename, &#34;r&#34;&#41;; fgets&#40;_filename, sizeof&#40;_filename&#41;, fp&#41;; fclose&#40;fp&#41;; &#160; _filename&#91;strlen&#40;_filename&#41;-1&#93; = '\0'; [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;unistd .h&gt;</span>
<span style="color: #0000ff;">int</span> get_bin_pathname<span style="color: #008000;">&#40;</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>pathname <span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">FILE</span> <span style="color: #000040;">*</span>fp <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">char</span> _filename<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">int</span> _pid <span style="color: #000080;">=</span> getpid<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000dd;">sprintf</span><span style="color: #008000;">&#40;</span>_filename, <span style="color: #FF0000;">&quot;dirname `ls -n /proc/%d/exe | awk '{if ($8==<span style="color: #000099; font-weight: bold;">\&quot;</span>-&gt;<span style="color: #000099; font-weight: bold;">\&quot;</span>) {print $19} else {if ($9==<span style="color: #000099; font-weight: bold;">\&quot;</span>-&gt;<span style="color: #000099; font-weight: bold;">\&quot;</span>) {print $10} else {print $11}}}'`&quot;</span>, _pid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    fp <span style="color: #000080;">=</span> popen<span style="color: #008000;">&#40;</span>_filename, <span style="color: #FF0000;">&quot;r&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fgets</span><span style="color: #008000;">&#40;</span>_filename, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>_filename<span style="color: #008000;">&#41;</span>, fp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">fclose</span><span style="color: #008000;">&#40;</span>fp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    _filename<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>_filename<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">strcpy</span><span style="color: #008000;">&#40;</span> pathname, _filename <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #000080;">&lt;</span><span style="color: #000040;">/</span>unistd<span style="color: #000080;">&gt;</span></pre></div></div>

<p><span id="more-698"></span><br />
dirname获取路径，basename获取文件名</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/698.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>进程Bin1加载So1、So2，同时So2也加载So1，会有什么样的表现呢？</title>
		<link>http://blog.globstudio.com/662.html</link>
		<comments>http://blog.globstudio.com/662.html#comments</comments>
		<pubDate>Sun, 14 Mar 2010 08:16:38 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[so]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=662</guid>
		<description><![CDATA[我的初衷是这样的，有一个so1模块实现数据库连接池的管理，其他业务实现so2中需要用到连接池so1，又因为连接池只能有一个，所以连接池在进程Bin1中创建并管理，在so2中获取连接池，实际上就是Bin1中调用so1创建的连接池，哈哈，我的问题解决了。 我的想法是，因为在进程Bin1的一个业务中，会用到多个数据库的连接（多个不同的数据库呃），那么Bin1中创建一个session（session的代码中so1中），用当前线程id作为session的标识，在so2中的业务代码中根据线程id获取到session信息，需要获取什么类型的数据库连接由so2的具体业务确定，获取到连接之后注册到当前session，这样当业务取消或失败的时候，可以统一的abort数据库操作。 测试代码很简单，在dll1.so中是一个单例模式的类 在bin1中创建单例对象，并执行一个增加int的函数 dll2.so中只有一个函数，获取单例并返回一个int值 从结果我们可以发现，实际上dll2.so中使用的单例对象就是bin1中创建的单例对象 测试代码：下载]]></description>
			<content:encoded><![CDATA[<p>我的初衷是这样的，有一个so1模块实现数据库连接池的管理，其他业务实现so2中需要用到连接池so1，又因为连接池只能有一个，所以连接池在进程Bin1中创建并管理，在so2中获取连接池，实际上就是Bin1中调用so1创建的连接池，哈哈，我的问题解决了。</p>
<p>我的想法是，因为在进程Bin1的一个业务中，会用到多个数据库的连接（多个不同的数据库呃），那么Bin1中创建一个session（session的代码中so1中），用当前线程id作为session的标识，在so2中的业务代码中根据线程id获取到session信息，需要获取什么类型的数据库连接由so2的具体业务确定，获取到连接之后注册到当前session，这样当业务取消或失败的时候，可以统一的abort数据库操作。</p>
<p>测试代码很简单，在dll1.so中是一个单例模式的类</p>
<p>在bin1中创建单例对象，并执行一个增加int的函数</p>
<p>dll2.so中只有一个函数，获取单例并返回一个int值</p>
<p>从结果我们可以发现，实际上dll2.so中使用的单例对象就是bin1中创建的单例对象</p>
<p>测试代码：<a href="attachments/files/testdll.zip">下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/662.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chrome已发布Linux下测试版</title>
		<link>http://blog.globstudio.com/393.html</link>
		<comments>http://blog.globstudio.com/393.html#comments</comments>
		<pubDate>Tue, 09 Mar 2010 02:37:36 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[心情随笔]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[ietab]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/393.html</guid>
		<description><![CDATA[Google已经发布了Linux平台的Chrome浏览器，用户可以从http://www.google.com/chrome?platform=linux&#38;hl=zh-CN下载安装。目前是测试版，适用于 Linux(Debian/Ubuntu/Fedora/openSUSE). Linux版Chrome默认使用AR PL UKai CN字体，挺好看的 喜欢Chrome的理由正如Google自己说的那样: 高速：程序启动快，载入网页快 简单：高效、易用性的设计 Chrome 从4.0开始已经支持插件了，给大家推荐一个热门插件，IETab，可以再Chrome中打开IE窗口，以便于浏览某些只支持IE的网站，但是貌似有些在IE下能用的控件不能用了，比如Mercury Quality Center，点击安装之后就没有反应了。还有我每次打开迅雷网站IETab就崩溃，哎 注意：IETab只能在Windows版Chrome中使用，因为Linux下没有IE啊，呵呵 我使用的Linux系统是Ubuntu 9.10]]></description>
			<content:encoded><![CDATA[<p>Google已经发布了Linux平台的Chrome浏览器，用户可以从<a href="http://www.google.com/chrome?platform=linux&amp;hl=zh-CN">http://www.google.com/chrome?platform=linux&amp;hl=zh-CN</a>下载安装。目前是测试版，适用于 Linux(Debian/Ubuntu/Fedora/openSUSE).</p>
<p><a href="http://blog.globstudio.com/wp-content/uploads/2010/03/chrome.gif"><img style="display: inline; border-width: 0px;" title="chrome" src="http://blog.globstudio.com/wp-content/uploads/2010/03/chrome_thumb.gif" border="0" alt="chrome" width="240" height="172" /></a></p>
<p>Linux版Chrome默认使用AR PL UKai CN字体，挺好看的</p>
<p>喜欢Chrome的理由正如Google自己说的那样:</p>
<p>高速：程序启动快，载入网页快<br />
简单：高效、易用性的设计</p>
<p><span id="more-393"></span></p>
<p>Chrome 从4.0开始已经支持插件了，给大家推荐一个热门插件，<a href="http://www.chromeextensions.org/utilities/ie-tab/">IETab</a>，可以再Chrome中打开IE窗口，以便于浏览某些只支持IE的网站，但是貌似有些在IE下能用的控件不能用了，比如Mercury Quality Center，点击安装之后就没有反应了。还有我每次打开迅雷网站IETab就崩溃，哎</p>
<p>注意：IETab只能在Windows版Chrome中使用，因为Linux下没有IE啊，呵呵</p>
<p>我使用的Linux系统是Ubuntu 9.10 <img src='http://blog.globstudio.com/wp-includes/images/smilies/icon_smile.gif' alt=':smile:' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/393.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux动态库(.so)搜索路径(目录)设置方法</title>
		<link>http://blog.globstudio.com/373.html</link>
		<comments>http://blog.globstudio.com/373.html#comments</comments>
		<pubDate>Tue, 02 Mar 2010 09:37:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开发技术]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[so]]></category>

		<guid isPermaLink="false">http://www.globstudio.com/373.html</guid>
		<description><![CDATA[在Linux 中，动态库的搜索路径除了默认的搜索路径外，还可通过三种方法来指定：方法一：在配置文件/etc/ld.so.conf中指定动态库搜索路径；方法二：通过环境变量LD_LIBRARY_PATH指定动态库搜索路径；方法三：在编译目标代码时指定该程序的动态库搜索路径。 众所周知，Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后，一般都复制到这两个目录中。当程序执行时需要某动态库，并且该动 态库还未加载到内存中，则系统会自动到这两个默认搜索路径中去查找相应的动态库文件，然后加载该文件到内存中，这样程序就可以使用该动态库中的函数，以及该动态库的其它资源了。在Linux 中，动态库的搜索路径除了默认的搜索路径外，还可以通过以下三种方法来指定。 方法一：在配置文件/etc/ld.so.conf中指定动态库搜索路径。 vi /etc/ld.so.conf 添加 lib目录 ldconfig 方法二：通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。 export LD_LIBRARY_PATH=”LD_LIBRARY_PATH:/opt/” 方法三：在编译目标代码时指定该程序的动态库搜索路径。 还可以在编译目标代码时指定程序的动态库搜索路径。通过gcc 的参数”-Wl,-rpath,”指定]]></description>
			<content:encoded><![CDATA[<p>在Linux 中，动态库的搜索路径除了默认的搜索路径外，还可通过三种方法来指定：方法一：在配置文件/etc/ld.so.conf中指定动态库搜索路径；方法二：通过环境变量LD_LIBRARY_PATH指定动态库搜索路径；方法三：在编译目标代码时指定该程序的动态库搜索路径。 <br/>众所周知，Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后，一般都复制到这两个目录中。当程序执行时需要某动态库，并且该动 态库还未加载到内存中，则系统会自动到这两个默认搜索路径中去查找相应的动态库文件，然后加载该文件到内存中，这样程序就可以使用该动态库中的函数，以及该动态库的其它资源了。在Linux 中，动态库的搜索路径除了默认的搜索路径外，还可以通过以下三种方法来指定。</p>
<p> <span id="more-373"></span>
<p>方法一：在配置文件/etc/ld.so.conf中指定动态库搜索路径。 <br/>vi /etc/ld.so.conf <br/>添加 lib目录 <br/>ldconfig <br/>方法二：通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。 <br/>export LD_LIBRARY_PATH=”LD_LIBRARY_PATH:/opt/” <br/>方法三：在编译目标代码时指定该程序的动态库搜索路径。 <br/>还可以在编译目标代码时指定程序的动态库搜索路径。通过gcc 的参数”-Wl,-rpath,”指定</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/373.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下查找并删除</title>
		<link>http://blog.globstudio.com/371.html</link>
		<comments>http://blog.globstudio.com/371.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 05:24:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开发技术]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[xargs]]></category>

		<guid isPermaLink="false">http://blog.0goshopping.com/371.html</guid>
		<description><![CDATA[find ./ -name *~ &#124; xargs rm -f 删除当前目录及子目录下的所有文件名以~结尾的文件 xargs &#8211; build and execute command lines from standard input 在使用find命令的-exec选项处理匹配到的文件时， find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制，这样在find命令运行几分钟之后，就会出现溢出错误。错误信息通常是”参数列太长”或”参数列溢出”。这就是xargs命令的用处所在，特别是与find命令一起使用。 find命令把匹配到的文件传递给xargs命令，而xargs命令每次只获取一部分文件而不是全部，不像-exec选项那样。这样它可以先处理最先获取的一部分文件，然后是下一批，并如此继续下去。 在有些系统中，使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程，并非将匹配到的文件全部作为参数一次执行；这样在有些情况下就会出现进程过多，系统性能下降的问题，因而效率不高； 而使用xargs命令则只有一个进程。另外，在使用xargs命令时，究竟是一次获取所有的参数，还是分批取得参数，以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 来看看xargs命令是如何同find命令一起使用的，并给出一些例子。 下面的例子查找系统中的每一个普通文件，然后使用xargs命令来测试它们分别属于哪类文件 #find . -type f -print &#124; xargs file ./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text ./.kde/Autostart/.directory: ISO-8859 text\ &#8230;&#8230; 在整个系统中查找内存信息转储文件(core dump) ，然后把结果保存到/tmp/core.log 文件中： $ find / -name “core” -print &#124; xargs [...]]]></description>
			<content:encoded><![CDATA[<p>find ./ -name *~ | xargs rm -f</p>
<p>删除当前目录及子目录下的所有文件名以~结尾的文件</p>
<p>xargs &#8211; build and execute command lines from standard input</p>
<p>在使用find命令的-exec选项处理匹配到的文件时， find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制，这样在find命令运行几分钟之后，就会出现溢出错误。错误信息通常是”参数列太长”或”参数列溢出”。这就是xargs命令的用处所在，特别是与find命令一起使用。</p>
<p>find命令把匹配到的文件传递给xargs命令，而xargs命令每次只获取一部分文件而不是全部，不像-exec选项那样。这样它可以先处理最先获取的一部分文件，然后是下一批，并如此继续下去。</p>
<p>在有些系统中，使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程，并非将匹配到的文件全部作为参数一次执行；这样在有些情况下就会出现进程过多，系统性能下降的问题，因而效率不高；</p>
<p>而使用xargs命令则只有一个进程。另外，在使用xargs命令时，究竟是一次获取所有的参数，还是分批取得参数，以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。</p>
<p> <span id="more-371"></span>
<p>来看看xargs命令是如何同find命令一起使用的，并给出一些例子。</p>
<p>下面的例子查找系统中的每一个普通文件，然后使用xargs命令来测试它们分别属于哪类文件</p>
<p>#find . -type f -print | xargs file <br/>./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text <br/>./.kde/Autostart/.directory: ISO-8859 text\ <br/>&#8230;&#8230;</p>
<p>在整个系统中查找内存信息转储文件(core dump) ，然后把结果保存到/tmp/core.log 文件中：</p>
<p>$ find / -name “core” -print | xargs echo “” &gt;/tmp/core.log</p>
<p>上面这个执行太慢，我改成在当前目录下查找</p>
<p>#find . -name “file*” -print | xargs echo “” &gt; /temp/core.log <br/># cat /temp/core.log <br/>./file6</p>
<p>在当前目录下查找所有用户具有读、写和执行权限的文件，并收回相应的写权限：</p>
<p># ls -l <br/>drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6 <br/>-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf <br/>-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf <br/># find . -perm -7 -print | xargs chmod o-w <br/># ls -l <br/>drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6 <br/>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf <br/>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf</p>
<p>用grep命令在所有的普通文件中搜索hostname这个词：</p>
<p># find . -type f -print | xargs grep “hostname” <br/>./httpd1.conf:# different IP addresses or hostnames and have them handled by the <br/>./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames <br/>on your</p>
<p>用grep命令在当前目录下的所有普通文件中搜索hostnames这个词：</p>
<p># find . -name \* -type f -print | xargs grep “hostnames” <br/>./httpd1.conf:# different IP addresses or hostnames and have them handled by the <br/>./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames <br/>on your</p>
<p>注意，在上面的例子中， \用来取消find命令中的*在shell中的特殊含义。</p>
<p>find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/371.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN命令大全</title>
		<link>http://blog.globstudio.com/97.html</link>
		<comments>http://blog.globstudio.com/97.html#comments</comments>
		<pubDate>Tue, 15 Dec 2009 01:47:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开发技术]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linux命令]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.0goshopping.com/97.html</guid>
		<description><![CDATA[1、将文件checkout到本地目录 svn checkout path（path是服务器上的目录） 例如：svn checkout svn://192.168.1.1/pro/domain 简写：svn co 2、往版本库中添加新的文件 svn add file 例如：svn add test.php(添加test.php) svn add *.php(添加当前目录下所有的php文件) 3、将改动的文件提交到版本库 svn commit -m “LogMessage” [-N] [--no-unlock] PATH(如果选择了保持锁，就使用-no-unlock开关) 例如：svn commit -m “add test file for my test” test.php 简写：svn ci 4、加锁/解锁 svn lock -m “LockMessage” [--force] PATH 例如：svn lock -m “lock test file” test.php svn unlock [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1、</strong>将文件checkout到本地目录</p>
<p><strong>svn checkout</strong> path（path是服务器上的目录）<br />
例如：svn checkout svn://192.168.1.1/pro/domain<br />
简写：svn co</p>
<p><strong>2、</strong>往版本库中添加新的文件</p>
<p><strong>svn</strong> <strong>add</strong> file<br />
例如：svn add test.php(添加test.php)<br />
svn add *.php(添加当前目录下所有的php文件)</p>
<p><strong>3、</strong>将改动的文件提交到版本库</p>
<p><strong>svn commit</strong> -m “LogMessage” [-N] [--no-unlock] PATH<img src="http://www.blogjava.net/Images/dot.gif" alt="" width="15" height="20" />(如果选择了保持锁，就使用-no-unlock开关)<br />
例如：svn commit -m “add test file for my test” test.php<br />
简写：svn ci</p>
<p><span id="more-97"></span></p>
<p><strong>4、</strong>加锁/解锁</p>
<p><strong>svn lock</strong> -m “LockMessage” [--force] PATH<img src="http://www.blogjava.net/Images/dot.gif" alt="" width="15" height="20" /><br />
例如：svn lock -m “lock test file” test.php<br />
<strong>svn unlock</strong> PATH</p>
<p><strong>5、</strong>更新到某个版本</p>
<p><strong>svn update -r</strong> m path<br />
例如：<br />
svn update如果后面没有目录，默认将当前目录以及子目录下的所有文件都更新到最新版本。<br />
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)<br />
svn update test.php(更新，于版本库同步。如果在提交的时候提示过期的话，是因为<strong>冲突，需要先update，修改文件</strong>，然后清除<strong>svn resolved</strong>，最后再提交commit)<br />
简写：svn up</p>
<p><strong>6、</strong>查看文件或者目录状态</p>
<p>1）<strong>svn status</strong> path<img src="http://www.blogjava.net/Images/dot.gif" alt="" width="15" height="20" />（目录下的文件和子目录的状态，正常状态不显示）<br />
【?：不在svn的控制中；M：内容被修改；C：发生冲突；A：预定加入到版本库；K：被锁定】<br />
2）<strong>svn status -v</strong> path<img src="http://www.blogjava.net/Images/dot.gif" alt="" width="15" height="20" />(显示文件和子目录状态)<br />
第一列保持相同，第二列显示工作版本号，第三和第四列显示最后一次修改的版本号和修改人。<br />
注：svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的，原因是svn在本地的.svn中保留了本地版本的原始拷贝。<br />
简写：svn st</p>
<p><strong>7、</strong>删除文件</p>
<p><strong>svn delete</strong> path -m “delete test fle”<br />
例如：svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”<br />
或者直接svn delete test.php 然后再svn ci -m &#8216;delete test file&#8217;，推荐使用这种<br />
简写：svn (del, remove, rm)</p>
<p><strong>8、</strong>查看日志</p>
<p><strong>svn log</strong> path<br />
例如：svn log test.php 显示这个文件的所有修改记录，及其版本号的变化</p>
<p><strong>9、</strong>查看文件详细信息</p>
<p><strong>svn info</strong> path<br />
例如：svn info test.php</p>
<p><strong>10、</strong>比较差异</p>
<p><strong>svn diff</strong> path(将修改的文件与基础版本比较)<br />
例如：svn diff test.php<br />
<strong>svn diff</strong> -r m:n path(对版本m和版本n比较差异)<br />
例如：svn diff -r 200:201 test.php<br />
简写：svn di</p>
<p><strong>11、</strong>将两个版本之间的差异合并到当前文件</p>
<p><strong>svn merge -r</strong> m:n path<br />
例如：svn merge -r 200:205 test.php（将版本200与205之间的差异合并到当前文件，但是一般都会产生冲突，需要处理一下）</p>
<p><strong>12、</strong>SVN 帮助</p>
<p><strong>svn help<br />
svn help ci</strong></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>以上是常用命令，下面写几个不经常用的</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><strong>13、</strong>版本库下的文件和目录列表</p>
<p><strong>svn list</strong> path<br />
显示path目录下的所有属于版本库的文件和目录<br />
简写：svn ls</p>
<p><strong>14、</strong>创建纳入版本控制下的新目录</p>
<p><strong>svn mkdir</strong>: 创建纳入版本控制下的新目录。<br />
用法: 1、mkdir PATH…<br />
2、mkdir URL…<br />
创建版本控制的目录。<br />
1、每一个以工作副本 PATH 指定的目录，都会创建在本地端，并且加入新增<br />
调度，以待下一次的提交。<br />
2、每个以URL指定的目录，都会透过立即提交于仓库中创建。<br />
在这两个情况下，所有的中间目录都必须事先存在。</p>
<p><strong>15、</strong>恢复本地修改</p>
<p><strong>svn revert</strong>: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:<br />
用法: revert PATH…<br />
注意: 本子命令不会存取网络，并且会解除冲突的状况。但是它不会恢复<br />
被删除的目录</p>
<p><strong>16、</strong>代码库URL变更</p>
<p><strong>svn switch (sw):</strong> 更新工作副本至不同的URL。<br />
用法: 1、switch URL [PATH]<br />
2、switch -relocate FROM TO [PATH...]</p>
<p>1、更新你的工作副本，映射到一个新的URL，其行为跟”svn update”很像，也会将<br />
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的<br />
方法。<br />
2、改写工作副本的URL元数据，以反映单纯的URL上的改变。当仓库的根URL变动<br />
(比如方案名或是主机名称变动)，但是工作副本仍旧对映到同一仓库的同一目录时使用<br />
这个命令更新工作副本与仓库的对应关系。</p>
<p><strong>17、</strong>解决冲突</p>
<p><strong>svn resolved:</strong> 移除工作副本的目录或文件的”冲突”状态。<br />
用法: resolved PATH…<br />
注意: 本子命令不会依语法来解决冲突或是移除冲突标记；它只是移除冲突的<br />
相关文件，然后让 PATH 可以再次提交。</p>
<p><strong>18、</strong>输出指定文件或URL的内容。</p>
<p><strong>svn</strong> <strong>cat</strong> 目标[@版本]…如果指定了版本，将从指定的版本开始查找。<br />
svn cat -r PREV filename &gt; filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/97.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

