﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0"  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>leeon | 分享未来</title>
  <link>http://www.leeon.me</link>
  <description>Share Future,Share Internet Technology</description>
  <atom:link href="http://www.leeon.me/feed" rel="self" type="application/rss+xml" />
    <item>
    <title>【转载】getchar()和EOF有关总结</title>
    <link>http://leeon.me/a/getchar-and-eof</link>
	<pubDate>Sat, 21 Jan 2012 12:40:00 +0800</pubDate>
	<category>Linux C/C++编程</category>
    <description><![CDATA[
	getchar()和EOF总结<br />
<br />
大师级经典的著作，要字斟句酌的去读，去理解。以前在看K&R的The C Programming 
Language(SecondEdition)<br />
第1.5节的字符输入/输出，被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下，不然，很多琐碎的知识点长时间过后就会淡忘的，只有写下来才是最好的方法。<br />
其实，getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux，在其他系统下也一样。<br />
一、getchar的两点总结：<br />
1.getchar是以行为单位进行存取的。<br />
当用getchar进行输入时，如果输入的第一个字符为有效字符(即输入是文件结束符EOF，Windows下为组合键Ctrl+Z， 
Unix/Linux下为组合键Ctrl+D)，那么只有当最后一个输入字符为换行符'\n'(也可以是文件结束符EOF，EOF将在后面讨论)时， 
getchar才会停止执行，整个程序将会往下执行。譬如下面程序段：<br />
while((c = getchar()) != EOF){<br />
    
putchar(c);<br />
}<br />
执行程序，输入：abc，然后回车。则程序就会去执行puchar(c)，然后输出abc，这个地方不要忘了，系统输出的还有一个回车。然后可以继续输入，再次遇到换行符的时候，程序又会把那一行的输入的字符输出在终端上。<br />
对于getchar，肯定很多初学的朋友会问，getchar不是以字符为单位读取的吗？那么，既然我输入了第一个字符a，肯定满足while循环(c 
= getchar()) != 
EOF的条件阿，那么应该执行putchar(c)在终端输出一个字符a。不错，我在用getchar的时候也是一直这么想的，但是程序就偏偏不着样执行，而是必需读到一个换行符或者文件结束符EOF才进行一次输出。<br />
对这个问题的一个解释是，在大师编写C的时候，当时并没有所谓终端输入的概念，所有的输入实际上都是按照文件进行读取的，文件中一般都是以行为单位的。因此，只有遇到换行符，那么程序会认为输入结束，然后采取执行程序的其他部分。同时，输入是按照文件的方式存取的，那么要结束一个文件的输入就需用到EOF 
(Enf Of File). 
这也就是为什么getchar结束输入退出时要用EOF的原因。<br />
2.getchar()的返回值一般情况下是字符，但也可能是负值，即返回EOF。<br />
这里要强调的一点就是，getchar函数通常返回终端所输入的字符，这些字符系统中对应的ASCII值都是非负的。因此，很多时候，我们会写这样的两行代码：<br />
char 
c;<br />
c = 
getchar();<br />
这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外，在遇到Ctrl+D(Linux下)即文件结束符EOF时，getchar 
()的返回EOF，这个EOF在函数库里一般定义为-1。因此，在这种情况下，getchar函数返回一个负值，把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值，正确的定义方法如下(K&R 
C中特别提到了这个问题)：<br />
int c;<br />
c = 
getchar();<br />
二、EOF的两点总结(主要指普通终端中的EOF)<br />
1.EOF作为文件结束符时的情况：<br />
EOF虽然是文件结束符，但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能，只有在下列的条件下，才作为文件结束符。<br />
(1)遇到getcahr函数执行时，要输入第一个字符时就直接输入Ctrl+D，就可以跳出getchar(),去执行程序的其他部分；<br />
(2)在前面输入的字符为换行符时，接着输入Ctrl+D；<br />
(3)在前面有字符输入且不为换行符时，要连着输入两次Ctrl+D，这时第二次输入的Ctrl+D起到文件结束符的功能，至于第一次的Ctrl+D的作用将在下面介绍。<br />
其实，这三种情况都可以总结为只有在getchar()提示新的一次输入时，直接输入Ctrl+D才相当于文件结束符。<br />
2.EOF作为行结束符时的情况，这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。<br />
这种情况主要是在进行getchar()新的一行输入时，当输入了若干字符(不能包含换行符)之后，直接输入Ctrl+D，此时的Ctrl+D并不是文件结束符，而只是相当于换行符的功能，即结束当前的输入。以上面的代码段为例，如果执行时输入abc，然后Ctrl+D，程序输出结果为：<br />
<font color="#ff0000">abcabc</font><br />
注意:第一组abc为从终端输入的，然后输入Ctrl+D，就输出第二组abc，同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D，则起到了文件结束符的作用，结束getchar（）。<br />
如果输入abc之后，然后回车，输入换行符的话，则终端显示为：<br />
<font color="#ff0000">abc       //第一行，带回车</font><br />
<font color="#ff0000">abc       
//第二行</font><br />
<font color="#ff0000">           
 //第三行</font><br />
其中第一行为终端输入，第二行为终端输出，光标停在了第三行处，等待新一次的终端输入。<br />
从这里也可以看出Ctrl+D和换行符分别作为行结束符时，输出的不同结果。<br />
EOF的作用也可以总结为：当终端有字符输入时，Ctrl+D产生的EOF相当于结束本行的输入，将引起getchar()新一轮的输入；当终端没有字符输入或者可以说当getchar()读取新的一次输入时，输入Ctrl+D，此时产生的EOF相当于文件结束符，程序将结束getchar()的执行。<br />
【补充】本文第二部分中关于EOF的总结部分，适用于终端驱动处于一次一行的模式下。也就是虽然getchar()和putchar()确实是按照每次一个字符 
进行的。但是终端驱动处于一次一行的模式，它的输入只有到“\n”或者EOF时才结束，因此，终端上得到的输出也都是按行的。如果要实现终端在读一个字符就结束输入的话，下面的程序是一种实现的方法(参考《C专家编程》,略有改动)：<br />
/*Edit 
by Godbach<br />
   CU Blog: http://blog.chinaunix.net/u/33048/<br />
*/<br />
#include 
stdio.h><br />
#include stdlib.h><br />
int<br />
main(void)<br />
{<br />
    int 
c;<br />
    /* 终端驱动处于普通的一次一行模式 */<br />
    system("stty raw");<br />
   <br />
    /* 
现在的终端驱动处于一次一个字符模式 */<br />
     c = getchar();<br />
    putchar();<br />
   <br />
    /* 
终端驱动处又回到一次一行模式 */<br />
     system("stty cooked");<br />
   <br />
    return 
0;<br />
}<br />
编译运行该程序，则当如入一个字符时，直接出处一个字符，然后程序结束。<br />
由此可见，由于终端驱动的模式不同，造成了getchar()输入结束的条件不一样。普通模式下需要回车或者EOF，而在一次一个字符的模式下，则输入一个字符之后就结束了。<br />
希望本文可以对初学C的朋友提供一点帮助，也希望能和其他朋友进行交流。其中理解不对的地方若能得到指正和建议，本人将不胜感激。同时，本文参考了chinaunix.net关于getchar讨论的帖子和一位博友的文章，链接地址分别为：<br />
<a href="http://blog.chinaunix.net/u/9861/showart_64652.html" target="_blank"><font color="#0000ff">http://blog.chinaunix.net/u/9861/showart_64652.html</font></a><br />
<a href="http://bbs.chinaunix.net/viewthread.php?tid=679688&extra=&page=1" target="_blank"><font color="#0000ff">http://bbs.chinaunix.net/viewthread.php?tid=679688&extra=&page=1</font></a><br />	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/169</guid>
  </item>
    <item>
    <title>shell输入与输出高阶知识点汇总</title>
    <link>http://leeon.me/a/bash-shell-advanced-io</link>
	<pubDate>Sat, 14 Jan 2012 12:35:23 +0800</pubDate>
	<category>linux</category>
    <description><![CDATA[
	<p><strong>shell输入输出基本知识点：</strong></p>
<p>&nbsp;a、I/O重定向通常与 FD有关，shell的FD通常为10个，即 0～9； <br />
b、常用FD有3个，为0（stdin，标准输入）、1（stdout，标准输出）、2（stderr，标准错误输出），默认与keyboard、monitor、monitor有关； <br />
c、用 &lt; 来改变读进的数据信道(stdin)，使之从指定的档案读进； <br />
d、用 &gt; 来改变送出的数据信道(stdout, stderr)，使之输出到指定的档案； <br />
e、0 是 &lt; 的默认值，因此 &lt; 与 0&lt;是一样的；同理，&gt; 与 1&gt; 是一样的； <br />
f、在IO重定向 中，stdout 与 stderr 的管道会先准备好，才会从 stdin 读进资料； <br />
g、管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin; <br />
h、tee 命令是在不影响原本 I/O 的情况下，将 stdout 复制一份到档案去; <br />
i、bash（ksh）执行命令的过程：分析命令－变量求值－命令替代（``和$( )）－重定向－通配符展开－确定路径－执行命令； <br />
j、( ) 将 command group 置于 sub-shell 去执行，也称 nested sub-shell，它有一点非常重要的特性是：继承父shell的Standard input, output, and error plus any other open file descriptors。 <br />
k、exec 命令：常用来替代当前 shell 并重新启动一个 shell，换句话说，并没有启动子 shell。使用这一命令时任何现有环境都将会被清除，。exec 在对文件描述符进行操作的时候，也只有在这时，exec 不会覆盖你当前的 shell 环境。 </p>
<p>&nbsp;</p>
<p><strong>IO文件描述符：</strong></p>
<p>&gt;&amp;n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出 <br />
&lt;&amp;n 标准输入复制自文件描述符 n <br />
&lt;&amp;- 关闭标准输入（键盘） <br />
&gt;&amp;- 关闭标准输出 <br />
n&lt;&amp;- 表示将 n 号输入关闭 <br />
n&gt;&amp;- 表示将 n 号输出关闭 <br />
上述所有形式都可以前导一个数字，此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如： <br />
... 2&gt;file 运行一个命令并把错误输出(文件描述符 2)定向到 file。 <br />
... 2&gt;&amp;1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ，但效果通常是合并了两个流。) </p>
<p>&nbsp;</p>
<p><strong>exec命令使用技巧：</strong></p>
<p>exec 0&lt;infilename # 打开文件infilename作为 stdin <br />
exec 1&gt;outfilename # 打开文件outfilename作为stdout <br />
exec 2&gt;errfilename # 打开文件 errfilename作为 stderr <br />
exec 0&lt;&amp;- # 关闭 FD0 <br />
exec 1&gt;&amp;- # 关闭 FD1 <br />
exec 5&gt;&amp;- # 关闭 FD5 </p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/168</guid>
  </item>
    <item>
    <title>【原创】PHP中关于mysqli_affected_rows作用行数返回值的小记</title>
    <link>http://leeon.me/a/php-mysqli_affected_rows</link>
	<pubDate>Tue, 20 Dec 2011 19:59:22 +0800</pubDate>
	<category>php</category>
    <description><![CDATA[
	<p>mysqli中关于update操作影响的行数可以有两种返回形式：</p>
<p>1. 返回匹配的行数</p>
<p>2. 返回影响的行数</p>
<p>默认情况下mysqli_affected_rows返回的值为影响的行数，如果我们需要返回匹配的行数，可以使用mysqli_real_connect函数进行数据库连接的初始化，并在函数的flag参数位加上：</p>
<p>
<table class="doctable table">
<tbody class="tbody" valign="center">
<tr valign="center">
<td align="left"><b><tt><font style="background-color:#316ac5;" color="#ffffff">MYSQLI_CLIENT_FOUND_ROWS</font></tt></b></td>
<td align="left">return number of matched rows, not the number of affected rows</td>
</tr>
</tbody>
</table>
</p>
<p>&nbsp;</p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/167</guid>
  </item>
    <item>
    <title>jQuery UI accordion插件使用小记</title>
    <link>http://leeon.me/a/jquery-ui-accordion-collapsible-all</link>
	<pubDate>Wed, 07 Dec 2011 15:38:23 +0800</pubDate>
	<category>javascript</category>
    <description><![CDATA[
	<p>需要将accordion的所有tab全部收缩，默认情况下是默认展开第一个，查看jquery ui手册有collapsible属性可以设定，但是纯粹加这个属性并不能奏效，官网的demo也显示的有问题，第一个tab还是被展开了。搜索stackoverflow得到的答案：</p>
<p>[code="js"]<br />
$( "#accordion" ).accordion({ <br />
collapsible: true, <br />
active: false <br />
});<br />
[/code]</p>
<p>查看源代码：默认给active设置的0，这个参数影响了collapsible:true，导致第一个tab还是被展开了，这里需要强制将active设置成false</p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/166</guid>
  </item>
    <item>
    <title>【转载】Linux下动态链接库so文件覆盖导致coredump问题的分析</title>
    <link>http://leeon.me/a/linux-cp-so-cause-coredump</link>
	<pubDate>Wed, 30 Nov 2011 11:10:59 +0800</pubDate>
	<category>Linux C/C++编程</category>
    <description><![CDATA[
	<span style="widows:2;text-transform:none;text-indent:0px;border-collapse:separate;font:medium simsun;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;" class="Apple-style-span"><span style="text-align:left;line-height:21px;font-family:simsun;color:#323e32;font-size:14px;" class="Apple-style-span"> <p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:16px;word-break:normal;">尝试解答以下问题：</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>1.</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">为什么<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">cp</span>的方式更新运行中进程的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>，程序会<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">coredump</span></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>2.</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">采用什么方式更新已经加载了的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so,</span>就可以避免<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">coredump</span></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">我们的公共组件绝大部分都支持<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>形式的自定义插件，比如<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">s++,qzhttp,ttc</span>。在不停进程更新<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>的时候往往会产生<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">coredump</span>，并且肯定<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">core</span>得莫名其妙，<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">core</span>得让人心碎。</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><b><span style="line-height:28px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:14pt;word-break:normal;">先看一下用<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">cp</span>的方式更新<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>的时候发生了什么事情</span></b></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><b><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">strace cp new.so old.so</span></b><span class="Apple-converted-space">&nbsp;</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;color:teal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">#strace</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;color:teal;font-size:12pt;word-break:normal;">是人间利器</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><a style="color:#6b5f24;text-decoration:none;" href="http://photo.blog.sina.com.cn/showpic.html#blogid=622a99700100pjv3&amp;url=http://s10.sinaimg.cn/orignal/622a9970g7637a02e3389" target="_blank"></a><img border="0" alt="" src="/upload/2011-11/20111130111113_44195.gif" width="536" height="90" /><br />
</p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">发现老的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>被<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">trunc</span>了，这个过程发生的具体的事情是：</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>1.</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">应用程序通过<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">dlopen</span>打开<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>的时候，<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">kernel</span>通过<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">mmap</span>把<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>加载到进程地址空间，对应于<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">vma</span>里的几个<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">page.</span></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>2.</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">在这个过程中<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">loader</span>会把<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>里面引用的外部符号例如<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">malloc printf</span>等解析成真正的虚存地址。</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>3.</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">当<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>被<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">cp</span>覆盖时，确切地说是被<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">trunc</span>时，<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">kernel</span>会把<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>文件在虚拟内的页<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">purge</span><span class="Apple-converted-space">&nbsp;</span>掉。</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>4.</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">当运行到<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>里面的代码时，因为物理内存中不再有实际的数据（仅存在于虚存空间内），会产生一次缺页中断。</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>5.Kernel</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">从<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>文件中<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">copy</span>一份到内存中去<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">,a)</span>但是这时的全局符号表并没有经过解析，当调用到时就产生<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">segment fault ,&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>b)</span>如果需要的文件偏移大于新的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>的地址范围，就会产生<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">bus error.</span></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">所以，如果用相同的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>去覆盖</span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><b><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>A)</span></b><span class="Apple-converted-space">&nbsp;</span><b><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">如果<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span><span class="Apple-converted-space">&nbsp;</span>里面依赖了外部符号，<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">coredump</span></span></b></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><b><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><span class="Apple-converted-space">&nbsp;</span>B)</span></b><span class="Apple-converted-space">&nbsp;</span><b><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">如果<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>里面没有依赖外部符号，运气不错，不会<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">coredump</span></span></b></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">&nbsp;<wbr></span></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><b><span style="line-height:28px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:14pt;word-break:normal;">所有问题的产生都是因为<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>被<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">trunc</span>了一把，所以如果不用<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">turnc</span>的方式就避免这个问题。<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">Ok,</span>该我们的<span style="line-height:28px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">install</span><span class="Apple-converted-space">&nbsp;</span>上场了。</span></b></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><b><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">strace install new.so old.so</span></b></p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><a style="color:#6b5f24;text-decoration:underline;" href="http://photo.blog.sina.com.cn/showpic.html#blogid=622a99700100pjv3&amp;url=http://s10.sinaimg.cn/orignal/622a9970g9e2c446138d9" target="_blank"></a><img border="0" alt="" src="/upload/2011-11/20111130111151_36601.png" width="547" height="111" /><br />
<br />
</p>
<p style="padding-bottom:0px;line-height:21px;border-right-width:0px;list-style-type:none;margin:0px 0px 5px;padding-left:0px;padding-right:0px;word-wrap:normal;border-top-width:0px;border-bottom-width:0px;word-break:normal;border-left-width:0px;padding-top:0px;"><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;" lang="EN-US" xml:lang="EN-US">install</span><span class="Apple-converted-space">&nbsp;</span><span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">的方式跟<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">cp</span>不同，先<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">unlink</span>再<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">creat</span>，当<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">unlink</span>的时候，已经<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">map</span>的虚拟空间<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">vma</span>中的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">inode</span>结点没有变，只有<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">inode</span>结点的引用计数为<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">0</span>是，<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">kernel</span>才把它干掉。</span></p>
<span style="line-height:24px;font-family:微软雅黑, sans-serif;word-wrap:normal;font-size:12pt;word-break:normal;">也就是新的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>和旧的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>用的不是同一个<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">inode</span>结点，所以不会相互影响。这时只有得启程序才会使用到新的<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>。所以采用这种方式的话就可以避免先<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">stop</span>进程，更新<span style="line-height:24px;word-wrap:normal;word-break:normal;" lang="EN-US" xml:lang="EN-US">so</span>，再重启进程这样比较耗时的操作。</span></span></span>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/165</guid>
  </item>
    <item>
    <title>【原创】判断程序输出是否有被重定向</title>
    <link>http://leeon.me/a/check-stdout-by-isatty</link>
	<pubDate>Mon, 14 Nov 2011 22:47:51 +0800</pubDate>
	<category>Linux C/C++编程</category>
    <description><![CDATA[
	<p>如果我们要拒绝用户将打印输出被重定向输出到其他地方，比如文件或者/dev/null，那么我们可以使用isatty函数来判定程序执行是否有被重定向输出。</p>
<p>示例代码如下：</p>
<p>[code="cpp"]<br />
#include&lt;stdio.h&gt;<br />
#include&lt;unistd.h&gt;<br />
#include&lt;stdlib.h&gt;<br />
<br />
int main(int argc,char **argv){<br />
<br />
     if(!isatty(fileno(stdout))){<br />
         fprintf(stderr,"you are not a terminal!
");<br />
         exit(1);<br />
     }<br />
<br />
    /*********逻辑代码*********/<br />
<br />
      exit(0);<br />
}<br />
[/code]</p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/164</guid>
  </item>
    <item>
    <title>【原创】Galaxy S2 (GT-I9100)国行Google服务安装步骤</title>
    <link>http://leeon.me/a/galaxy-s2-install-google-app</link>
	<pubDate>Sun, 16 Oct 2011 12:07:45 +0800</pubDate>
	<category>生活</category>
    <description><![CDATA[
	<p>最近入手i9100国行一步，一直是google的忠实fans，可惜这国行上google的应用全部给废了，索性研究了一通，把google的原生电子市场和google+安装上去了，写下步骤分享给i9100的机友们：</p>
<p>1. 首先先下载</p>
<p>GoogleServicesFramework.apk<br />
GoogleContactsSyncAdapter.apk<br />
GoogleCalendarSyncAdapter.apk</p>
<p>这三个服务包并安装，下载地址<a href="http://bbs.gfan.com/android-2912275-1-1.html">http://bbs.gfan.com/android-2912275-1-1.html</a></p>
<p>机器最好给越狱root。</p>
<p>2. 然后安装安卓市场或安致市场把google的“电子市场”应用给安装。</p>
<p>3.最后操作i9100：“设定”-&gt;"帐号和同步"-&gt;"添加账户" 这时会出现google的账户图标，点击添加google账户即可，然后转去电子市场应用就发现可以用了</p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/162</guid>
  </item>
    <item>
    <title>rsync使用小记</title>
    <link>http://leeon.me/a/rsync-notes</link>
	<pubDate>Wed, 28 Sep 2011 11:59:13 +0800</pubDate>
	<category>linux</category>
    <description><![CDATA[
	<p>1. rsync 修改配置文件后无须重启rsyncd进程即可立即生效。</p>
<p>2. --delete参数在差量更行目录文件的时候切忌远端和目的端均不需要在目录后面加“*”，例如/aaa/bbb/*</p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/161</guid>
  </item>
    <item>
    <title>【原创】关于shell中变量作用域的思考</title>
    <link>http://leeon.me/a/linux-shell-variable-scope</link>
	<pubDate>Sat, 27 Aug 2011 23:35:55 +0800</pubDate>
	<category>linux</category>
    <description><![CDATA[
	<p>执行一个shell脚本会在当前shell中派生一个子shell去执行任务。同理，如果一个shell脚本中调用另一个shell，也是会在执行到子shell这一步的时候再次派生一个子shell去处理脚本。例如a.sh脚本有如下信息:</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
echo $$<br />
./b.sh<br />
[/code]</p>
<p>b.sh中有:</p>
<p>[code="bash"]<br />
#!/bin/bash <br />
echo $$<br />
[/code]</p>
<p>执行a.sh会发现输出两行不同的进程ID，验证了每个sh在执行的时候会派生一个子shell去执行任务。</p>
<p>在脚本之间调用我们或许会遇到变量之间的调用关系，这里我们需要注意一下几个场景的应用：</p>
<p>场景1， 当前shell中创建一个变量传递给当前脚本派生的子shell，例如：</p>
<p>a.sh</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
a="TEST"<br />
./b.sh<br />
[/code]</p>
<p>b.sh</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
echo $a<br />
[/code]</p>
<p>这时会发现在b.sh中是无法正常获取到a的变量值的，那么我们可以利用<strong><span style="color:#9b014f;">export</span></strong>命令或者<strong><span style="color:#9b014f;">set -a</span></strong>命令来使当前shell的变量激活到派生的子shell中。</p>
<p>我们只需要在a.sh中加入</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
export a="TEST"<br />
[/code]</p>
<p>或者</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
set -a<br />
a="TEST"<br />
[/code]</p>
<p>&nbsp;</p>
<p>场景2，派生的子shell中的变量在当前父shell中使用，例如：</p>
<p>a.sh</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
./b.sh<br />
echo $b<br />
[/code]</p>
<p>b.sh</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
b="TEST"<br />
[/code]</p>
<p>我们来执行a.sh会发现输出的b变量为空。那么我们可以使用source命令或者.(点号)来激活子shell中的变量使其能在父shell中使用。</p>
<p>我们只需要修改a.sh，在调用b.sh前加上特殊命令或字符即可，例如：</p>
<p>[code="bash"]<br />
#!/bin/bash<br />
. ./b.sh<br />
#或者<br />
source ./b.sh<br />
[/code]</p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/160</guid>
  </item>
    <item>
    <title>【原创】为PHP增加LDAP扩展模块支持</title>
    <link>http://leeon.me/a/php-with-ldap</link>
	<pubDate>Tue, 16 Aug 2011 19:39:35 +0800</pubDate>
	<category>php</category>
    <description><![CDATA[
	<p>今日需要部署一套ldap的测试环境，但发现现有php并不支持ldap模块，遂打算重新编译so，但这种方式比较麻烦并且繁琐，如果仅仅是增加一个ldap模块可以通过phpize和configure的方式编译外挂加载ldap的so文件来使php支持ldap扩展拓展。</p>
<p>第一步是找到当前运营环境的php版本，并将此版本的源码包放入运营机器某个目录，解压。</p>
<p>第二步</p>
<p>[code="bash"] cd /xxx/xxx/php-5.2.17/ext/ldap/<br />
/usr/local/php/bin/phpize <br />
./configure --with-php-config=/usr/local/php/bin/php-config --with-ldap[/code]</p>
<p>但是检查过程异常退出，提示如下错误：</p>
<p>&nbsp;[code="bash"]<br />
checking for LDAP support... yes, shared<br />
checking for LDAP Cyrus SASL support... no<br />
checking for 3 arg ldap_set_rebind_proc... yes<br />
checking for ldap_parse_result... no<br />
checking for ldap_parse_reference... no<br />
checking for ldap_start_tls_s... no<br />
checking for ldap_bind_s... no<br />
configure: error: LDAP build check failed. Please check config.log for more information.<br />
[/code]</p>
<p>始终验证不通过，这时候排查openldap2-devel版本，以为此版本比较老，就往高版本升级，但是依旧是同样的错误，最终排查觉得有可能是openldap2-client的版本和openldap2-devel版本不一致导致，于是在网上找了一个和client版本完全匹配的devel rpm包，重新configure顺利通过校验。这个问题比较奇怪，通常情况下编译php是不需要开发包和二进制包版本完全一致，<span style="color:#d6006d;"><strong>但ldap的编译却需要client和devel包版本完全一致</strong></span>。&nbsp;</p>
<p>记得在make ，make install之后在php.ini上将ldap.so写入extension扩展配置中。<img border="0" alt="" src="../editor/plugins/emoticons/100.gif" width="24" height="24" /></p>	]]></description>
	<guid isPermaLink="false">http://www.leeon.me/feed/159</guid>
  </item>
  </channel>


</rss>
