﻿
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[程序之美]]></title> 
<link>http://narmy.cn/linux/index.php</link> 
<description><![CDATA[__________高万龙的博客  博客已转移至http://narmy.cn/blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[程序之美]]></copyright>

<item>
<link>http://narmy.cn/linux/read.php/127.htm</link>
<title><![CDATA[xmonad  @ubuntu10.04]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Mon, 03 May 2010 22:46:35 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/127.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;"><br/>Like the Big workspace in Xmonad. I think it is very suitable for programmers .<br/><br/>1. Install the Xmonad .<br/>2.<br/>~/.xmonad/xmonad.hs<br/><div class="code"><br/><br/><br/>import XMonad<br/>import XMonad.Hooks.DynamicLog<br/>import XMonad.Hooks.ManageDocks<br/>import XMonad.Util.Run(spawnPipe)<br/>import XMonad.Util.EZConfig(additionalKeys)<br/>import XMonad.Util.WorkspaceCompare<br/>import System.IO<br/><br/>myManageHook = composeAll<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#91; className =? &quot;Gimp&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt; doFloat<br/>&nbsp;&nbsp;&nbsp;&nbsp;, className =? &quot;Vncviewer&quot; --&gt; doFloat<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/><br/>main = do<br/>&nbsp;&nbsp;&nbsp;&nbsp;xmproc &lt;- spawnPipe &quot;xmobar&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;xmonad $ defaultConfig<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; manageHook = manageDocks &lt;+&gt; myManageHook -- make sure to include myManageHook definition from above<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;+&gt; manageHook defaultConfig<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, layoutHook = avoidStruts&nbsp;&nbsp;$&nbsp;&nbsp;layoutHook defaultConfig<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, logHook = dynamicLogWithPP $ xmobarPP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; ppOutput = hPutStrLn xmproc<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, ppTitle = xmobarColor &quot;green&quot; &quot;&quot; . shorten 50<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, modMask = mod4Mask&nbsp;&nbsp;&nbsp;&nbsp; -- Rebind Mod to the Windows key<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; `additionalKeys`<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;((controlMask, xK_Print), spawn &quot;sleep 0.2; scrot -s&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, ((0, xK_Print), spawn &quot;scrot&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, ((mod4Mask, xK_semicolon), sendMessage Expand)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/><br/><br/><br/></div><br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">由于super+l用来expand 主窗口的键跟windows下的锁定冲突，所以我又设置了super+;也就是L键右面那个做为expand主窗口键。并且这里把Alt键改成了Super键,也是由于冲突的原因。</div></div><br/><br/>xmobar - ~/.xmobarrc<br/><div class="code"><br/>Config &#123; font = &quot;-misc-fixed-*-*-*-*-13-*-*-*-*-*-*-*&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , bgColor = &quot;black&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , fgColor = &quot;grey&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , position = TopW L 85<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , commands = &#91; Run Network &quot;wlan0&quot; &#91;&quot;-L&quot;,&quot;0&quot;,&quot;-H&quot;,&quot;32&quot;,&quot;--normal&quot;,&quot;green&quot;,&quot;--high&quot;,&quot;red&quot;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Cpu &#91;&quot;-L&quot;,&quot;15&quot;,&quot;-H&quot;,&quot;50&quot;,&quot;--normal&quot;,&quot;green&quot;,&quot;--high&quot;,&quot;red&quot;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Memory &#91;&quot;-t&quot;,&quot;Mem: %&quot;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Swap &#91;&#93; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run Date &quot;%a %b %_d %Y %H:%M:%S&quot; &quot;date&quot; 10<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Run StdinReader<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , sepChar = &quot;%&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , alignSep = &quot;&#125;&#123;&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , template = &quot;%StdinReader% &#125;&#123; %cpu% &#124; %memory% * %swap% &#124; %wlan0% &#124; %date%&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/></div><br/>gdm - /usr/share/xsessions/xmonad.desktop<br/><br/><div class="code"><br/>&#91;Desktop Entry&#93;<br/>Encoding=UTF-8<br/>Name=XMonad<br/>Comment=Leightweight tiling window manager<br/>Exec=xmonad.start<br/>Icon=xmonad.png<br/>Type=XSession<br/></div><br/>xmonad.start is a custom script.<br/><br/>xmonad.start - /usr/local/bin/xmonad.start<br/><div class="code"><br/>#!/bin/bash<br/><br/>xrdb -merge .Xresources<br/><br/>trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --width 15 --height 12 --transparent true --tint 0x000000 &amp;<br/><br/>gnome-screensaver<br/><br/>gnome-settings-daemon<br/><br/>if &#91; -x /usr/bin/gnome-power-manager &#93; ; then<br/>&nbsp;&nbsp; sleep 1<br/>&nbsp;&nbsp; gnome-power-manager<br/>fi<br/><br/>if &#91; -x /usr/bin/nm-applet &#93; ; then<br/>&nbsp;&nbsp; nm-applet --sm-disable &amp;<br/>fi<br/><br/>kmix --keepvisibility<br/><br/>#feh --bg-scale /mnt/archivio/foto/2008-2009-dublino/2009-04-10-stefano/hapenny-desktop.jpg &amp;<br/><br/>exec xmonad<br/><br/></div><br/><br/><br/>最后我再把windowmanager从metacity设成xmonad，就完成了。<br/><br/>&nbsp;&nbsp; $ gconftool-2 -t string -s /desktop/gnome/applications/window_manager/current xmonad<br/>&nbsp;&nbsp; $ gconftool-2 -t string -s /desktop/gnome/session/required_components/windowmanager xmonad<br/><br/><br/><br/>also, here is a step-by-step config<br/><a href="http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen%27s_Configuration" target="_blank">http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen%27s_Configuration</a><br/><br/>and here is a config archive .<br/><br/><a href="http://haskell.org/haskellwiki/Xmonad/Config_archive" target="_blank">http://haskell.org/haskellwiki/Xmonad/Config_archive</a><br/><br/>Enjoy.<br/></span><br/>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/105.htm</link>
<title><![CDATA[升级ubuntu 9.10后无法进入系统解决方法]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Mon, 09 Nov 2009 04:35:01 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/105.htm</guid> 
<description>
<![CDATA[ 
	支持原创，转载请注明：<a href="http://narmy.cn/linux/read.php/105.htm" target="_blank">http://narmy.cn/linux/read.php/105.htm</a><br/><br/>RT，昨天升级过，晚上关机后，今天早上起床就进不了系统了，一个grub的黑屏。<br/><br/>无语，还好我早有准备，看到昨天升级了grub，我早把grub备份了。哈哈。WUBI安装的，就是容易出问题，图个方便而已。<br/><br/>早上修复的过程，有图有真相。<br/><br/><br/>过程是这样的：<br/><div class="code"><br/><br/>注：下面的注释力求简单易懂，使没有linux基础的同学也能根据自己实际情况灵活变通。<br/><br/>grub&gt;ls<br/>grub&gt;ls (hd0,x)/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #找出WUBI安装的盘，里面有ubuntu/这个目录。<br/>grub&gt;insmod ntfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #加载ntfs模块，因为WUBI将ubuntu安装到了我分的ntfs盘上<br/>grub&gt;set root=(hd0,5)&nbsp;&nbsp;&nbsp;&nbsp;#这里(hd0,5)就是我找到的ubuntu安装的分区<br/>grub&gt;ls $Boot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #找到我们BOOT分区的UUID，下一步要用到，我这里显示出来的是2250018e50016a3d<br/>grub&gt;search --no-floppy --fs-uuid --set 2250018e50016a3d&nbsp;&nbsp;&nbsp;&nbsp;#这里的UUID就是上一定找出来的那个<br/>grub&gt;loopback loop0 /ubuntu/disks/root.disk&nbsp;&nbsp; #设loop0,WUBI装ubuntu安装成了一个root.disk文件<br/>grub&gt;set root=(loop0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #重设root<br/>grub&gt;linux /boot/vmlinuzxxxxxxxxx&nbsp;&nbsp; (tab补全即可) root=/dev/sdaX&nbsp;&nbsp;loop=/ubuntu/disks/root.disk ro quiet splash&nbsp;&nbsp;&nbsp;&nbsp;#这里的x我的是5，你的就自己看吧。加载内核<br/>grub&gt;initrd /boot/initrd.imgxxxxxxxxxxxx(tab 补全即可)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#不用说大家都知道<br/>gurb&gt;boot<br/>ENTER就可以启动了。进入熟悉的系统，打开终端<br/>#update-grub2<br/>#reboot<br/></div><br/>这样grub就修复好了。不用再这样麻烦地整了。OK，具体如下图：（在修复你自己grub的时候随机应变即可）<br/><a href="http://narmy.cn/linux/attachment.php?fid=29" target="_blank"><img src="http://narmy.cn/linux/attachment.php?fid=29" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><a href="http://narmy.cn/linux/attachment.php?fid=30" target="_blank"><img src="http://narmy.cn/linux/attachment.php?fid=30" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><a href="http://narmy.cn/linux/attachment.php?fid=31" target="_blank"><img src="http://narmy.cn/linux/attachment.php?fid=31" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><a href="http://narmy.cn/linux/attachment.php?fid=32" target="_blank"><img src="http://narmy.cn/linux/attachment.php?fid=32" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/100.htm</link>
<title><![CDATA[09年10月13日百度运维笔试题分析]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Sun, 25 Oct 2009 03:17:12 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/100.htm</guid> 
<description>
<![CDATA[ 
	转载请注明出处：<a href="http://narmy.cn/linux/read.php/100.htm" target="_blank">http://narmy.cn/linux/read.php/100.htm</a><br/>我参加的是18号的笔试，18号的笔试题我忘了，看到网上有记忆力好的同学记得13号的笔试题，试着做一做：<br/><br/>总共三部分7道题<br/>第一部分·简答<br/>1·简述树的深度优先算法、广度优先算法，及非递归实现的特点。<br/>&nbsp;&nbsp;深度优先搜索法是优先扩展尚未扩展的且具有最大深度的结点；广度优先搜索法是在扩展完第K层的结点以后才扩展K+1层的结点。主要不同点在于深度优先需要使用栈，广度优先使用队列FIFO。<br/>&nbsp;&nbsp;非递归实现要求程序自己设置栈来保存要用到的数据，与递归不同的是递归需要系统来完成数据和程序执行状态在栈中的保存。非递归可以减少数据的冗余以及系统设置栈带来的巨大开销。<br/>2·在文件系统中，元数据（比如ext2中的inode）的基本作用是什么？ext2跟ext3的根本区别是什么？<br/>&nbsp;&nbsp;记录数据的Modify,Access,Create times.以及记录数据的存放块区。并且通过元数据的加锁机制等可以保证数据的一致性。<br/>&nbsp;&nbsp;ext3是ext2的扩展，主要区别是ext3加入了日志系统。它允许以回写(writeback)预定(ordered),数据(data)三种方式记录日志，默认为预定。并默认在日志添满1/4，或某一个日志记时器超时时提交日志。<br/>3·在web服务中，负载均衡的基本作用是什么？请举例你熟悉的一款负载均衡软件或者实现方案，简述它们的实现原理。（这题后半部分为开放性，我也没记多深，大概就这样）<br/>&nbsp;&nbsp;由于系统服务访问量和带宽的暴增，服务器的TCP／IP协议栈，服务器系统的低效和处理器的低效便成为了瓶颈。因此负载均衡集群的出现将服务均匀地分配给提供同一种服务的各个服务器，从而降低单个服务器的负担。<br/>&nbsp;&nbsp;LVS（Linux Vitual Server）:LVS采用GPL协议，可以自由开发。大致分为三层：<br/>&nbsp;&nbsp;&nbsp;&nbsp;1.负载调度器：对外的前端机使用IPVS（IP负载均衡）软件，采用3种IP负载均衡技术和8种负载调度算法。其中负载均衡技术如直接路由法VS／DR，可以通过改写请求的MAC地址，将请求发送到真实的服务器，这样有效地提高了集群系统的伸缩性和吞吐量。8种调度算法如加权最少链接法，动态地将请求发送到目前链接最少的真实服务器上，并通过加权来优化算法，很好地提高性能。<br/>&nbsp;&nbsp;&nbsp;&nbsp;2.服务器池：通过增加服务器池的结点数目，往往性能会成线性的增长。有效地解决了服务的伸缩性。<br/>&nbsp;&nbsp;&nbsp;&nbsp;3.共享存储：数据库或是网络文件系统，也有可能是分布式文件系统。数据库保证并发访问的一致性，静态数据可存在网络文件系统如NFS／CIFS中，如系统规模大，可以使用分布式文件系统存储。而且共享存储对于大多数情况下的读密集服务来讲可以提供大容量的cache,因此访问速度接近本地磁盘。<br/><br/>&nbsp;&nbsp;另外还有基于HTTPS的安全系统管理WEB界面，便 于系统管理员进行集群的管理和操作。<br/>4·数据库事务的四大特性是什么？请你简单举例对一个完全不懂数据库的人解释这四个特性。投数据库管理员（DBA）必答。<br/>&nbsp;&nbsp;事务的：原子性、一致性、分离性、持久性<br/>(1) 原子性<br/>　 事务的原子性指的是，事务中包含的程序作为数据库的逻辑工作单位，它所做的对数据修改操作要么全部执行，要么完全不执行。这种特性称为原子性。<br/>　 事务的原子性要求，如果妑一个事务可看作是一个程序，它要么完整的被执行，要么完全不执垳。就是说事务的操纵序列或者完全应用到数据库或者完全不影响数据库。这种特性称为原子性。<br/>假如用户在一个事务内完成了对数据库的更新，这时所有的更新对外部世界必须是可见的，或者完全没有更新。前者称事务已提交，后者称事务撤销（或流产）。DBMS必须确保由成功提交的事务完成的所洧操纵在数据库内有完全的反映，而失败的事务对数据库完全没有影响。<br/><br/>　　(2) 一致性<br/>事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束，就说该数据库是一致的。<br/>　　一致性处理数据库中对所有语义约束的保护。假如数据库的状态满足所有的完整性约束，就说该数据库是一致的。例如，当数据库处于一致性状态S1时，对数据库执行一个事务，在事务执行期间假定数据库的状态是不一致的，当事务执行结束时，数据库处在一致性状态S2。<br/><br/>　　(3) 分离性<br/>　　分离性栺并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来，不被其它企图进行修改的事务看到。<br/>分离性是DBMS针对并发事务间的冲突提供的安全保证。DBMS可以通过加锁在并发执行的事务间提供不同级别的分离。假如并发交叉执行的事务没有任何控制，操纵相同的共享对象的多个并发事务的执行可能引起异常凊况。<br/>　　DBMS可以在并发秇行的事务间提供不同级别的分离。分离的级别和并发事务的吞吐量之间存在反比关系。较多事务的可分离性可能会带来较高的冲突和较多的事务流产。流产的事务要消耗资源，这些资源必须要重新被访问。因此，确保高分离级别的DBMS需要更多的开销。<br/><br/>　　(4)持久性<br/>　　持久性意味着当系统或介质发生故障时，确保巳提交事务的更新不能丢失。即一旦一个事务提交，DBMS保证它对数据库中数据的改变应该是永久性的，耐得住任何系统故障。持久性通过数据库备份和恢复来保证。<br/>　　持久性意味着当系统戓介质发生故障时，确保已提交事务的更新芣能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交，DBMS必须保证提供适当的冗余，使其耐得住系统的故障。所以，持久性主要在于DBMS的恢复性能。<br/>5·一个微型处理器，1KB内存和1MHz（每MHz运算次数为10^6），在这样的计算机上面运行程序（程序到该终止时会自动终止，不会出现死循环）最长能运行多长时间？你可以进行任何需要的假定。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 这个题我想不明白，呵呵。有待高手指点。<br/><br/>第二部分·算法和程序设计<br/>1·int maxContinuNum(const char *inputstr,char * outputstr)<br/>编写一段程序实现该函数，实现返回一个以“&#92;0”结束的字符串中最长的数字串的长度，并把该数字子串的首地址赋给outputstr。不能使用任何库函数或已经存在的函数，如strlen。<br/>例如：在字符串“abc123abcdef12345abcdefgh123456789”中，把该字符串的首地址赋给inputstr，返回9，outputstr指向字符串“123456789”的首地址。<br/><br/><div class="code"><br/>int maxContinuNum(const char * inputstr,char * outputstr)<br/>&#123;<br/>&nbsp;&nbsp;int maxlen=0,tmplen=0,i;<br/>&nbsp;&nbsp;const char* in=inputstr;<br/>&nbsp;&nbsp;char * out=outputstr,*temp,*final;<br/>&nbsp;&nbsp;while (*in!=&#039;&#92;0&#039;)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (*in&gt;=&#039;0&#039;&amp;&amp;*in&lt;=&#039;9&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmplen=0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (temp=in;*in&gt;=&#039;0&#039;&amp;&amp;*in&lt;=&#039;9&#039;;in++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmplen++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (maxlen&lt;tmplen)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxlen=tmplen;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final=temp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;in++;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;for (i=0;i&lt;maxlen;i++)<br/>&nbsp;&nbsp;*out++=*final++;<br/>&nbsp;&nbsp;*out=&#039;&#92;0&#039;;<br/>&nbsp;&nbsp;return maxlen;<br/>&#125;<br/>#include &lt;stdio.h&gt;<br/>#include &lt;unistd.h&gt;<br/>#include &lt;stdlib.h&gt;<br/>int main(void)<br/>&#123;<br/>&nbsp;&nbsp;const char *a=&quot;abc123abcdef174395abcdefgh123456789&quot;;<br/>&nbsp;&nbsp;char b&#91;sizeof(a)&#93;;<br/>&nbsp;&nbsp;int max=maxContinuNum(a,b);<br/>&nbsp;&nbsp;printf (&quot;%d&#92;n&quot;,max);<br/>&nbsp;&nbsp;printf (&quot;%s&#92;n&quot;,b);<br/>&nbsp;&nbsp;exit (0);<br/>&#125;<br/></div><br/><br/>第三部分·备份系统设计<br/><br/>发题的人这个也记不清了，而且开放性题全靠自己平时积累的发挥了。呵呵。
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/95.htm</link>
<title><![CDATA[linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉  ]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Fri, 09 Oct 2009 04:10:23 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/95.htm</guid> 
<description>
<![CDATA[ 
	信号安装函数sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)的第二个参数是一个指向sigaction结构的指针（结构体名称与函数名一样，千万别弄混淆了）。在结构sigaction的实例中，指定了对特定信号的处理，信号所传递的信息，信号处理函数执行过程中应屏蔽掉哪些函数等。当然，此指针也可以为NULL，进程会以默认方式处理信号。以下就简单介绍一下sigaction结构以及一般的用法。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于内核头文件而言，struct sigaction 结构体定义在kernel/include/asm/signal.h,此头文件又被kernel/include/linux/signal.h包含。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于用户空间的头文件而言，struct sigaction定义在 /usr/include/bits/sigaction.h,此头文件又被/usr/include/signal.h包含，所以应用程序中如果用到此结构，只要#include <signal.h>即可。注意内核中的定义和应用程序中的定义是不一样的，内核空间的sigaction结构只支持函数类型为 __sighandler_t的信号处理函数，不能处理信号传递的额外信息。具体定义如下：<br/><br/>……<br/>/* Type of a signal handler.&nbsp;&nbsp; */<br/>typedef void (*__sighandler_t)(int);<br/><br/>……<br/>#ifdef __KERNEL__<br/>struct old_sigaction &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__sighandler_t sa_handler;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old_sigset_t sa_mask;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned long sa_flags;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void (*sa_restorer)(void);<br/>&#125;;<br/><br/>struct sigaction &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __sighandler_t sa_handler;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned long sa_flags;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void (*sa_restorer)(void);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigset_t sa_mask;&nbsp;&nbsp; /* mask last for extensibility */<br/>&#125;;<br/><br/>struct k_sigaction &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sigaction sa;<br/>&#125;;<br/><br/>#else<br/>/* Here we must cater to libcs that poke about in kernel headers.&nbsp;&nbsp; */<br/><br/>struct sigaction &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;union &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__sighandler_t _sa_handler;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void (*_sa_sigaction)(int, struct siginfo *, void *);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; _u;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigset_t sa_mask;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned long sa_flags;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void (*sa_restorer)(void);<br/>&#125;;<br/><br/>#define sa_handler&nbsp;&nbsp; _u._sa_handler<br/>#define sa_sigaction _u._sa_sigaction<br/><br/>#endif /* __KERNEL__ */<br/><br/>sa_handler的原型是一个参数为int，返回类型为void的函数指针。参数即为信号值，所以信号不能传递除信号值之外的任何信息;<br/><br/>sa_sigaction的原型是一个带三个参数，类型分别为int，struct siginfo *，void *,返回类型为void的函数指针。第一个参数为信号值;第二个参数是一个指向struct siginfo结构的指针，此结构中包含信号携带的数据值;第三个参数没有使用。<br/><br/>sa_mask指定在信号处理程序执行过程中，哪些信号应当被阻塞。默认当前信号本身被阻塞。<br/><br/>sa_flags包含了许多标志位，比较重要的一个是SA_SIGINFO，当设定了该标志位时，表示信号附带的参数可以传递到信号处理函数中。即使sa_sigaction指定信号处理函数，如果不设置SA_SIGINFO，信号处理函数同样不能得到信号传递过来的数据，在信号处理函数中对这些信息的访问都将导致段错误。<br/><br/>sa_restorer已过时，POSIX不支持它，不应再使用。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因此，当你的信号需要接收附加信息的时候，你必须给sa_sigaction赋信号处理函数指针，同时还要给sa_flags赋SA_SIGINFO,类似下面的代码：<br/>&nbsp;&nbsp;&nbsp;&nbsp; #include <signal.h><br/>&nbsp;&nbsp;&nbsp;&nbsp; ……<br/>&nbsp;&nbsp;&nbsp;&nbsp; void sig_handler_with_arg(int sig,siginfo_t *sig_info,void *unused)&#123;……&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int main(int argc,char **argv)<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sigaction sig_act;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;……<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigemptyset(&sig_act.sa_mask);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig_act.sa_sigaction=sig_handler_with_arg;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig_act.sa_flags=SA_SIGINFO;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ……<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果你的应用程序只需要接收信号，而不需要接收额外信息，那你需要的设置的是sa_handler,而不是sa_sigaction,你的程序可能类似下面的代码：<br/>&nbsp;&nbsp;&nbsp;&nbsp; #include <signal.h><br/>&nbsp;&nbsp;&nbsp;&nbsp; ……<br/>&nbsp;&nbsp;&nbsp;&nbsp; void sig_handler(int sig)&#123;……&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; int main(int argc,char **argv)<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sigaction sig_act;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;……<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sigemptyset(&sig_act.sa_mask);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig_act.sa_handler=sig_handler;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sig_act.sa_flags=0;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ……<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果需要更详细说明，请参阅sigaction的man手册。<br/><br/>补充：<br/><br/>简而言之就是:<br/><br/>//自定义退出函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigact.sa_handler = mysighandler;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigemptyset(&sigact.sa_mask);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigact.sa_flags = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigaction(SIGINT, &sigact, NULL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigaction(SIGTERM, &sigact, NULL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;sigaction(SIGQUIT, &sigact, NULL);<br/><br/><br/>或者利用signal函数进行信号捕捉：<br/><br/>void (*signal(int signo, void (*handler)(int)))(int);<br/><br/><br/>当signal到来时，程序运行某函数，函数由你自己指定。<br/><br/><br/><br/>附带各种信号定义：<br/><br/>在终端使用kill -l 命令可以显示所有的信号。<br/>$kill -l<br/>1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL<br/>5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE<br/>9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2<br/>13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT<br/>17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP<br/>21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU<br/>25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH<br/>29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN<br/>35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4<br/>39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8<br/>43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12<br/>47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14<br/>51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10<br/>55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6<br/>59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2<br/>63) SIGRTMAX-1 64) SIGRTMAX<br/><br/>其中前面31个信号为不可靠信号(非实时的，可能会出现信号的丢失)，后面的信号为可靠信号(实时的real_time,对信号<br/>排队，不会丢失)。<br/><br/>1) SIGHUP (挂起) 当运行进程的用户注销时通知该进程，使进程终止<br/><br/>2) SIGINT (中断) 当用户按下时,通知前台进程组终止进程<br/><br/>3) SIGQUIT (退出) 用户按下或时通知进程，使进程终止<br/><br/>4) SIGILL (非法指令) 执行了非法指令，如可执行文件本身出现错误、试图执行数据段、堆栈溢出<br/><br/>5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用<br/><br/>6) SIGABRT (异常中止) 调用abort函数生成的信号<br/><br/>7) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.<br/><br/>8) SIGFPE (算术异常) 发生致命算术运算错误,包括浮点运算错误、溢出及除数为0.<br/><br/>9) SIGKILL (确认杀死) 当用户通过kill -9命令向进程发送信号时，可靠的终止进程<br/><br/>10) SIGUSR1 用户使用<br/><br/>11) SIGSEGV (段越界) 当进程尝试访问不属于自己的内存空间导致内存错误时，终止进程<br/><br/>12) SIGUSR2 用户使用<br/><br/>13) SIGPIPE 写至无读进程的管道, 或者Socket通信SOCT_STREAM的读进程已经终止，而再写入。<br/><br/>14) SIGALRM (超时) alarm函数使用该信号，时钟定时器超时响应<br/><br/>15) SIGTERM (软中断) 使用不带参数的kill命令时终止进程<br/><br/>17) SIGCHLD (子进程结束) 当子进程终止时通知父进程<br/><br/>18) SIGCONT (暂停进程继续) 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞.<br/><br/>19) SIGSTOP (停止) 作业控制信号,暂停停止(stopped)进程的执行. 本信号不能被阻塞, 处理或忽略.<br/><br/>20) SIGTSTP (暂停/停止) 交互式停止信号, Ctrl-Z 发出这个信号<br/><br/>21) SIGTTIN 当后台作业要从用户终端读数据时, 终端驱动程序产生SIGTTIN信号<br/><br/>22) SIGTTOU 当后台作业要往用户终端写数据时, 终端驱动程序产生SIGTTOU信号<br/><br/>23) SIGURG 有"紧急"数据或网络上带外数据到达socket时产生.<br/><br/>24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。<br/><br/>25) SIGXFSZ 当进程企图扩大文件以至于超过文件大小资源限制。<br/><br/>26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.<br/><br/>27) SIGPROF (梗概时间超时) setitimer(2)函数设置的梗概统计间隔计时器(profiling interval timer)<br/><br/>28) SIGWINCH 窗口大小改变时发出.<br/><br/>29) SIGIO(异步I/O) 文件描述符准备就绪, 可以开始进行输入/输出操作.<br/><br/>30) SIGPWR 电源失效/重启动<br/><br/>31) SIGSYS 非法的系统调用。<br/><br/>在以上列出的信号中，<br/>程序不可捕获、阻塞或忽略的信号有：SIGKILL,SIGSTOP<br/>不能恢复至默认动作的信号有：SIGILL,SIGTRAP<br/>默认会导致进程流产的信号有：SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ<br/>默认会导致进程退出的信号有：SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM<br/>默认会导致进程停止的信号有：SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU<br/>默认进程忽略的信号有：SIGCHLD,SIGPWR,SIGURG,SIGWINCH<br/><br/>此外，SIGIO在SVR4是退出，在4.3BSD中是忽略；SIGCONT在进程挂起时是继续，否则是忽略，不能被阻塞。<br/><br/><br/>在Unix/Linux中signal函数是比较复杂的一个,其定义原型如下:<br/>void (*signal(int signo,void (*func)(int))) (int)<br/>这个函数中,最外层的函数体<br/>void (* XXX )(int)表明是一个指针,指向一个函数XXX的指针,XXX所代表的函数需要一个int型的参数,返回void<br/>signal(int signo, void(*func)(int))是signal函数的主体.<br/>需要两个参数int型的signo以及一个指向函数的函数.<br/>void (*func)(int).<br/>正是由于其复杂性,在[Plauger 1992]用typedef来对其进行简化<br/>typedef void Sigfuc(int);//这里可以看成一个返回值 .<br/>再对signal函数进行简化就是这样的了<br/>Sigfunc *signal(int,Sigfuc *);<br/> <br/>在signal.h头文件中还有以下几个定义<br/>#define SIG_ERR (void (*)())-1<br/>#define SIG_DFL (void (*)())0<br/>#define SIG_IGN (void (*)())1<br/><br/><br/>原文 章中对signal函数的解释不是很清楚，对signal函数，参看<a href="http://narmy.cn/linux/read.php/90.htm" target="_blank">http://narmy.cn/linux/read.php/90.htm</a><br/><br/>转自：<a href="http://blog.csdn.net/lanmanck/archive/2009/09/19/4568911.aspx" target="_blank">http://blog.csdn.net/lanmanck/archive/2009/09/19/4568911.aspx</a>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/94.htm</link>
<title><![CDATA[sysrq“魔术组合键”]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Fri, 09 Oct 2009 03:17:43 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/94.htm</guid> 
<description>
<![CDATA[ 
	这是一组’魔术组合键’，只要内核没有被完全锁住，不管内核在做什么事情，使用这些组合键能即时打印出内核的信息。<br/>使用sysrq组合键是了解系统目前运行情况的最佳方式。如果系统出现挂起的情况或在诊断一些和内核相关，比较怪异，比较难重现的问题的时候，使用sysrq键是个比较好的方式。<br/>怎么打开和关闭SysRq组合键?<br/>为了安全起见，在红帽企业版Linux里面，默认SysRq组合键是关闭的。 打开这个功能，运行:<br/><br/># echo 1 > /proc/sys/kernel/sysrq<br/>关闭这个功能:<br/><br/># echo 0 > /proc/sys/kernel/sysrq<br/>如果想让此功能一直生效，在/etc/sysctl.conf里面设置kernel.sysrq的值为1. 重新启动以后，此功能将会自动<br/>打开。<br/>kernel.sysrq = 1<br/>因为打开sysrq键的功能以后，有终端访问权限的用户将会拥有一些特别的功能。因此，除非是要调试，解决问题，一般情况下，不要打开此功能。如果一定要打开，请确保你的终端访问的安全性。<br/>怎么触发一个sysrq事件?<br/>有几种方式能触发sysrq事件。在带有AT键盘的一般系统上，在终端上输入一下组合键:<br/>Alt+PrintScreen+[CommandKey]<br/>例如，要让内核导出内存信息(CommandKey "m")，你应该同时按下Alt 和 Print Screen 键，然后按下 m 键.<br/>提示: 此组合键在Xwindows上是无法使用的。所以，你先要转换到文本虚拟终端下。如果你目前是在图像界面，<br/>能按Ctrl+Alt+F1转换到虚拟终端。<br/>在串口终端上,要想获得同样的效果，需要先在终端上发送Break信号，然后在5秒内输入sysrq组合键。<br/>如果你在机器上有root权限，你能把commandkey字符写入到/proc/sysrq-trigger文件。这能帮助你通过脚本或你不在系统终端上的时候触发sysrq事件。<br/><br/># echo ’m’ > /proc/sysrq-trigger<br/>当我触发一个sysrq事件的时候，接过保存在什么地方?<br/>当一个sysrq命令被触发，内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages.<br/>有时候，可能系统已无法响应，syslogd可能无法记录此信息。在这种情况下，建议你设置一个串口终端来收集这个信息。<br/>那些类型的sysrq事件能被触发?<br/>sysrq功能被打开后，有几种sysrq事件能被触发。不同的内核版本可能会有些不同。但有一些是共用的:<br/>&nbsp;&nbsp; * m - 导出关于内存分配的信息<br/>&nbsp;&nbsp; * t - 导出线程状态信息<br/>&nbsp;&nbsp; * p - 到处当前CPU寄存器信息和标志位的信息<br/>&nbsp;&nbsp; * c - 故意让系统崩溃(在使用netdump或diskdump的时候有用)<br/>&nbsp;&nbsp; * s - 即时同步所有挂载的文件系统<br/>&nbsp;&nbsp; * u - 即时重新挂载所有的文件系统为只读<br/>&nbsp;&nbsp; * b - 即时重新启动系统<br/>&nbsp;&nbsp; * o - 即时关机(如果机器设置并支持此项功能) <br/><br/><br/>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/89.htm</link>
<title><![CDATA[Unix Toolbox ]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Thu, 01 Oct 2009 07:55:32 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/89.htm</guid> 
<description>
<![CDATA[ 
	这是一份收集Unix/Linux/BSD命令和任务的文档,它有助于高级用户或IT工作。它是一份简明扼要的实用指南,<br/>当然读者应该知道他/她在干什么。<br/>Unix Toolbox 版本:12<br/>你可以到 <a href="http://cb.vu/unixtoolbox.xhtml" target="_blank">http://cb.vu/unixtoolbox.xhtml</a> 找到本文档的最新版。PDF版本可以替换链接中的.xhtml为 .pdf<br/>,小册子版本可以替换成 .book.pdf 。 用双面打印机可将小册子打印成册。<br/>错误报告和评论是最欢迎的 - c@cb.vu Colin Barschel.<br/>你可以到<a href="http://code.google.com/p/unixtoolboxcn/" target="_blank">http://code.google.com/p/unixtoolboxcn/</a>找到中文最新版。<br/>关于中文版的任何错误和修正请发送E-Mail到 &quot;Greco Shi&quot; &lt;greco.open@gmail.com&gt;<br/>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/88.htm</link>
<title><![CDATA[linux集群]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Tue, 29 Sep 2009 02:47:47 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/88.htm</guid> 
<description>
<![CDATA[ 
	<a name="firstmajorhead">什么是集群?</a></td></tr></tbody></table><br/><p>简单的说，集群（cluster）就是一组计算机，它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点（node）。一个理想的集群是，用户从来不会意识到集群系统底层的节点，在他/她们看来，集群是一个系统，而非多个计算机系统。并且集群系统的管理员可以随意增加和删改集群系统的节点。<br/><br/></p><br/><br/><p>集群并不是一个全新的概念，其实早在七十年代计算机厂商和研究机构就开始了对集群系统的研究和开发。由于主要用于科学工程计算，所以这些系统并不为大家所熟知。直到Linux集群的出现，集群的概念才得以广为传播。集群系统主要分为高可用(High Availability)集群,简称 HA 集群，和高性能计算(High Perfermance Computing)集群，简称 HPC 集群。</p><br/><br/><p>通过下面这篇文章我们可以方方面面了解 Linux 集群涉及的硬件和软件。</p><br/><br/><br/><ul><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/lw-clustering.html">Linux 集群大全 -- 哪种群集适合您？</a></li><br/><br/><br/><br/></ul><br/><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="secondmajorhead">集群分类</a></td></tr></tbody></table><br/><br/><p>一般我们把集群系统分为两类：</p><br/><ul><br/>&nbsp;&nbsp;<li>高可用(High Availability)集群,简称HA集群。这类集群致力于提供高度可靠的服务。</li><br/>&nbsp;&nbsp;&nbsp;&nbsp;<li>高性能计算(High Perfermance Computing)集群，简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。<br/><br/></li><br/></ul><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="thirdmajorhead">基于 Linux 的集群</a></td></tr></tbody></table><br/><p>在 Linux 出现前，集群系统采用的操作系统主要有 VMS、UNIX 和 WindowsNT。到九十年代末期，Linux 操作系统不断走向成熟，它的健壮性不断增强，并且提供了 GNU 软件和标准化的 PVM、MPI 消息传递机制，最重要的是 Linux 在普通 PC 机上提供了对高性能网络的支持，这样就大大推动了基于 Linux 的集群系统的普及和发展。</p><br/><br/><ul><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part1/">基于 linux 的集群系统，第 1 部分：集群系统概述</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part2/index.html">基于 linux 的集群系统，第 2 部分：典型集群系统介绍之一&nbsp;&nbsp;</a> </li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part3/index.html">基于 linux 的集群系统，第 3 部分：典型集群系统介绍之二</a><br/></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part4/index.html">基于 linux 的集群系统，第 4 部分：典型系统小结及评测标准</a><br/></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part5/index.html">基于 linux 的集群系统，第 5 部分：关键技术分析之 进程的放置和迁移</a><br/></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part6/index.html">基于 linux 的集群系统，第 6 部分：关键技术分析之 高可用性</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part7/index.html">基于 linux 的集群系统，第 7 部分：关键技术分析之文件系统</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part8/index.html">基于 linux 的集群系统，第 8 部分：实现过程之理论先导篇(1)</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part9/index.html">基于 linux 的集群系统，第 9 部分：实现过程之理论先导篇(2)</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part10/index.html">基于 linux 的集群系统，第 10 部分：实现过程之理论先导篇(3)</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part11/index1.html">基于 linux 的集群系统，第 11 部分：Linux集群系统的实现（上）</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/linux_cluster/part11/index2.html">基于 linux 的集群系统，第 12 部分：Linux集群系统的实现（下）</a></li><br/><br/></ul><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="fourthmajorhead">Linux 服务器集群系统</a></td></tr></tbody></table><br/><p>Linux Virtual Server 项目针对高可伸缩、高可用网络服务的需求，给出了基于 IP 层和基于内容请求分发的负载平衡调度解决方法，并在 Linux 内核中实现了这些方法，将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器。</p><br/><br/><p>我们可以通过 Linux 集群项目－－LVS(Linux Virtual Server) 的创始人和主要开发人员章文嵩博士来了解这一集群系统。</p><br/><br/><br/><ul><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/lvs/part1/index.html">Linux 服务器集群系统，第 1 部分：<br/>LVS 项目介绍</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/lvs/part2/index.html">Linux 服务器集群系统，第 2 部分：<br/>LVS 集群的体系结构</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/lvs/part3/index.html">Linux 服务器集群系统，第 3 部分：<br/>LVS 集群中的IP负载均衡技术</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/lvs/part4/index.html">Linux 服务器集群系统，第 4 部分：<br/>LVS 集群的负载调度</a></li><br/><br/><br/></ul><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="fifthmajorhead">Linux 高性能计算集群</a></td></tr></tbody></table><br/><p>高性能计算(High-Performance Computing)是计算机科学的一个分支，它致力于开发超级计算机，研究并行算法和开发相关软件。高性能计算主要研究如下两类问题：1)&nbsp;&nbsp; 大规模科学问题，象天气预报、地形分析和生物制药等； 2) 存储和处理海量数据，象数据挖掘、图象处理和基因测序；<br/><br/></p><br/><br/><p>当论及 Linux 高性能集群时，许多人的第一反映就是 Beowulf。起初，Beowulf 只是一个著名的科学计算集群系统。以后的很多集群都采用 Beowulf 类似的架构，所以，实际上，现在 Beowulf 已经成为一类广为接受的高性能集群的类型。下面这系列文章就是围绕 Beowulf 展开的讨论。</p><br/><br/><ul><br/><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/hpc/part1/index.html">Linux 高性能计算集群，第 1 部分：概述</a></li> <br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/hpc/part2/index.html">Linux 高性能计算集群，第 2 部分：Beowulf 集群</a></li> <br/><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/hpc/part3/index.html">Linux 高性能计算集群，第 3 部分：硬件和网络体系结构</a></li> <br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/hpc/part4/index.html">Linux 高性能计算集群，第 4 部分：软件体系结构</a></li> <br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/hpc/part5/index.html">Linux 高性能计算集群，第 5 部分：资源管理和系统管理</a></li> <br/><br/><br/><br/></ul><br/><br/><p>IBM 研发的 Linux 集群 Cluster1350 是定位于高性能计算的一套解决方案，集成了众多 IBM 与非 IBM 的先进的软硬件技术，有其特有的技术优势与强大的服务支持。</p><br/><ul><br/>&nbsp;&nbsp;<li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/l-ibm1350/index.html">IBM Cluster 1350 与 CSM</a></li><br/></ul><br/><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="sixthmajorhead">集群系统 MOSIX</a></td></tr></tbody></table><br/><p>MOSIX 是由 Jerusalem 的 Hebrew 大学开发的，它是一个软件管理层, 为 Linux 内核扩充了高性能集群计算支持能力。它采用单一系统映像模式 SSI(Single System Image)，支持所有的UNIX接口和机制，它最大特点是易使用性和透明性。</p><br/><br/><ul><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part1/index.html">集群系统 MOSIX 分析，第 1 部分：<br/>集群技术和进程迁移简介</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part2/index.html">集群系统 MOSIX 分析，第 2 部分：<br/>MOSIX 系统简介</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part3/index.html">集群系统 MOSIX 分析，第 3 部分：<br/>MOSIX 代理远程机制</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part4/index.html">集群系统 MOSIX 分析，第 4 部分：<br/>MOSIX 连接层</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part5/index.html">集群系统 MOSIX 分析，第 5 部分：<br/>MOSIX 进程迁移机制</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part6/index.html">集群系统 MOSIX 分析，第 6 部分：<br/>MOSIX 对系统调用的处理</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/mosix/part7/index.html">集群系统 MOSIX 分析，第 7 部分：<br/>MOSIX 对信号机制的处理</a></li><br/><br/></ul><br/><br/><p>MOSIX 是一种特殊的透明形式的集群，它很容易建立并且只需投入最少的时间和精力就可产生积极结果。下面这篇教程可以指导您建立自己的 MOSIX 群集。</p><br/><br/><ul><br/><br/><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/views/linux/tutorials.jsp?cv_doc_id=84921">使用 Mosix 的 Linux 集群</a> </li><br/><br/><br/></ul><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="seventhmajorhead">构建 Linux 集群</a></td></tr></tbody></table><br/><br/><p>如何搭建自己的 Linux 集群呢？ 这可能是大多数读者非常希望知道的。“安装大型 Linux 集群”系列文章介绍了如何构建基于 IBM® System x®(TM)和 IBM® TotalStorage® systems 的 Linux® 集群。</p><br/><br/><br/><br/><ul><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/es-linuxclusterintro/index.html">安装大型 Linux 集群，第 1 部分： 简介和硬件配置</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/es-clusterseriespt2/index.html">安装大型 Linux 集群，第 2 部分： 配置管理服务器和安装节点</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/es-clusterseriespt3/index.html">安装大型 Linux 集群，第 3 部分： 存储和共享文件系统</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/es-clusterseriespt4/index.html">安装大型 Linux 集群，第 4 部分： 节点安装和 GPFS 集群配置<br/></a></li><br/></ul><br/><br/><br/><p>此外，我们可以选择许多开源软件来构建自己的集群系统。</p><br/><ul><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/l-clustknop.html">使用 ClusterKnoppix 构建负载平衡集群</a></li><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/l-colinux/">使用 coLinux 和 openMosix 构建异构集群</a></li><br/><li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/">Linux 上的集群及其配置实例</a></li><br/></ul><br/><ul><br/><br/><li><a href="http://www.ibm.com/developerworks/cn/views/linux/tutorials.jsp?cv_doc_id=84921">使用 Mosix 的 Linux 集群</a> </li><br/><br/><br/></ul><br/><br/><br/><br/><table align="right" cellpadding="0" cellspacing="0"><tbody><tr align="right"><td><img src="//www.ibm.com/i/c.gif" alt="" height="8" width="100%"><br/><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><img src="//www.ibm.com/i/v14/icons/u_bold.gif" alt="" height="16" width="16" border="0"><br/></td><td valign="top" align="right"><a href="#main" class="fbox"><b>回页首</b></a></td></tr></tbody></table></td></tr></tbody></table><br/><br/><!--Spacer--><br/><table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="v14-header-3"><a name="eighththmajorhead">IBM 与 Linux 集群</a></td></tr></tbody></table><br/><ul>&nbsp;&nbsp;<br/><li><a href="http://www.ibm.com/developerworks/cn/linux/l-pow-opcluster/">IBM eServer OpenPower 710 集群入门介绍</a> </li><br/><br/></ul><br/><ul><br/>&nbsp;&nbsp;<li><a href="http://www.ibm.com/developerworks/cn/linux/cluster/l-ibm1350/index.html">IBM Cluster 1350 与 CSM</a>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/87.htm</link>
<title><![CDATA[awk,sed,shell编程以及vi,emacs的学习]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Tue, 29 Sep 2009 02:43:51 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/87.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: courier new;">IBM的 工程师这些文章写得太牛了，我真想全部copy过来。又有些懒，直接整个链接得了。哈哈。<br/><br/>awk的精华文章：<br/><br/><br/>&nbsp;&nbsp;<br/><br/><br/><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/" target="_blank">Awk 实例，第 1 部分 -- 一种名称很奇特的优秀语言介绍</a><br/><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/" target="_blank">Awk 实例，第 2 部分 -- 记录、循环和数组</a><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-3/" target="_blank">Awk 实例，第 3 部分 -- 字符串函数和……支票簿？</a><br/><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/binary/" target="_blank">巧用 AWK 处理二进制数据文件</a><br/><br/>sed精华篇：<br/><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-1/" target="_blank">sed 实例，第 1 部分</a><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-2/" target="_blank">sed 实例，第 2 部分</a><br/><a href="http://www.ibm.com/developerworks/cn/linux/shell/sed/sed-3/" target="_blank">sed 实例，第 3 部分</a><br/><br/>vi & emacs精华篇：<br/><a href="http://www.ibm.com/developerworks/cn/views/linux/tutorials.jsp?cv_doc_id=84955" target="_blank">vi 入门 -- 巧表单方法</a><br/><br/><a href="http://www.ibm.com/developerworks/cn/views/linux/tutorials.jsp?cv_doc_id=84932" target="_blank">生活在 Emacs 中</a><br/><br/><a href="http://www.ibm.com/developerworks/cn/edu/au-dw-au-emacs7-i.html" target="_blank">Emacs 编辑环境，第 7 部分: 让 Emacs 帮助您走出困境</a><br/><br/><br/>bash技巧精华篇：<br/><br/><br/><a href="http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/l-tiptex1/" target="_blank">技巧: 了解文本实用程序</a><br/><a href="http://www.ibm.com/developerworks/cn/views/linux/tutorials.jsp?cv_doc_id=85109" target="_blank">使用 GNU 文本实用程序</a><br/><a href="http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/l-tiptex6/" target="_blank">技巧: 用 uniq 除去重复行</a><br/><a href="http://www.ibm.com/developerworks/cn/linux/l-murray/" target="_blank">开发人员的笔记 -- 分享经验丰富的 Linux 程序员 Spence Murray 的开发技巧</a><br/><a href="http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/l-tiptex5/" target="_blank">技巧: 用 tr 过滤文件</a><br/><br/><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/index.html" target="_blank">Shell 脚本调试技术</a><br/><a href="http://dwgateway/developerworks/cn/linux/shell/bash/bashfv/index.html" target="_blank">使用 Bash shell 脚本进行功能测试</a></span>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/86.htm</link>
<title><![CDATA[一个探究参数处理差别的函数]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Tue, 29 Sep 2009 01:26:57 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/86.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: Courier New;"><div class="code"><br/>#!/bin/bash<br/>#filename testarg.sh<br/>testfunc2()<br/>&#123;<br/>&nbsp;&nbsp;echo &quot;$# parameters&quot;<br/>&nbsp;&nbsp;echo Using &#039;$*&#039;<br/>&nbsp;&nbsp;for p in $*<br/>&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&#91;$p&#93;&quot;<br/>&nbsp;&nbsp;done<br/>&nbsp;&nbsp;echo Using &#039;&quot;$*&quot;&#039;<br/>&nbsp;&nbsp;for p in &quot;$*&quot;<br/>&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&#91;$p&#93;&quot;<br/>&nbsp;&nbsp;done<br/>&nbsp;&nbsp;echo Using &#039;$@&#039;<br/>&nbsp;&nbsp;for p in &quot;$@&quot;<br/>&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&#91;$p&#93;&quot;<br/>&nbsp;&nbsp;done<br/>&nbsp;&nbsp;echo Using &#039;&quot;$@&quot;&#039;<br/>&nbsp;&nbsp;for p in &quot;$@&quot;<br/>&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;&#91;$p&#93;&quot;<br/>&nbsp;&nbsp;done<br/>&#125;<br/></div><br/><div class="code"><br/><br/>&#91;lengyuex@Tux testlab&#93;$ source testarg.sh <br/>&#91;lengyuex@Tux testlab&#93;$ IFS=&quot;&#124;$&#123;IFS&#125;&quot; testfunc2 abc &quot;a bc&quot; &quot;1 2<br/>3&quot;<br/>3 parameters<br/>Using $*<br/>&#91;abc&#93;<br/>&#91;a&#93;<br/>&#91;bc&#93;<br/>&#91;1&#93;<br/>&#91;2&#93;<br/>&#91;3&#93;<br/>Using &quot;$*&quot;<br/>&#91;abc&#124;a bc&#124;1 2<br/>3&#93;<br/>Using $@<br/>&#91;abc&#93;<br/>&#91;a bc&#93;<br/>&#91;1 2<br/>3&#93;<br/>Using &quot;$@&quot;<br/>&#91;abc&#93;<br/>&#91;a bc&#93;<br/>&#91;1 2<br/>3&#93;<br/></div><br/><br/>IFS 默认变量使用一个空格作为它的第一个字符，因此上面添加了一条竖线作为 IFS 变量的第一个字符，更加清楚地显示了在 “$*” 扩展中的何处使用这个字符。<br/>注意加引号的形式和包含空白（如空格字符和换行符）的参数。在一个 [] 字符对中，“$*” 扩展实际上是一个词。<br/><br/><br/>0, 1, 2, ...&nbsp;&nbsp;位置参数从参数 0 开始。参数 0 引用启动 bash 的程序的名称，如果函数在 shell 脚本中运行，则引用 shell 脚本的名称。有关该参数的其他信息，比如 bash 由 -c 参数启动，请参阅 bash 手册页面。由单引号或双引号包围的字符串被作为一个参数进行传递，传递时会去掉引号。如果是双引号，则在调用函数之前将对 $HOME 之类的 shell 变量进行扩展。对于包含嵌入空白或其他字符（这些空白或字符可能对 shell 有特殊意义）的参数，需要使用单引号或双引号进行传递。<br/>*&nbsp;&nbsp;位置参数从参数 1 开始。如果在双引号中进行扩展，则扩展就是一个词，由 IFS 特殊变量的第一个字符将参数分开，如果 IFS 为空，则没有间隔空格。IFS 的默认值是空白、制表符和换行符。如果没有设置 IFS，则使用空白作为分隔符（仅对默认 IFS 而言）。<br/>@&nbsp;&nbsp;位置参数从参数 1 开始。如果在双引号中进行扩展，则每个参数都会成为一个词，因此 “$@” 与 “$1” “$2” 等效。如果参数有可能包含嵌入空白，那么您将需要使用这种形式。<br/>#&nbsp;&nbsp;参数数量（不包含参数 0）。<br/><br/><br/><br/><br/>参数的精华之作：<a href="http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html" target="_blank">http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html</a><br/></span>
]]>
</description>
</item>
<item>
<link>http://narmy.cn/linux/read.php/84.htm</link>
<title><![CDATA[fedora 11 下分析系统性能瓶颈之(四)oprofile]]></title> 
<author>lengyuex &lt;lengyuex@gmail.com&gt;</author>
<category><![CDATA[linux experience]]></category>
<pubDate>Wed, 23 Sep 2009 12:35:14 +0000</pubDate> 
<guid>http://narmy.cn/linux/read.php/84.htm</guid> 
<description>
<![CDATA[ 
	<span style="font-family: Courier New;">oprofile 是 Linux 平台上，类似 INTEL VTune 的一个功能强大的性能分析工具。<br/><br/>其支持两种采样(sampling)方式：基于事件的采样(event based)和基于时间的采样(time based)。<br/>基于事件的采样是oprofile只记录特定事件（比如L2 cache miss）的发生次数，当达到用户设定的定值时oprofile 就记录一下（采一个样）。这种方式需要CPU 内部有性能计数器(performace counter)。现代CPU内部一般都有性能计数器，龙芯2E内部亦内置了2个性能计数器。<br/><br/>基于时间的采样是oprofile 借助OS 时钟中断的机制，每个时钟中断 oprofile 都会记录一次(采一次样）。引入的目的在于，提供对没有性能计数器 CPU 的支持。其精度相对于基于事件的采样要低。因为要借助 OS时钟中断的支持，对禁用中断的代码oprofile不能对其进行分析。<br/><br/>oprofile 在Linux 上分两部分，一个是内核模块(oprofile.ko)，一个为用户空间的守护进程(oprofiled)。前者负责访问性能计数器或者注册基于时间采样的函数(使用register_timer_hook注册之，使时钟中断处理程序最后执行profile_tick 时可以访问之)，并采样置于内核的缓冲区内。后者在后台运行，负责从内核空间收集数据，写入文件。<br/><br/>安装：<br/><div class="code"><br/>&#91;root@Tux ~&#93;# yum list &amp;#124;grep oprofile<br/>eclipse-oprofile.i586&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.2.0-2.fc11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @updates&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>oprofile.i586&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.9.4-12.fc11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@updates&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>oprofile-devel.i586&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.9.4-12.fc11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@updates&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>oprofile-gui.i586&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.9.4-12.fc11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@updates&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>oprofile-jit.i586&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.9.4-12.fc11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@updates&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>oprofileui.i586&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.2.0-3.fc11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @fedora&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&#91;root@Tux ~&#93;# yum -y install oprofile*<br/></div><br/>初始化：<br/>opcontrol --init<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;该命令会加载oprofile.ko模块，mount oprofilefs。成功后会在/dev/oprofile/目录下导出一些文件和目录如： cpu_type, dump, enable, pointer_size, stats/<br/><div class="code"><br/>&#91;root@Tux ~&#93;# opcontrol --init<br/>&#91;root@Tux ~&#93;# ls -F /dev/oprofile/<br/>0/&nbsp;&nbsp;1/&nbsp;&nbsp;backtrace_depth&nbsp;&nbsp;buffer&nbsp;&nbsp;buffer_size&nbsp;&nbsp;buffer_watershed&nbsp;&nbsp;cpu_buffer_size&nbsp;&nbsp;cpu_type&nbsp;&nbsp;dump&nbsp;&nbsp;enable&nbsp;&nbsp;pointer_size&nbsp;&nbsp;stats/<br/></div><br/>配置：<br/>主要设置计数事件和样本计数，以及计数的CPU模式（用户态、核心态）<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;opcontrol --setup --event=EVENT:1000::0:1<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;则是设置计数事件为EVENT，即对处理器时钟周期进行计数<br/>&nbsp;&nbsp;&nbsp;&nbsp;样本计数为1000，即每1000个时钟周期，oprofile 取样一次。<br/>&nbsp;&nbsp;&nbsp;&nbsp;处理器运行于核心态则不计数<br/>&nbsp;&nbsp;&nbsp;&nbsp;运行于用户态则计数<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;--event=name:count:unitmask:kernel:user<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;&nbsp; event name, 这里event name可以通过#opcontrol --list-events查看。<br/>&nbsp;&nbsp;&nbsp;&nbsp;count:&nbsp;&nbsp; reset counter value e.g. 100000<br/>&nbsp;&nbsp;&nbsp;&nbsp;unitmask: hardware unit mask e.g. 0x0f<br/>&nbsp;&nbsp;&nbsp;&nbsp;kernel:&nbsp;&nbsp; whether to profile kernel: 0 or 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;user:&nbsp;&nbsp; whether to profile userspace: 0 or 1<br/><br/>启动<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;opcontrol --start<br/>取出数据<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;opcontrol --dump<br/>&nbsp;&nbsp;&nbsp;&nbsp;opcontrol --stop<br/>分析结果<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;opreport -l ./binary_file<br/><br/><br/><br/>要想看到例子，请看IBM牛人的文章：<a href="http://www.ibm.com/developerworks/cn/linux/l-pow-oprofile/" target="_blank">http://www.ibm.com/developerworks/cn/linux/l-pow-oprofile/</a></span>
]]>
</description>
</item>
</channel>
</rss>