﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-依睛(IT blog) 我回来了，PHP&lt;--&gt;C/C++ LINUX-随笔分类-???问的睛</title><link>http://www.cnitblog.com/guopingleee/category/5889.html</link><description>笨鸟
</description><language>zh-cn</language><lastBuildDate>Sun, 02 Oct 2011 08:17:20 GMT</lastBuildDate><pubDate>Sun, 02 Oct 2011 08:17:20 GMT</pubDate><ttl>60</ttl><item><title>常用正则表达式</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/21/32135.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Tue, 21 Aug 2007 01:35:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/21/32135.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/32135.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/21/32135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/32135.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/32135.html</trackback:ping><description><![CDATA[
		<h3 class="title" id="startcontent">正则表达式学习笔记</h3>
		<p>　　正则表达式(regular expression)描述了一种字符串匹配的模式，可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。<br />　　列目录时，　dir *.txt或ls *.txt中的*.txt就</p>
		<ins>不</ins>是一个正则表达式,因为这里*与正则式的*的含义是不同的。<a name="more"></a><p>　<br />(一部分)<br /><br />　为便于理解和记忆，先从一些概念入手，所有特殊字符或字符组合有一个总表在后面，最后一些例子供理解相应的概念。</p><p></p><h3>正则表达式</h3><br />　　是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。<br />　　可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式，即/expression/ 
<p></p><p></p><h3>普通字符</h3><br />　　由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 <br /><h3>非打印字符</h3><br /><table border="1"><tbody><tr><td>字符 </td><td>含义</td></tr><tr><td>\cx </td><td>匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</td></tr><tr><td>\f </td><td>匹配一个换页符。等价于 \x0c 和 \cL。</td></tr><tr><td>\n </td><td>匹配一个换行符。等价于 \x0a 和 \cJ。</td></tr><tr><td>\r </td><td>匹配一个回车符。等价于 \x0d 和 \cM。</td></tr><tr><td>\s </td><td>匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td></tr><tr><td>\S </td><td>匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td></tr><tr><td>\t </td><td>匹配一个制表符。等价于 \x09 和 \cI。</td></tr><tr><td>\v </td><td>匹配一个垂直制表符。等价于 \x0b 和 \cK。</td></tr></tbody></table><br /><h3>特殊字符</h3><br />　　所谓特殊字符，就是一些有特殊含义的字符，如上面说的"*.txt"中的*，简单的说就是表示任何字符串的意思。如果要查找文件名中有＊的文件，则需要对＊进行转义，即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。<br /><table border="1"><tbody><tr><td>特别字符</td><td>说明</td></tr><tr><td>$</td><td>匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。</td></tr><tr><td>( )</td><td>标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。</td></tr><tr><td>*</td><td>匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。</td></tr><tr><td>+</td><td>匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。</td></tr><tr><td>.</td><td>匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。</td></tr><tr><td>[ </td><td>标记一个中括号表达式的开始。要匹配 [，请使用 \[。</td></tr><tr><td>?</td><td>匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。</td></tr><tr><td>\</td><td>将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。</td></tr><tr><td>^</td><td>匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 \^。</td></tr><tr><td>{</td><td>标记限定符表达式的开始。要匹配 {，请使用 \{。</td></tr><tr><td>|</td><td>指明两项之间的一个选择。要匹配 |，请使用 \|。</td></tr></tbody></table><p></p><p><br /><strong>　　构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。</strong></p><p><br /></p><h3>限定符</h3><br />　　限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。<br />*、+和?限定符都是贪婪的，因为它们会尽可能多的匹配文字，只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。<br />　　正则表达式的限定符有：<br /><table border="1"><tbody><tr><td>字符 </td><td>描述</td></tr><tr><td>* </td><td>匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</td></tr><tr><td>+ </td><td>匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</td></tr><tr><td>? </td><td>匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</td></tr><tr><td>{n} </td><td>n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</td></tr><tr><td>{n,} </td><td>n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</td></tr><tr><td>{n,m} </td><td>m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</td></tr></tbody></table><p></p><p></p><h3>定位符</h3><br />　　用来描述字符串或单词的边界，^和$分别指字符串的开始与结束，\b描述单词的前或后边界，\B表示非单词边界。<ins>不能对定位符使用限定符。</ins><p></p><p></p><h3>选择</h3><br />　　用圆括号将所有选择项括起来，相邻的选择项之间用|分隔。但用圆括号会有一个副作用，是相关的匹配会被缓存，此时可用?:放在第一个选项前来消除这种副作用。<br />　　其中?:是非捕获元之一，还有两个非捕获元是?=和?!，这两个还有更多的含义，前者为正向预查，在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串，后者为负向预查，在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 
<p></p><p></p><h3>后向引用</h3><br />　　对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中，所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始，连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问，其中 n 为一个标识特定缓冲区的一位或两位十进制数。<br />　　可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。 
<p></p><p></p><h3>各种操作符的运算优先级</h3><br />　　相同优先级的从左到右进行运算，不同优先级的运算先高后低。各种操作符的优先级从高到低如下：<br /><table border="1"><tbody><tr><td>操作符 </td><td>描述</td></tr><tr><td>\ </td><td>转义符</td></tr><tr><td>(), (?:), (?=), [] </td><td>圆括号和方括号</td></tr><tr><td>*, +, ?, {n}, {n,}, {n,m} </td><td>限定符</td></tr><tr><td>^, $, \anymetacharacter </td><td>位置和顺序</td></tr><tr><td>| </td><td>“或”操作</td></tr></tbody></table><p></p><p></p><h3>全部符号解释</h3><br /><table border="1"><tbody><tr><td>字符 </td><td>描述</td></tr><tr><td>\ </td><td>将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。</td></tr><tr><td>^ </td><td>匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。</td></tr><tr><td>$ </td><td>匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。</td></tr><tr><td>* </td><td>匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。</td></tr><tr><td>+ </td><td>匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。</td></tr><tr><td>? </td><td>匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。</td></tr><tr><td>{n} </td><td>n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。</td></tr><tr><td>{n,} </td><td>n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</td></tr><tr><td>{n,m} </td><td>m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</td></tr><tr><td>? </td><td>当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。</td></tr><tr><td>. </td><td>匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。</td></tr><tr><td>(pattern) </td><td>匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。</td></tr><tr><td>(?:pattern) </td><td>匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。</td></tr><tr><td>(?=pattern) </td><td>正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td></tr><tr><td>(?!pattern) </td><td>负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始</td></tr><tr><td>x|y </td><td>匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。</td></tr><tr><td>[xyz] </td><td>字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。</td></tr><tr><td>[^xyz] </td><td>负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。</td></tr><tr><td>[a-z] </td><td>字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。</td></tr><tr><td>[^a-z] </td><td>负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。</td></tr><tr><td>\b </td><td>匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。</td></tr><tr><td>\B </td><td>匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。</td></tr><tr><td>\cx </td><td>匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。</td></tr><tr><td>\d </td><td>匹配一个数字字符。等价于 [0-9]。</td></tr><tr><td>\D </td><td>匹配一个非数字字符。等价于 [^0-9]。</td></tr><tr><td>\f </td><td>匹配一个换页符。等价于 \x0c 和 \cL。</td></tr><tr><td>\n </td><td>匹配一个换行符。等价于 \x0a 和 \cJ。</td></tr><tr><td>\r </td><td>匹配一个回车符。等价于 \x0d 和 \cM。</td></tr><tr><td>\s </td><td>匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td></tr><tr><td>\S </td><td>匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td></tr><tr><td>\t </td><td>匹配一个制表符。等价于 \x09 和 \cI。</td></tr><tr><td>\v </td><td>匹配一个垂直制表符。等价于 \x0b 和 \cK。</td></tr><tr><td>\w </td><td>匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。</td></tr><tr><td>\W </td><td>匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。</td></tr><tr><td>\xn </td><td>匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。.</td></tr><tr><td>\num </td><td>匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。</td></tr><tr><td>\n </td><td>标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。</td></tr><tr><td>\nm </td><td>标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。</td></tr><tr><td>\nml </td><td>如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。</td></tr><tr><td>\un </td><td>匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</td></tr></tbody></table><p></p><p></p><h3>部分例子</h3><br /><table border="1"><tbody><tr><td>正则表达式</td><td>说明</td></tr><tr><td>/\b([a-z]+) \1\b/gi</td><td>一个单词连续出现的位置</td></tr><tr><td>/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ </td><td>将一个URL解析为协议、域、端口及相对路径</td></tr><tr><td>/^(?:Chapter|Section) [1-9][0-9]{0,1}$/</td><td>定位章节的位置</td></tr><tr><td>/[-a-z]/</td><td>A至z共26个字母再加一个-号。</td></tr><tr><td>/ter\b/</td><td>可匹配chapter，而不能terminal</td></tr><tr><td>/\Bapt/</td><td>可匹配chapter，而不能aptitude</td></tr><tr><td>/Windows(?=95 |98 |NT )/</td><td>可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后，从Windows后面开始进行下一次的检索匹配。</td></tr></tbody></table><br /><br /><br /><br />===============================================================================<br /><br /><br /><br /><br />(二部分)<br /><br />正则表达式用于字符串处理、表单验证等场合，实用高效。现将一些常用的表达式收集于此，以备不时之需。<br /><p>匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />评注：匹配中文还真是个头疼的事，有了这个表达式就好办了</p><p>匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</p><p>匹配空白行的正则表达式：\n\s*\r<br />评注：可以用来删除空白行</p><p>匹配HTML标记的正则表达式：&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/\1&gt;|&lt;.*? /&gt;<br />评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力</p><p>匹配首尾空白字符的正则表达式：^\s*|\s*$<br />评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式</p><p>匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />评注：表单验证时很实用</p><p>匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*<br />评注：网上流传的版本功能很有限，上面这个基本可以满足需求</p><p>匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />评注：表单验证时很实用</p><p>匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}<br />评注：匹配形式如 0511-4405222 或 021-87888822</p><p>匹配腾讯QQ号：[1-9][0-9]{4,}<br />评注：腾讯QQ号从10000开始</p><p>匹配中国邮政编码：[1-9]\d{5}(?!\d)<br />评注：中国邮政编码为6位数字</p><p>匹配身份证：\d{15}|\d{18}<br />评注：中国的身份证为15位或18位</p><p>匹配ip地址：\d+\.\d+\.\d+\.\d+<br />评注：提取ip地址时有用</p><p>匹配特定数字：<br />^[1-9]\d*$　 　 //匹配正整数<br />^-[1-9]\d*$ 　 //匹配负整数<br />^-?[1-9]\d*$　　 //匹配整数<br />^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）<br />^-[1-9]\d*|0$　　 //匹配非正整数（负整数 + 0）<br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　 //匹配正浮点数<br />^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数<br />^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数<br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）<br />^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数 + 0）<br />评注：处理大量数据时有用，具体应用时注意修正</p><p>匹配特定字符串：<br />^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br />^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br />^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br />^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br />^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串<br />评注：最基本也是最常用的一些表达式<br /><br />========================================================================<br /><br /><br /><br /><br /><br />(三部分)<br /><br /><strong>　javascript常用的匹配正则表达式和实例 <br /><br /><br /></strong>匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br /><br />匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br /><br />应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br /><br />String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}<br /><br />匹配空行的正则表达式：\n[\s| ]*\r<br /><br />匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ <br /><br />匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br /><br />应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：<br /><br />String.prototype.trim = function()<br />{<br />return this.replace(/(^\s*)|(\s*$)/g, "");<br />}<br /><br />利用正则表达式分解和转换IP地址：<br /><br />下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：<br /><br />function IP2V(ip)<br />{<br />re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br />throw new Error("Not a valid IP address!")<br />}<br />}<br /><br />不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：<br /><br />var ip="10.100.20.168"<br />ip=ip.split(".")<br />alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<br /><br />匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br /><br />匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?<br /><br />利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复]<br /><br />var s="abacabefgeeii"<br />var s1=s.replace(/(.).*\1/g,"$1")<br />var re=new RegExp("["+s1+"]","g")<br />var s2=s.replace(re,"") <br />alert(s1+s2) //结果为：abcefgi<br /><br />我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。<br /><br />得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1<br /><br />s="http://www.9499.net/page1.htm"<br />s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<br />alert(s)<br /><br />利用正则表达式限制网页表单里的文本框输入内容：<br /><br />用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"<br /><br />用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"<br /><br />用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"<br /><br />用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <br /></p><img src ="http://www.cnitblog.com/guopingleee/aggbug/32135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-21 09:35 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/21/32135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常去的网址 </title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/18/32046.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Sat, 18 Aug 2007 08:56:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/18/32046.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/32046.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/18/32046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/32046.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/32046.html</trackback:ping><description><![CDATA[专业电子书记籍下载:<br /><a href="http://www.netyi.net/in.asp?id=oosky"><font color="#1d58d1">http://www.netyi.net/in.asp?id=oosky</font></a> 书籍很多，但要你自己细细的寻找哦。<br /><a href="http://www.infoxa.com/"><font color="#1d58d1">http://www.infoxa.com/</font></a> 这个网站不错，推荐。很多经典的图书都能找到。<br /><a href="http://www.itebook.net/"><font color="#1d58d1">http://www.itebook.net/</font></a> <br /><a href="http://www.itepub.net/"><font color="#1d58d1">http://www.itepub.net/</font></a> 这个站应该很多人都知道的。<br /><br />Linux免费下载：<br /><a href="http://www.linuxeden.com/forum/t132533.html"><font color="#1d58d1">http://www.linuxeden.com/forum/t132533.html</font></a> <font size="2">Mandriva Linux 2006 的光盘镜像<br /></font><a href="http://public.planetmirror.com/pub/"><font color="#1d58d1">http://public.planetmirror.com/pub/</font></a> <br /><a href="http://www.linuxeden.com/download/1214.html"><font color="#1d58d1">http://www.linuxeden.com/download/1214.html</font></a> fedora core linux<br /><a href="http://fedora.redhat.com/download/mirrors.html#ASIA"><font color="#1d58d1">http://fedora.redhat.com/download/mirrors.html#ASIA</font></a>  fedora core linux官方网<br /><a href="http://ftp.osuosl.org/pub/"><font color="#1d58d1">http://ftp.osuosl.org/pub/</font></a> 看了就知道了<br /><br /><br /><a href="http://oosky.51ct.cn/" target="_new"><font color="#1d58d1">http://oosky.51ct.cn/</font></a><br /><a href="http://www.lcfk.com/" target="_new"><font color="#1d58d1">http://www.lcfk.com/</font></a><br />两个不错的网络硬盘<br /><br /><br /><a href="http://www.jz5u.com/download.asp?id=9601&amp;downid=0" target="_new"><font color="#1d58d1">http://www.jz5u.com/download.asp?id=9601&amp;downid=0</font></a><img src ="http://www.cnitblog.com/guopingleee/aggbug/32046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-18 16:56 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/18/32046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell是什么? </title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/16/31914.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Thu, 16 Aug 2007 02:02:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/16/31914.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31914.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/16/31914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31914.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31914.html</trackback:ping><description><![CDATA[
		<table class="tablew" border="0">
				<tbody>
						<tr>
								<td>
										<table class="tf" width="100%" border="0">
												<tbody>
														<tr>
																<td class="bw">
																		<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
																				<script type="text/javascript">
																						<!--
google_ad_client = "pub-3707276699544226";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
																				</script>
																				<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
																				</script>
																				<font class="htd" id="" font_word??="" font-size:14px;="" font-family:宋体,="" sans-serif;??="" helvetica,="" arial,="" verdana,="">
																						<br />
																						<br />　　任何发明都具有供用户使用的界面。UNIX供用户使用的界面就是Shell(DOS的command熟悉吧，但UNIX的要强大的多)。 Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。 <br /><br />　　为了不同的需要，UNIX提供了不同的Shell。现在的UNIX大部分都支持BourneShell，以下教程就以BourneShell(Bsh)为例，一步步的领略UNIX Shell的强大功能，占先其强大魅力，达到更方便灵活的管理、应用UNIX的目的。 <br /><br />　　1.UNIX内核和Shell的交互方法 <br /><br />　　启动UNIX时，程序UNIX(内核)将被调入计算机内存，并一直保留在内存中直到机器关闭。在引导过程中，程序 init将进入后台运行一直到机器关闭。该程序查询文件/etc/inittab，该文件列出了连接终端的各个端口及其特征。当发现一个活动的终端时，init程序调用getty程序在终端上显示login等登陆信息。(username和passwd)，在输入密码后， getty调用login进程，该进程根据文件/etc/passwd的内容来验证用户的身份。若用户通过身份验证，login进程 把用户的home目录设置成当前目录并把控制交给一系列setup程序。setup程序可以是指定的应用程序，通常setup程序 为一个Shell程序，如:/bin/sh 即Bourne Shell（command出来了，呵呵）。 <br /><br />　　得到控制后，Shell程序读取并执行文件/etc/.profile以及.profile。这两个文件分别建立了系统范围内的和 该用户自己的工作环境。最后Shell显示命令提示符，如$。(这是以bsh为例，若是csh,为.cshrc,ksh为.kshrc,bash为.bashrc等等) 　　　 <br /><br />　　注:(不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或 config.sys文件) <br /><br />　　当shell退出时，内核把控制交给init程序,该程序重新启动自动登陆过程。有两种方法使shell退出，一是用户执行exit命令，二是 内核(例如root用kill命令)发出一个kill命令结束shell进程。shell退出后，内核回收用户及程序使用的资源。 <br /><br />　　用户登陆后，用户命令同计算机交互的关系为:命令进程---&gt;Shell程序---&gt;UNIX内核---&gt;计算机硬件。当用户输入一个命令，如$ls, Shell将定位其可执行文件/bin/ls并把其传递给内核执行。内核产生一个新的子进程调用并执行/bin/ls。当程序执行完毕后，内核取消 该子进程并把控制交给其父进程，即Shell程序。例如执行: <br /><br />　　　　$ps <br /><br />　　　　该命令将会列出用户正在执行的进程，即Shell程序(下来详细说说，别急现在)和ps程序。若执行: <br /><br />　　　　$sleep 10 &amp; <br />　　　　$ps <br /><br />　　其中第一条命令将产生一个在后台执行的sleep子进程。ps命令执行时会显示出该子进程。 <br /><br />　　每当用户执行一条命令时，就会产生一个子进程。该子进程的执行与其父进程或Shell完全无关，这样可以使Shell去做其他工作。(Shell只是把用户的意图告诉内核，然后该干嘛干嘛:)) 现在windows有个计划任务(在固定的时间，日期自动执行某任务),其实UNIX很早就有这个功能了，也就是所谓的Shell的自动执行。一些UNIX 资源，如cron可以自动执行Shell程序而无需用户的参与，(这个功能好象在/var/spool/crotab目录里)。 <br /><br />Crontab 程序对于系统管理员来说是非常有用的。Cron 服务用于计划程序在特定时间（月、日、周、时、分）运行。我们以root的crontab 为例。根用户的 crontab 文件放在 /var/spool/crontab/root 中，其格式如下： <br /><br />　　(1) 　(2) 　(3) 　(4) 　(5)　 (6) <br />　　 0　　 0 　　*　　 * 　　3　　 /usr/bin/updatedb <br />　　　　　　1. 分钟 (0-60) <br />　　　　　　2. 小时 (0-23) <br />　　　　　　3. 日 (1-31) <br />　　　　　　4. 月 (1-12) <br />　　　　　　5. 星期 (1-7) <br />　　　　　　6. 所要运行的程序 <br />　　2.Shell的功能和特点 <br />　　1&gt;命令行解释 <br />　　2&gt;使用保留字 <br />　　3&gt;使用Shell元字符(通配符) <br />　　4&gt;可处理程序命令 <br />　　5&gt;使用输入输出重定向和管道 <br />　　6&gt;维护一些变量 <br />　　7&gt;运行环境控制 <br />　　8&gt;支持Shell编程 <br /><br />　　对于<i>"</i>命令行解释<i>"</i>就不多说了，就是在shell提示符(例如:<i>"</i>$<i>"</i>,<i>"</i>%<i>"</i>,<i>"</i>#<i>"</i>等)后输入一行unix命令，Shell将接收用户的输入。 <br /><br />　　<i>"</i>使用保留字<i>"</i>:Shell有一些具有特殊意义的字，例如在Shell脚本中，do,done,for等字用来控制循环操作，if,then等控制条件操作。 保留字随Shell环境的不同而不同。 <br /><br />　　<i>"</i>通配符<i>"</i>：* 匹配任何位置 <br />　　　　　　　? 匹配单个字符 <br />　　　　　　　[] 匹配的字符范围或列表 例如: <br />　　　　　　　 <br />　　　　　　　　　 $ls [a-c]* <br />　　　　　　　　　 <br />　　　　　　　　　 将列出以a-c范围内字符开头的所有文件 <br />　　　　　　　　　 $ls [a,m,t]* <br />　　　　　　　　　将列出以e,m或t开头的所有文件 <br /><br />　　<i>"</i>程序命令<i>"</i> ：当用户输入命令后，Shell读取环境变量$path(一般在用户自己的.profile中设置)，该变量包含了命令可执行文件可能存在的目录列表。 shell从这些目录中寻找命令所对应的可执行文件，然后将该文件送给内核执行。 <br /><br />　　<i>"</i>输入输出重定向及管道<i>"</i> ：重定向的功能同DOS的重定向功能： <br /><br />　　　　 <i>"</i>&gt;<i>"</i> 重定向输出 <br />　　　　 <i>"</i>&lt;<i>"</i> 重定向输入 <br /><br />　　而管道符号，是unix功能强大的一个地方,符号是一条竖线:<i>"</i>|<i>"</i>，用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为command 2的输入传给command 2，例如: <br /><br />　　　　$ls -s|sort -nr|pg <br /><br />　　该命令列出当前目录中的所有文件，并把输出送给sort命令作为输入，sort命令按数字递减的顺序把ls的输出排序。然后把排序后的 内容传送给pg命令，pg命令在显示器上显示sort命令排序后的内容。 <br /><br />　　<i>"</i>维护变量<i>"</i> ：Shell可以维护一些变量。变量中存放一些数据供以后使用。用户可以用<i>"</i>=<i>"</i>给变量赋值，如: <br /><br />　　　　　　　　　$lookup=/usr/mydir <br /><br />该命令建立一个名为lookup的变量并给其赋值/usr/mydir,以后用户可以在命令行中使用lookup来代替/usr/mydir，例如: 　　　　　　　　　 <br />　　　　　　　　　$echo $lookup <br />　　　　　　　　　结果显示:/usr/mydir <br /><br />　　　　　　　　　为了使变量能被子进程使用,可用exprot命令，例如: <br /><br />　　　　　　　　　$lookup=/usr/mydir <br />　　　　　　　　　$export lookup <br /><br />　　<i>"</i>运行环境控制<i>"</i> ：当用户登陆启动shell后，shell要为用户创建一个工作的环境，如下: <br /><br />　　1&gt;当login程序激活用户shell后，将为用户建立环境变量。从/etc/profile和.profile文件中读出，在这些文件中一般都用$TERM 变量设置终端类型，用$PATH变量设置Shell寻找可执行文件的路径。 <br /><br />　　2&gt;从/etc/passwd文件或命令行启动shell时，用户可以给shell程序指定一些参数，例如<i>"</i>-x<i>"</i>，可以在命令执行前显示该命令及其参数。后面详细介绍这些参数。 <br /><br />　　<i>"</i>shell编程<i>"</i> ：本文主要介绍的内容。 <br /><br />　　shell本身也是一种语言(*可以先理解为unix命令的组合，加上类C的条件，循环等程序控制语句,类似dos批处理，但要强大的多),用户可以 通过shell编程(脚本,文本文件)，完成特定的工作。 <br /><br />SHELL变量 <br /><br />　　下面我们详细的介绍Bourne Shell的编程: <br /><br />　　自从贝尔实验室设计了Bourne Shell。从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。但在众多版本的unix中，Bourne Shell 一直保持一致。 <br />　　1&gt;Bsh的启动：用户在登陆后，系统根据文件/etc/passwd中有关该用户的信息项启动Shell。例如某用户在passwd中 的信息项为: <br /><br />　　　　ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh <br /><br />　　则表明，用户名是ice_walk等信息，在最后一项<i>"</i>/bin/bsh<i>"</i>表明用户的sh环境类型是bsh,于是系统启动之。在启动或执行(包括下面我们要讲 的shell程序--脚本）过程中可以使用以下一些参数，我们一一说明: <br /><br />　　-a 将所有变量输出 <br />　　-c <i>"</i>string<i>"</i>从string中读取命令 <br />　　-e 使用非交互式模式 <br />　　-f 禁止shell文件名产生 <br />　　-h 定义 <br />　　-i 交互式模式 <br />　　-k 为命令的执行设置选项 <br />　　-n 读取命令但不执行 <br />　　-r 受限模式 <br />　　-s 命令从标准输入读取 <br />　　-t 执行一命令，然后退出shell <br />　　-u 在替换时，使用未设置的变量将会出错 <br />　　-v 显示shell的输入行 <br />　　-x 跟踪模式，显示执行的命令 <br /><br />许多模式可以组合起来用,您可以试试了，但-ei好象不行，你说why呢？ <br /><br />　　使用set可以设置或取消shell的选项来改变shell环境。打开选项用<i>"</i>-<i>"</i>,关闭选项用<i>"</i>+<i>"</i>,多数unix允许打开或关闭a、f、e、h、k、n、 u、v和x选项。若显示Shell中已经设置的选项，执行: <br /><br />　　　　$echo $- <br /><br />　　Bsh中每个用户的home目录下都有一个.profile文件，可以修改该文件来修改shell环境。为了增加一个可执行文件的路径(例如/ice_walk/bin)， 可以把下面代码加入.profile中 <br /><br />　　　　PATH=$PATH:/ice_walk/bin;exprot PATH <br /><br />　　 .profile中shell的环境变量意思如下: <br /><br />　　　　CDPATH 执行cd命令时使用的搜索路径 <br />　　　　HOME 用户的home目录 <br />　　　　IFS 内部的域分割符，一般为空格符、制表符、或换行符 <br />　　　　MAIL 指定特定文件(信箱)的路径，有UNIX邮件系统使用 <br />　　　　PATH 寻找命令的搜索路径(同dos的config.sys的 path) <br />　　　　PS1 主命令提示符，默认是<i>"</i>$<i>"</i> <br />　　　　PS2 从命令提示符，默认是<i>"</i>&gt;<i>"</i> <br />　　　　TERM 使用终端类型 <br /><br />　　2&gt;Bsh里特殊字符及其含义 <br /><br />　　在Bsh中有一组非字母字符。这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符控制。他们 可以让用户在Shell中使用最少的代码完成复杂的任务。 <br /><br />　　　　　*&gt; Shell变量名使用的特殊字符 <br />　　　　　　　　$# 传送给命令Shell的参数序号 <br />　　　　　　　　$- 在Shell启动或使用set命令时提供选项 <br />　　　　　　　　$? 上一条命令执行后返回的值 <br />　　　　　　　　$$ 当前shell的进程号 <br />　　　　　　　　$! 上一个子进程的进程号 <br />　　　　　　　　$@ 所有的参数，每个都用双括号括起 <br />　　　　　　　　$* 所有参数，用双括号括起 <br />　　　　　　　　$n 位置参数值，n表示位置 <br />　　　　　　　　$0 当前shell名 <br />　　　　　*&gt;产生文件名的特殊字符 <br />　　　　　　　　包括<i>"</i>*<i>"</i>,<i>"</i>?<i>"</i>,<i>"</i>[]<i>"</i>，上面讲过，不再多说。 <br />　　　　　*&gt;数据或程序控制使用的特殊字符 <br />　　　　　　　　&gt;(file) 输出重定向到文件中(没有文件则创建，有则覆盖) <br />　　　　　　　　&gt;&gt;(file) 输出重定向到文件中(没有则创建，有则追加到文件尾部) <br />　　　　　　　　&lt;(file) 输入重定向到文件 <br />　　　　　　　　; 命令分割符 <br />　　　　　　　　| 管道符 <br />　　　　　　　　&amp; 后台运行(例如:sleep 10 &amp;) <br />　　　　　　　　` ` 命令替换，重定向一条命令的输出作为另一命令的参数 <br />　　　　　*&gt;对于引用或逃逸的特殊字符 <br /><br />Bsh用单引号<i>'</i> <i>'</i>和双引号<i>"</i> <i>"</i>将特殊字符或由空白分隔的字引用起来组成一个简单的数据串.使用单引号和双引号的区别是双引号中的内容可进行参数和变量替换.逃逸字符也一样. <br /><br />　　　　　　　　$echo <i>"</i>$HOME $PATH<i>"</i> <br />　　　　 　　　 结果显示$/u/ice_walk/bin:/etc:/usr/bin <br />　　　　　　　　而$echo <i>'</i>$HOME $PATH<i>'</i> 结果显示$HOME $PATH <br /><br />　　shell的逃逸符是一个<i>"</i>\<i>"</i>,表示其后的字符不具有特殊的含义或不是shell的函数 <br /><br />　　　　　　　　$echo \$HOME $PATH <br />　　　　　　　　结果显$$HOME /bin:/etc:/usr/bin: <br /><br />3&gt;Bsh的变量 <br /><br />　　前面我们在多个地方引用了变量,当Shell遇到一个<i>"</i>$<i>"</i>符时(没有被引用或逃逸)，它将认为其后为一变量。不论该变量是环境变量还是用户自定义的变量，在命令行中变量名要被变量值替换。例如命令:ls $HOME将列出变量HOME对应目录下的文件。 用户可以在命令行中的任何地方进行变量替换。包括命令名本身，例如： <br /><br />　　　　$dir=ls <br />　　　　$$dir f* <br /><br />　　将列出以f开头的文件。 <br /><br />　　现在详细的介绍下Bsh的变量。Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。 <br /><br />　　用户定义的变量： <br /><br />　　用户定义的变量由字母和下划线组成，并且变量名的第一个字符不能为数字(0~9)。与其他UNIX名字一样，变量名是大小写敏感的。用户可以在命令行上用<i>"</i>=<i>"</i>给变量赋值，例如: <br /><br />　　　　$NAME=ice_walk <br /><br />　　给变量NAME赋值为ice_walk,在应用变量NAME的时候，在NAME前加<i>"</i>$<i>"</i>即可，前面已说，不再废话(别说我废话多，关键是没当过老师:()。可以用变量和其他字符组成新的字，例如: <br /><br />　　　　$SUN=sun <br />　　　　$echo ${SUN}day <br /><br />　　在应用shell变量时候，可以在变量名字两边$后面加上{}，以更加清楚的显示给shell,哪个是真正的变量，以实现字符串的合并等功能。 <br />　 <br />　　结果显示:sunday(注意不能echo $SUNday,因为SUNday变量没定义，读者试下执行结果) 用户也可以在命令行上同时对多个变量赋值，赋值语句之间用空格分开: <br /><br />　　　　$X=x Y=y <br /><br />　　　　注意变量赋值是从右到左进行的 <br /><br />　　　　$X=$Y Y=y <br />　　　　X的值是y <br />　　　　$X=z Y=$Z <br /><br />　　　　Y的值是空(变量未赋值时，shell不报错，而是赋值为空) <br /><br />　　用户可以使用<i>"</i>unset &lt;变量&gt;<i>"</i>命令清除给变量赋的值 <br /><br />用户使用变量时要在其前面加一<i>"</i>$<i>"</i>符，使变量名被变量值所替换。Bsh可以进行变量的条件替换，即只有某种条件发生时才进行替换。替换条件放在一对大括号{}中，如: <br /><br />　　　　${variable: -<i>value</i>} variable是一变量值，<i>value</i>是变量替换使用的默认值 <br /><br />　　　　$echo Hello $UNAME <br />　　　　结果显示:Hello <br />　　　　$echo Hello ${UNAME: -there} <br />　　　　结果显示:Hello there <br />　　　　$echo $UNAME <br />　　　　结果显示: (空) <br />　　　　$UNAME=John <br />　　　　$echo Hello ${UNAME: -there} <br />　　　　结果显示:Hello John <br /><br />　　可以看出，变量替换时将使用命令行中定义的默认值，但变量的值并没有因此而改变。另外一种替换的方法是不但使用默认值进行替换，而且将默认值赋给该变量。其形式如下: <br /><br />　　　　${variable:=<i>value</i>} <br /><br />　　该形式在变量替换后同时把值<i>value</i>符给变量variable。 <br /><br />　　　　$echo Hello $UNAME <br />　　　　结果显示:Hello <br />　　　　$echo Hello ${UNAME:=there} <br />　　　　结果显示:Hello there <br />　　　　$echo $UNAME <br />　　　　结果显示:there <br />　　　　$UNAME=John <br />　　　　$echo Hello ${UNAME:-there} <br />　　　　结果显示:Hello John <br /><br />　　变量替换的值也可以是` `括起来的命令: <br /><br />　　　　$USERDIR={$Mydir: -`pwd`} <br /><br />　　第三种变量的替换方法是只有当变量已赋值时才用指定值替换形式: <br /><br />　　　　${variable: +<i>value</i>} <br /><br />　　　　只有变量variable已赋值时，其值才用<i>value</i>替换，否则不进行任何替换，例如: <br /><br />　　　　$ERROPT=A <br />　　　　$echo ${ERROPT: +<i>"</i>Error tracking is acitive<i>"</i>} <br />　　　　结果显示:Error tracking is acitive <br />　　　　$ERROPT= <br />　　　　$echo ${ERROPT: +<i>"</i>Error tracking is acitive<i>"</i>} <br />　　　　结果显示: (空) <br /><br />　　我们还可以使用错误检查的条件进行变量替换: <br /><br />　　　　${variable:?message} <br /><br />当变量variable已设置时，正常替换。否则消息message将送到标准错误输出(若此替换出现在shell程序中,那么该程序将终止)。　例如： <br /><br />　　　　$UNAME= <br />　　　　$echo $ {UNAME:?<i>"</i>UNAME HAS NOT BEEN SET<i>"</i>} <br />　　　　结果显示:UNAME HAS NOT BEEN SET <br /><br />　　　　$UNAME=Stephanie <br />　　　　$echo $ {UNAME:?<i>"</i>UNAME HAS NOT BEEN SET<i>"</i>} <br /><br />　　　　结果显示:Stephanie <br />　　　　当没有指定message时，shell将显示一条默认的消息，例如: <br /><br />　　　　$UNAME= <br />　　　　$echo $ {UNAME:?} <br />　　　　结果显示:sh:UNAME:parameter null or not set <br /><br />4&gt;位置变量或Shell参数 <br /><br />　　在shell解释用户的命令时，将把命令行的第一个字作为命令，而其他的字作为参数。当命令对应的可执行文件为Shell程序时，这些参数将作为位置变量传送给该程序。第一个参数记为$1,第二个为$2....第九个为$9。其中1到9是真正的参数名，<i>"</i>$<i>"</i>符只是用来标识变量的替换。 <br /><br />　　位置变量$0指命令对应的可执行文件名。在后面将详细介绍位置变量。 <br /><br />　　1.只读变量 <br /><br />　　用户将变量赋值后，为了防止以后对该变量的修改，可以用以下命令将该变量设置为只读变量： <br /><br />　　　　readonly variable <br /><br />　　2.export命令 <br /><br />　　shell执行一个程序时，首先为该程序建立一个新的执行环境，称为子shell。在Bourne Shell中变量都是局部的，即他们只在创建他们的Shell中有意义。用户可以用export命令让变量被其他子Shell识别。但某用户的变量是没法让其他用户使用的。 <br /><br />　　当用户启动一个新shell时,该shell将使用默认的提示符。因为赋给变量PS1的值只在当前shell中有效。为了让子Shell使用当前Shell中定义的提示符号，可以使用export命令： <br /><br />　　　　$PS1=<i>"</i>Enter command:<i>"</i> <br />　　　　Enter command:export PS1 <br />　　　　Enter command:sh <br />　　　　Enter command: <br /><br />　　　　此时变量PS1变成了全局变量。它可以被其子Shell使用。当变量被设置成全局的以后，将一直保持有效直到用户退出该变量所在的Shell。用户可以在文件.profile中给一个变量永久赋值。详见<i>"</i>规范Shell<i>"</i>。 <br /><br />基本语句 <br /><br />　　从本节起，我们将详细介绍Shell程序设计的基本知识，通过编写Shell脚本，用户可以根据自己的需要有条件的或者重复的执行命令。通过Shell程序，可以把单个的UNIX命令组合成一个完全实用的工具，完成用户的任务。 <br /><br />　　1&gt;什么是Shell程序 <br /><br />　　当用户在UNIX Shell中输入了一条复杂的命令，如: <br /><br />　　　　$ls -R /|greo myname |pg <br /><br />　　我们可以称用户在对Shell编程，当把这条语句写在一个文件里，并且符给该文件可执行权限，那么该文件就是我们传统上说的Shell程序。 <br /><br />　　2&gt;简单的Shell程序 <br /><br />　　假设用户每天使用下述命令备份自己的数据文件: <br /><br />　　　　$cd /usr/icewalk;ls * |cpio -o &gt; /dev/fd0 <br /><br />　　我们可以把它写在一个文件，如:ba.sh中: <br /><br />　　　　$cat &gt;ba.sh <br />　　　　cd /usr/icewalk <br />　　　　ls * |cpio -o &gt; /dev/fd0 <br />　　　　^D 　(ctrl_d) <br /><br />　　程序ba.sh就是Shell脚本，用户可以用vi或其他编辑工具编写更复杂的脚本。 <br /><br />　　此时用户备份文件只需要执行Shell程序ba.sh,执行时需在当前Shell中创建一个子Shell: <br /><br />　　　　$sh ba.sh <br /><br />　　程序sh与用户登陆时执行的Bourne Shell相同，但当Sh命令带参数ba.sh后，它将不再是一个交互式的Shell，而是直接从文件ba.sh中读取命令。 <br /><br />　　执行ba.sh中命令的另一方法是给文件ba.sh执行权限： <br /><br />　　　　$chmod +x ba.sh <br /><br />　　此时，用户可以输入文件名ba.sh做为一个命令来备份自己的数据，需要注意的是，用这种方法执行命令的时候，文件ba.sh必须存在于环境变量$PATH所指定的路径上。 <br /></font>
																				<tbody>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/31914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-16 10:02 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/16/31914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell学习系列(四).输入输出 </title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/16/31912.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Thu, 16 Aug 2007 01:35:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/16/31912.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31912.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/16/31912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31912.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31912.html</trackback:ping><description><![CDATA[
		<div id="art" style="MARGIN: 15px">
				<div>
						<br />
						<font style="FONT-SIZE: 14pt" color="#295200">
								<b>shell学习系列(三).通配符</b>
						</font>
						<table style="BORDER-COLLAPSE: collapse" bordercolor="#a5bd6b" cellspacing="1" cellpadding="0" width="100%" border="1">
								<tbody>
										<tr>
												<td align="middle">
														<table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="100%" border="0">
																<tbody>
																		<tr>
																				<td align="middle">
																						<table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="100%" border="0">
																								<tbody>
																										<tr>
																												<td>
																														<div id="art" style="MARGIN: 15px">
																																<div>当在使用命令行时,有很多时间都用来查找所需要的文件,shell提供了一套完整的字符串模式匹配规</div>
																																<div>则,或者称之为元字符,这样就可以按照所要求的模式来匹配文件.还可以使用字符类型来匹配文件名.<br />1.使用*<br />    使用星号*可以匹配文件名中的任何字符串,在下面的例子中,给出文件名模式app*,它的意思是文</div>
																																<div>件名以app开头,后面可以跟随任何字符串,包括空字符串:<br />    *也可以用在文件名模式的开头,如:<br />    ls *.doc<br />    匹配所有以.doc结尾的文件名.<br />    *还可以用在文件名的当中,如:<br />    ls cl*.sed<br />    用于匹配所有以cl开头,后面跟任何字符串,最后以.sed结尾的文件名.<br />2.使用?<br />    使用可以匹配文件名中的任何单个字符,如:<br />    ls ??R*<br />    文件名以任意两个字符开头,接着是R,后面跟任何字符的文件.<br />    ls conf??.log<br />    文件名以conf开头,中间是任意两个字符,最后以.log结尾的文件.<br />    ls f??*s<br />    所有以f开头,中间是任意两个字符,后面跟随任意字符串,并以s结尾的文件名.<br />3.使用[...]和[!...]<br />    使用[...]可以用来匹配方括号[]中的任何字符.在这一方法中,还可以使用一个横杠-来连接两个</div>
																																<div>字母或数字,以此来表示一个范围.<br />    ls [io]*<br />    列出以i或者o开头的文件名<br />    ls log.[0-9]*<br />    匹配所有以log.开头,后面跟随一个数字,然后可以是任意字符串的文件名.<br />    ls log.[!0-9]*<br />    表示非数字开头的字符串. <br />    为了列出所有以大写字母开头的文件名,可以用:<br />    ls [A-Z]*<br />    为了列出所有以小写字母开头的文件名,可以用:<br />    ls [a-z]*<br />    为了列出所有以数字开头的文件名,可以用:<br />    ls .*<br /></div>
																														</div>
																												</td>
																										</tr>
																								</tbody>
																						</table>
																				</td>
																		</tr>
																</tbody>
														</table>
												</td>
										</tr>
								</tbody>
						</table>=====================================================<br /><br /><br /><br /><br />在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入,缺省为键盘,或者指定一个文件</div>
				<div>作为输入.对于输出也是一样,如果不指定某个文件作为输出,标准输出问题和终端屏幕相关联,也可以</div>
				<div>把信息指定到一个文件中.<br />1.echo<br />    使用echo命令可以显示文本行或变量,或者把字符串输入到文件.它的一般形式为:<br />    echo string<br />    echo命令有很多功能,其中最常用的是下面几个:<br />    \c 不换行<br />    \t 跳格<br />    \n 换行<br />    如果是Linux系统,那么必须使用-n选项来禁止echo命令后换行:<br />    必须使用-e选项才能使转义符生效.<br />    如果希望在echo命令输出之后附加换行,可以使用\n选项.<br />    如果想把一个字符串输出到文件中,使用重定向符号&gt;.<br />    引号是一个特殊的字符,所以必须要使用反斜杠\来使shell忽略它的特殊意义.假设希望使用echo</div>
				<div>命令输出这样的字符串: "/dev/rmt0", 那么只要在引号前面加上反斜杠就可以了:<br />    echo "\"/dev/rmt0\""<br />2.read<br />    可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量.如果只指定了一</div>
				<div>个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车.<br />    它的一般形式为:<br />    read varible1 varible2 <br />    在下面的例子中,只指定了一个变量 ,它将被赋予直至回车之前的所有内容.<br />    read name<br />    hello i am a man<br />    echo $name<br />    hello i am a man<br />    在下面的例子中,给出了两个变量,它们分别被赋予名字和姓氏,shell将用空格作为变量之间的分</div>
				<div>隔符.<br />    read name surname<br />    john doe<br />    echo $name $surname<br />    john doe<br />    如果文本域过长,shell将所有的超长部分赋予最后一个变量.<br />3.cat<br />    cat是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示控制字符.</div>
				<div>在使用cat命令时要注意,它不会在文件分页符处停下来.它会一下显示完整个文件.如果希望每次显示</div>
				<div>一页,可以使用more命令或把cat命令的输出通过管道传递到另外一个具有分页功能的命令中.<br />    cat myfile | more<br />    cat命令的一般形式为:<br />    cat [options] filename1 ... filename2 <br />    cat命令最有用的选项就是:<br />    -v显示控制字符.<br />    如果希望显示myfile1, myfile2, myfile3这三个文件,可以用:<br />    cat myfile1 myfile2 myfile3<br />    如果希望创建一个名为bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令的输出</div>
				<div>重定向到新文件中:<br />    cat myfile1 myfile2 myfile3 &gt; bigfile<br />4.管道<br />    可以通过管道把一个命令的输出传递给另一个命令作为输入,管道用竖杠|表示,它的一般形式为:<br />    命令1|命令2<br />5.tee<br />    tee命令作用可以用字母T来形象地表示,它把输出的一个副本输送到标准输出,另一个副本拷贝到</div>
				<div>相应的文件中.如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了.<br />    它的一般形式为:<br />    tee -a files<br />    其中-a表示追加到文件末尾<br />    在执行某些命令或脚本时,如果希望把输出保留下来,tee命令非常方便.<br />    who | tee who.out<br />    就将who的结果显示给标准输出,同时保存到who.out文件中.<br />    如:<br />    who | tee who.out | awk '{print $1"\t"$2}' | tee -a who.out<br />6.标准输入,输出和错误<br />6.1标准输入<br />    标准输入是文件描述符0,它是命令的输入,缺省是键盘,也可以是文件或其它命令的输出.<br />6.2标准输出<br />    标准输出是文件描述符1,它是命令的输出,缺省是屏幕,也可以是文件.<br />6.3标准错误<br />    标准错误是文件描述符2,这是命令错误的输出,缺省是屏幕,同样也可以是文件.<br />7.文件重定向<br />    在执行命令时,可以指定命令的标准输入,输出和错误,要实现这一点就需要使用文件重定向,在对</div>
				<div>标准错误进行重定向时,必须要使用文件描述符.但是对于标准输入和输出来说,这不是必需的.<br />    command &gt; filename  把标准输出重定向到一个新文件中<br />    command &gt;&gt; filename  把标准输出重定向到一个新文件中(追加)<br />    command 1&gt; filename  把标准输出重定向到一个文件中<br />    command &gt; filename 2&gt;&amp;1 把标准输出和标准错误重定向到一个文件中<br />    command 2&gt;filename 把标准错误重定向到一个文件中<br />    command 2&gt;&gt; filename 把标准错误重定向到一个文件中(追加)<br />    command &gt;&gt; filename 2&gt;&amp;1 把标准输出和标准错误重定向到一个文件中(追加)<br />    command &lt; filename &gt; filename2以filename文件作为标准输入,以filename2文件作为标准输出<br />    command &lt; filename  以filename文件作为标准输入<br />    command &lt;&lt; delimiter 从标准输入中读入,直到遇到delimiter分界符<br />    command &lt;&amp;m  把文件描述符m作为标准输入<br />    command &gt;&amp;m  把标准输出重定向到文件描述符m中<br />    command &lt;&amp;-  关闭标准入<br />7.1 重定向标准输出<br />    在下面的命令中,把/etc/passwd文件中的用户ID域按照用户名排列,该命令的输出重定向到</div>
				<div>sort.out文件中,要提醒注意的是,在使用sort命令的时候,重定向符号一定要离开sort命令两个空格,</div>
				<div>否则该命令会把它当作输入文件.<br />    cat passwd | awk -F: '{print $1}' | sort  1&gt;sort.out<br />    可以把很多命令的输出追回到同一个文件中.<br />    ls -l | grep ^d &gt;&gt; file.out<br />    如果希望把标准输出重定向到文件中,可以用&gt;filename.如果希望追加到已有的文件中,那么可以</div>
				<div>使用&gt;&gt;filename.如果想创建一个长度为0的空文件,可以用&gt;filename.<br />7.2 重定向标准输入<br />    可以指定命令的标准输入.<br />    sort &lt; name.txt<br />    在上面的命令中,sort命令的输入是采用重定向的方式给出的.不过也可以直接把相应的文件作为</div>
				<div>该命令的参数.<br />    sort name.txt<br />    在发送邮件的时候,可以用重定向的方法发送一个文件中的内容,如:<br />    mail louise &lt; contents.txt<br />    重定向操作符command &lt;&lt; delimiter是一种非常有用的命令,通过都被称为"此处"文档.shell将</div>
				<div>分界符delimiter之后直至下一个同样的分界符之前的所有内容作为输入,遇到下一个分界符,shell就</div>
				<div>知道输入结束了.这一命令对于自动或远程的例程非常有用.可以用任意定义分界符delimiter,最常见</div>
				<div>的是EOF.<br />7.3 重定向标准错误<br />    为了重定向标准错误,可以指定文件描述符2.如:<br />    grep "trident" missiles 2&gt; /dev/null<br />8.结合使用标准输出和标准错误<br />    一个快速发现错误的方法就是,先将输出重定向到一个文件中,然后再把标准错误重定向到另外一</div>
				<div>个文件中.下面给出一个例子:<br />    在审计文件时,其中一个的确存在,而且包含一些信息,而另一个由于某种原因已经不存在了,想把</div>
				<div>这两个文件合并到accounts.out文件中.<br />    cat account_qtr.doc account_end.doc 1&gt; accounts.out 2&gt;accoutns.err<br />    现在如果出现了错误相应的错误将会保存在accounts.err文件中.<br />9.合并标准输出和标准错误<br />    在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的.<br />    cleanup &gt; cleanup.out 2&gt;&amp;1<br />    在上面的例子中,将cleanup脚本的输出重定向到cleanup.out文件中,而且其错误也被重定向到相</div>
				<div>同的文件中.<br />10.exec<br />    exec命令可以用来替代当前shell,换句话说,并没有启动子shell.使用这一命令时任何现有的环</div>
				<div>境将会被清除,并重新启动一个shell,它的一般形式为:<br />    shell command<br />    其中的command通常是一个shell脚本.<br />    当这个脚本结束时,相应的会话就可能结束了.exec在对文件描述符进行操作的时候,它不会覆盖</div>
				<div>当前的shell.<br />11.使用文件描述符<br />    可以使用exec命令通过文件描述符打开和关闭文件,在下面的例子中.选用了文件描述符4,下面的</div>
				<div>脚本只是从stock.txt文件中读了两行,然后把这两行回显出来.<br />    该脚本的第一行把文件描述符4指定为标准输入,然后打开stock.txt文件,接下来两行的作用是读</div>
				<div>入了两行文本,接着,作为标准输入的文件描述符4被关闭.最后line1和line2两个变量所含有的内容都</div>
				<div>被回显到屏幕上.<br />#!/bin/sh<br />exec 4&lt;&amp;0 0&lt;stock.txt<br />read line1<br />read line2<br />exec 0&lt;&amp;4<br />echo $line1<br />echo $line2<br /><br /><br />=====================================================<br /><br /><br /><br /><strong><font color="#295200" size="5">shell学习系列(六).grep</font></strong><table style="BORDER-COLLAPSE: collapse" bordercolor="#a5bd6b" cellspacing="1" cellpadding="0" width="100%" border="1"><tbody><tr><td align="middle"><table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td align="middle"><table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><div id="art" style="MARGIN: 15px"><div>1.grep<br />    grep的一般格式为:<br />    grep [选项] 基本正则表达式 [文件]<br />    这里基本正则表达式可为字符串<br />1.1 双引号引用<br />    在grep命令中输入字符串参数时,最好将其用双引号括起来,例如"mystring".这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,例</div><div>如"jet plane".如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回"文件不存在"的错误信息.<br />    在调用变量时,也应该使用双引号,诸如:grep "$MYVAR" 文件名,如果不这样,将没有返回结果.<br />    在调用模式匹配时,应该使用单引号.<br />1.2 grep选项<br />    常用的grep选项有:<br />    -c 只输出匹配行的行数<br />    -i 不区分大小写(只适用于单字符)<br />    -h 查询多文件时不显示文件名<br />    -l 查询多文件时只输出包含匹配字符的文件名<br />    -n 显示匹配行及行号<br />    -s 不显示不存在或无匹配文件的错误信息<br />    -v 显示不包含匹配文件的所有行<br />1.3 查询多个文件<br />    如果要在当前目录下所有.doc文件中查找字符串"sort",方法如下:<br />    grep "sort" *.doc<br />    或在所有文件中查询单词"sort it"<br />    grep "sort it" *<br />1.4 行匹配 <br />    grep -c "48" data.f<br />    grep返回4,表示是有4行包含字符串"48"<br />1.5 行数<br />    显示满足匹配模式的所有行行数:<br />    grep -n "48" data.f<br />    行数输出在第一列,后跟包含48的每一匹配行.<br />1.6 显示非匹配行<br />    显示所有不包含48的各行:<br />    grep -v "48" data.f<br />1.7 精确匹配<br />    在抽取字符串"48"时,返回结果也可能会返回包含"484", "483"等含有"48"的其它字符串,实际上应精确抽取只包含48"的各行,可以采用如下方式来只提取含有48的项:<br />    grep "48\&gt;" data.f<br />    或者是<br />    grep "\&lt;48\&gt;" data.f<br />    grep -w "48" data.f<br />1.8 大小写敏感<br />    缺省情况下,grep是大小写敏感的,如果要查询大小写不敏感的字符串,必须使用-i选项.<br />2.grep和正则表达式<br />    使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选项,使用正则表达式最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的</div><div>特殊方式相混淆.<br />2.1 模式范围<br />    假定要抽取代码为484或483的城市位置.<br />    grep '48[34]' data.f<br />2.2 不匹配行首<br />    如果要抽出记录,使其行首不是4或8,可以在方括号中使用^记号,表明查询在行首开始.<br />    grep "^[^48]" data.f<br />    如果要使行首不是48,则:<br />    grep -v "^48" data.f<br />2.3 设置大小写<br />    使用-i开关可以屏蔽月份Sept的大小写敏感,也可以用另外一种方式.这里使用[]模式抽取各行包含Sept 和 sept的所有信息.<br />    grep "[Ss]ept" data.f<br />2.4 匹配任意字符 <br />    如果抽取以L开头,以D结尾的所有代码,可使用下述方法.因为已知代码长度为5个字符:<br />    grp "k...d" data.f<br />2.5 日期查询<br />    一个常用的查询模式是日期查询,先查询所有以5开始以1996或1998结尾的所有记录.使用模式5..199[6,8].这意味着第一个字符为5,后跟两个点,<br />    grep "5..199[6,8]" data.f<br />2.6 范围组合 <br />    必须学会使用[]抽取信息,假定要取得城市代码,第一个字符为任意字符,第二个字符在0到5之间,第三个字符在0到6之间,使用下列模式即可实现:<br />    grep "[0-9][0-5][0-6]" data.f<br />2.7 模式出现机率<br />    抽取包含数字4至少重复出现两次的所有行,方法如下:<br />    grep '4\{2,\}' data.f<br />    同样,抽取记录使之包含数字999,方法如下: <br />    grep '9\{3,\}' data.f<br />2.8 使用grep匹配"与"或者"或"模式<br />    grep命令加-E参数,这一扩展允许使用扩展模式匹配,例如,要抽取城市代码为219或216,方法如下:<br />    grep -E '219|216' data.f<br />2.9 空行<br />    结合使用^和$可查询空行,使用-n参数显示实际行数.<br />    grep '^$' myfile<br />2.10匹配特殊字符<br />    查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ?,必须在特定字符前加\,假设要查询包含"."的所有行,脚本如下:<br />    grep '\.' myfile<br />    或者是一个双引号<br />    grep '\"' myfile<br />    以同样的方式,如果要查询文件名conftroll.conf,脚本如下:<br />    grep 'conftroll\.conf' myfile<br />2.11查询格式化文件名<br />    使用正则表达式可匹配任意文件名,系统中对文本文件有其标准的命名格式,一般最后六个小字字符,后跟句点.接着是两个大写字符.例如,要在一个包含各类文件名的文件</div><div>filename.deposit中定位这类文件名,方法如下:<br />    grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename.deposit<br />2.12查询IP地址<br />    使用[0-9]\{3\}\.[0-9]\{3\}\. 含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点.<br />3.类名<br />    grep允许使用国际字符模式匹配或匹配模式的类名形式.<br />     类    等价的正则表达式<br />    [[:upper:]]    [A-Z]<br />    [[:lower:]]    [a-z]<br />    [[:digit:]]    [0-9]<br />    [[:alnum:]]    [0-9a-zA-Z]<br />    [[:space:]]    空格或TAB键<br />    [[:alpha:]]    [a-zA-Z]<br />    要抽取产品代码,该代码以5开头,后跟至少两个大写字母,使用的脚本如下:<br />    grep '5[[:upper:]][[:upper:]]' data.f<br />    如果要抽取以P或D结尾的所有产品代码,方法如下:<br />    grep '[[:upper:]][[:upper:]][P,D]' data.f<br />4.系统grep命令<br />4.1 目录<br />    如果要查询目录列表中的目录,方法如下:<br />    ls -l | grep '^d'<br />    如果在一个目录中查询不包含目录的所有文件,方法如下: <br />    ls -l | grep '^[^d]'<br />    要查询其它用户和其它用户组成员有可执行权限的目录集合,方法如下:<br />    ls -l | grep '^d.....x..x'<br />4.2 passwd文件<br />    grep "root" /etc/passwd<br />    上述脚本查询/etc/passwd文件是否包含root字符串.<br />4.3 使用ps命令<br />    使用带有ps x命令的grep可查询系统上运行的进程,ps x命令意为显示系统上运行的所有进程列表.输出也应包含此grep命令,因为grep命令创建了相应进程,ps x将找到它,在</div><div>grep命令中,使用-v选项可丢弃ps命令中的grep进程.<br />    ps ax | grep "named" | grep -v "grep"<br />4.4 对一个字符串使用grep<br />    grep不只应用于文件,也可应用于字符串,为此使用echo字符串命令,然后对grep命令使用管道输入.<br />    STR="mary joe peter pauline"<br />    echo $STR| grep "mary"</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div>
		</div>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/31912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-16 09:35 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/16/31912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[分享]PHP与JavaScript之间中文base64码转换代码 </title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31505.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Wed, 08 Aug 2007 05:08:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31505.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31505.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31505.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31505.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31505.html</trackback:ping><description><![CDATA[
		<br />
		<div class="msgbody">
				<div class="msgheader">
						<div class="right">
								<a class="smalltxt" onclick="copycode($('code0'));" href="http://bbs.chinaunix.net/thread-720183-1-1.html###">[Copy to clipboard]</a>
								<a class="smalltxt" onclick="toggle_collapse('code0');" href="http://bbs.chinaunix.net/thread-720183-1-1.html###">[ <span id="code0_symbol">-</span> ]</a>
						</div>CODE:</div>
				<div class="msgborder" id="code0">PHP base64_encode<br /><br />&lt;?php<br />function str_encode($str){<br />        return base64_encode(iconv('GB18030','UTF-8',$str));<br />}<br />echo str_encode('你好!美女!');<br />?&gt;</div>
		</div>
		<br />JavaScript  base64_decode<br /><br /><div class="msgbody"><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code1'));" href="http://bbs.chinaunix.net/thread-720183-1-1.html###">[Copy to clipboard]</a><a class="smalltxt" onclick="toggle_collapse('code1');" href="http://bbs.chinaunix.net/thread-720183-1-1.html###">[ <span id="code1_symbol">-</span> ]</a></div>CODE:</div><div class="msgborder" id="code1">&lt;script language='javascript'&gt;<br />/* utf.js - UTF-8 &lt;=&gt; UTF-16 convertion<br />*<br />* Copyright (C) 1999 Masanao Izumo &lt;iz@onicos.co.jp&gt;<br />* Version: 1.0<br />* LastModified: Dec 25 1999<br />* This library is free.  You can redistribute it and/or modify it.<br />*/<br /><br />/*<br />* Interfaces:<br />* utf8 = utf16to8(utf16);<br />* utf16 = utf16to8(utf8);<br />*/<br /><br />function utf16to8(str) {<br />    var out, i, len, c;<br /><br />    out = "";<br />    len = str.length;<br />    for(i = 0; i &lt; len; i++) {<br />        c = str.charCodeAt(i);<br />        if ((c &gt;= 0x0001) &amp;&amp; (c &lt;= 0x007F)) {<br />            out += str.charAt(i);<br />        } else if (c &gt; 0x07FF) {<br />            out += String.fromCharCode(0xE0 | ((c &gt;&gt; 12) &amp; 0x0F));<br />            out += String.fromCharCode(0x80 | ((c &gt;&gt;  6) &amp; 0x3F));<br />            out += String.fromCharCode(0x80 | ((c &gt;&gt;  0) &amp; 0x3F));<br />        } else {<br />            out += String.fromCharCode(0xC0 | ((c &gt;&gt;  6) &amp; 0x1F));<br />            out += String.fromCharCode(0x80 | ((c &gt;&gt;  0) &amp; 0x3F));<br />        }<br />    }<br />    return out;<br />}<br /><br />function utf8to16(str) {<br />    var out, i, len, c;<br />    var char2, char3;<br /><br />    out = "";<br />    len = str.length;<br />    i = 0;<br />    while(i &lt; len) {<br />        c = str.charCodeAt(i++);<br />        switch(c &gt;&gt; 4)<br />        { <br />          case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:<br />            // 0xxxxxxx<br />            out += str.charAt(i-1);<br />            break;<br />          case 12: case 13:<br />            // 110x xxxx   10xx xxxx<br />            char2 = str.charCodeAt(i++);<br />            out += String.fromCharCode(((c &amp; 0x1F) &lt;&lt; 6) | (char2 &amp; 0x3F));<br />            break;<br />          case 14:<br />            // 1110 xxxx  10xx xxxx  10xx xxxx<br />            char2 = str.charCodeAt(i++);<br />            char3 = str.charCodeAt(i++);<br />            out += String.fromCharCode(((c &amp; 0x0F) &lt;&lt; 12) |<br />                                           ((char2 &amp; 0x3F) &lt;&lt; 6) |<br />                                           ((char3 &amp; 0x3F) &lt;&lt; 0));<br />            break;<br />        }<br />    }<br /><br />    return out;<br />}<br /><br />/* Copyright (C) 1999 Masanao Izumo &lt;iz@onicos.co.jp&gt;<br />* Version: 1.0<br />* LastModified: Dec 25 1999<br />* This library is free.  You can redistribute it and/or modify it.<br />*/<br /><br />/*<br />* Interfaces:<br />* b64 = base64encode(data);<br />* data = base64decode(b64);<br />*/<br /><br /><br />var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";<br />var base64DecodeChars = new Array(<br />    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,<br />    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,<br />    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,<br />    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,<br />    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,<br />    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,<br />    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,<br />    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);<br /><br />function base64encode(str) {<br />    var out, i, len;<br />    var c1, c2, c3;<br /><br />    len = str.length;<br />    i = 0;<br />    out = "";<br />    while(i &lt; len) {<br />        c1 = str.charCodeAt(i++) &amp; 0xff;<br />        if(i == len)<br />        {<br />            out += base64EncodeChars.charAt(c1 &gt;&gt; 2);<br />            out += base64EncodeChars.charAt((c1 &amp; 0x3) &lt;&lt; 4);<br />            out += "==";<br />            break;<br />        }<br />        c2 = str.charCodeAt(i++);<br />        if(i == len)<br />        {<br />            out += base64EncodeChars.charAt(c1 &gt;&gt; 2);<br />            out += base64EncodeChars.charAt(((c1 &amp; 0x3)&lt;&lt; 4) | ((c2 &amp; 0xF0) &gt;&gt; 4));<br />            out += base64EncodeChars.charAt((c2 &amp; 0xF) &lt;&lt; 2);<br />            out += "=";<br />            break;<br />        }<br />        c3 = str.charCodeAt(i++);<br />        out += base64EncodeChars.charAt(c1 &gt;&gt; 2);<br />        out += base64EncodeChars.charAt(((c1 &amp; 0x3)&lt;&lt; 4) | ((c2 &amp; 0xF0) &gt;&gt; 4));<br />        out += base64EncodeChars.charAt(((c2 &amp; 0xF) &lt;&lt; 2) | ((c3 &amp; 0xC0) &gt;&gt;6));<br />        out += base64EncodeChars.charAt(c3 &amp; 0x3F);<br />    }<br />    return out;<br />}<br /><br />function base64decode(str) {<br />    var c1, c2, c3, c4;<br />    var i, len, out;<br /><br />    len = str.length;<br />    i = 0;<br />    out = "";<br />    while(i &lt; len) {<br />        /* c1 */<br />        do {<br />            c1 = base64DecodeChars[str.charCodeAt(i++) &amp; 0xff];<br />        } while(i &lt; len &amp;&amp; c1 == -1);<br />        if(c1 == -1)<br />            break;<br /><br />        /* c2 */<br />        do {<br />            c2 = base64DecodeChars[str.charCodeAt(i++) &amp; 0xff];<br />        } while(i &lt; len &amp;&amp; c2 == -1);<br />        if(c2 == -1)<br />            break;<br /><br />        out += String.fromCharCode((c1 &lt;&lt; 2) | ((c2 &amp; 0x30) &gt;&gt; 4));<br /><br />        /* c3 */<br />        do {<br />            c3 = str.charCodeAt(i++) &amp; 0xff;<br />            if(c3 == 61)<br />                return out;<br />            c3 = base64DecodeChars[c3];<br />        } while(i &lt; len &amp;&amp; c3 == -1);<br />        if(c3 == -1)<br />            break;<br /><br />        out += String.fromCharCode(((c2 &amp; 0XF) &lt;&lt; 4) | ((c3 &amp; 0x3C) &gt;&gt; 2));<br /><br />        /* c4 */<br />        do {<br />            c4 = str.charCodeAt(i++) &amp; 0xff;<br />            if(c4 == 61)<br />                return out;<br />            c4 = base64DecodeChars[c4];<br />        } while(i &lt; len &amp;&amp; c4 == -1);<br />        if(c4 == -1)<br />            break;<br />        out += String.fromCharCode(((c3 &amp; 0x03) &lt;&lt; 6) | c4);<br />    }<br />    return out;<br />}<br />//input base64 encode<br />function strdecode(str){<br />        return utf8to16(base64decode(str));<br />}<br />document.write(strdecode('5L2g5aW9Iee+juWlsyE='));<br />&lt;/script&gt;</div></div><br /><a href="http://bbs.chinaunix.net/thread-720183-1-1.html">http://bbs.chinaunix.net/thread-720183-1-1.html</a><img src ="http://www.cnitblog.com/guopingleee/aggbug/31505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-08 13:08 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/08/31505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux系统调用列表</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Wed, 08 Aug 2007 01:49:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31477.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31477.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31477.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1>Linux系统调用列表</h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<!-- this content will be automatically generated across all content areas -->
																		<br />
																		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
										<p>
												<br />本文列出了大部分常见的Linux系统调用，并附有简要中文说明。</p>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>以下是Linux系统调用的一个列表，包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表，即使是简单的字母序英文列表，能做到这么完全也是很罕见的。</p>
										<p>按照惯例，这个列表以man pages第2节，即系统调用节为蓝本。按照笔者的理解，对其作了大致的分类，同时也作了一些小小的修改，删去了几个仅供内核使用，不允许用户调用的系统调用，对个别本人稍觉不妥的地方作了一些小的修改，并对所有列出的系统调用附上简要注释。</p>
										<p>其中有一些函数的作用完全相同，只是参数不同。（可能很多熟悉C++朋友马上就能联想起函数重载，但是别忘了Linux核心是用C语言写的，所以只能取成不同的函数名）。还有一些函数已经过时，被新的更好的函数所代替了（gcc在链接这些函数时会发出警告），但因为兼容的原因还保留着，这些函数我会在前面标上“*”号以示区别。</p>
										<p>
												<a name="1">
														<span class="atitle">一、进程控制：</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="550" border="1">
												<tbody>
														<tr>
																<td width="30">fork</td>
																<td>创建一个新进程</td>
														</tr>
														<tr>
																<td>clone</td>
																<td>按指定条件创建子进程</td>
														</tr>
														<tr>
																<td>execve</td>
																<td>运行可执行文件</td>
														</tr>
														<tr>
																<td>exit</td>
																<td>中止进程</td>
														</tr>
														<tr>
																<td>_exit</td>
																<td>立即中止当前进程</td>
														</tr>
														<tr>
																<td>getdtablesize</td>
																<td>进程所能打开的最大文件数</td>
														</tr>
														<tr>
																<td>getpgid</td>
																<td>获取指定进程组标识号</td>
														</tr>
														<tr>
																<td>setpgid</td>
																<td>设置指定进程组标志号</td>
														</tr>
														<tr>
																<td>getpgrp</td>
																<td>获取当前进程组标识号</td>
														</tr>
														<tr>
																<td>setpgrp</td>
																<td>设置当前进程组标志号</td>
														</tr>
														<tr>
																<td>getpid</td>
																<td>获取进程标识号</td>
														</tr>
														<tr>
																<td>getppid</td>
																<td>获取父进程标识号</td>
														</tr>
														<tr>
																<td>getpriority</td>
																<td>获取调度优先级</td>
														</tr>
														<tr>
																<td>setpriority</td>
																<td>设置调度优先级</td>
														</tr>
														<tr>
																<td>modify_ldt</td>
																<td>读写进程的本地描述表</td>
														</tr>
														<tr>
																<td>nanosleep</td>
																<td>使进程睡眠指定的时间</td>
														</tr>
														<tr>
																<td>nice</td>
																<td>改变分时进程的优先级</td>
														</tr>
														<tr>
																<td>pause</td>
																<td>挂起进程，等待信号</td>
														</tr>
														<tr>
																<td>personality</td>
																<td>设置进程运行域</td>
														</tr>
														<tr>
																<td>prctl</td>
																<td>对进程进行特定操作</td>
														</tr>
														<tr>
																<td>ptrace</td>
																<td>进程跟踪</td>
														</tr>
														<tr>
																<td>sched_get_priority_max</td>
																<td>取得静态优先级的上限</td>
														</tr>
														<tr>
																<td>sched_get_priority_min</td>
																<td>取得静态优先级的下限</td>
														</tr>
														<tr>
																<td>sched_getparam</td>
																<td>取得进程的调度参数</td>
														</tr>
														<tr>
																<td>sched_getscheduler</td>
																<td>取得指定进程的调度策略</td>
														</tr>
														<tr>
																<td>sched_rr_get_interval</td>
																<td>取得按RR算法调度的实时进程的时间片长度</td>
														</tr>
														<tr>
																<td>sched_setparam</td>
																<td>设置进程的调度参数</td>
														</tr>
														<tr>
																<td>sched_setscheduler</td>
																<td>设置指定进程的调度策略和参数</td>
														</tr>
														<tr>
																<td>sched_yield</td>
																<td>进程主动让出处理器,并将自己等候调度队列队尾</td>
														</tr>
														<tr>
																<td>vfork</td>
																<td>创建一个子进程，以供执行新程序，常与execve等同时使用</td>
														</tr>
														<tr>
																<td>wait</td>
																<td>等待子进程终止</td>
														</tr>
														<tr>
																<td>wait3</td>
																<td>参见wait</td>
														</tr>
														<tr>
																<td>waitpid</td>
																<td>等待指定子进程终止</td>
														</tr>
														<tr>
																<td>wait4</td>
																<td>参见waitpid</td>
														</tr>
														<tr>
																<td>capget</td>
																<td>获取进程权限</td>
														</tr>
														<tr>
																<td>capset</td>
																<td>设置进程权限</td>
														</tr>
														<tr>
																<td>getsid</td>
																<td>获取会晤标识号</td>
														</tr>
														<tr>
																<td>setsid</td>
																<td>设置会晤标识号</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="2">
														<span class="atitle">二、文件系统控制</span>
												</a>
										</p>
										<p>
												<a name="N101B3">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">1、文件读写操作</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">fcntl</td>
																<td>文件控制</td>
														</tr>
														<tr>
																<td>open</td>
																<td>打开文件</td>
														</tr>
														<tr>
																<td>creat</td>
																<td>创建新文件</td>
														</tr>
														<tr>
																<td>close</td>
																<td>关闭文件描述字</td>
														</tr>
														<tr>
																<td>read</td>
																<td>读文件</td>
														</tr>
														<tr>
																<td>write</td>
																<td>写文件</td>
														</tr>
														<tr>
																<td>readv</td>
																<td>从文件读入数据到缓冲数组中</td>
														</tr>
														<tr>
																<td>writev</td>
																<td>将缓冲数组里的数据写入文件</td>
														</tr>
														<tr>
																<td>pread</td>
																<td>对文件随机读</td>
														</tr>
														<tr>
																<td>pwrite</td>
																<td>对文件随机写</td>
														</tr>
														<tr>
																<td>lseek</td>
																<td>移动文件指针</td>
														</tr>
														<tr>
																<td>_llseek</td>
																<td>在64位地址空间里移动文件指针</td>
														</tr>
														<tr>
																<td>dup</td>
																<td>复制已打开的文件描述字</td>
														</tr>
														<tr>
																<td>dup2</td>
																<td>按指定条件复制文件描述字</td>
														</tr>
														<tr>
																<td>flock</td>
																<td>文件加/解锁</td>
														</tr>
														<tr>
																<td>poll</td>
																<td>I/O多路转换</td>
														</tr>
														<tr>
																<td>truncate</td>
																<td>截断文件</td>
														</tr>
														<tr>
																<td>ftruncate</td>
																<td>参见truncate</td>
														</tr>
														<tr>
																<td>umask</td>
																<td>设置文件权限掩码</td>
														</tr>
														<tr>
																<td>fsync</td>
																<td>把文件在内存中的部分写回磁盘</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10279">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">2、文件系统操作</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">access</td>
																<td>确定文件的可存取性</td>
														</tr>
														<tr>
																<td>chdir</td>
																<td>改变当前工作目录</td>
														</tr>
														<tr>
																<td>fchdir</td>
																<td>参见chdir</td>
														</tr>
														<tr>
																<td>chmod</td>
																<td>改变文件方式</td>
														</tr>
														<tr>
																<td>fchmod</td>
																<td>参见chmod</td>
														</tr>
														<tr>
																<td>chown</td>
																<td>改变文件的属主或用户组</td>
														</tr>
														<tr>
																<td>fchown</td>
																<td>参见chown</td>
														</tr>
														<tr>
																<td>lchown</td>
																<td>参见chown</td>
														</tr>
														<tr>
																<td>chroot</td>
																<td>改变根目录</td>
														</tr>
														<tr>
																<td>stat</td>
																<td>取文件状态信息</td>
														</tr>
														<tr>
																<td>lstat</td>
																<td>参见stat</td>
														</tr>
														<tr>
																<td>fstat</td>
																<td>参见stat</td>
														</tr>
														<tr>
																<td>statfs</td>
																<td>取文件系统信息</td>
														</tr>
														<tr>
																<td>fstatfs</td>
																<td>参见statfs</td>
														</tr>
														<tr>
																<td>readdir</td>
																<td>读取目录项</td>
														</tr>
														<tr>
																<td>getdents</td>
																<td>读取目录项</td>
														</tr>
														<tr>
																<td>mkdir</td>
																<td>创建目录</td>
														</tr>
														<tr>
																<td>mknod</td>
																<td>创建索引节点</td>
														</tr>
														<tr>
																<td>rmdir</td>
																<td>删除目录</td>
														</tr>
														<tr>
																<td>rename</td>
																<td>文件改名</td>
														</tr>
														<tr>
																<td>link</td>
																<td>创建链接</td>
														</tr>
														<tr>
																<td>symlink</td>
																<td>创建符号链接</td>
														</tr>
														<tr>
																<td>unlink</td>
																<td>删除链接</td>
														</tr>
														<tr>
																<td>readlink</td>
																<td>读符号链接的值</td>
														</tr>
														<tr>
																<td>mount</td>
																<td>安装文件系统</td>
														</tr>
														<tr>
																<td>umount</td>
																<td>卸下文件系统</td>
														</tr>
														<tr>
																<td>ustat</td>
																<td>取文件系统信息</td>
														</tr>
														<tr>
																<td>utime</td>
																<td>改变文件的访问修改时间</td>
														</tr>
														<tr>
																<td>utimes</td>
																<td>参见utime</td>
														</tr>
														<tr>
																<td>quotactl</td>
																<td>控制磁盘配额</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="3">
														<span class="atitle">三、系统控制</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">ioctl</td>
																<td>I/O总控制函数</td>
														</tr>
														<tr>
																<td>_sysctl</td>
																<td>读/写系统参数</td>
														</tr>
														<tr>
																<td>acct</td>
																<td>启用或禁止进程记账</td>
														</tr>
														<tr>
																<td>getrlimit</td>
																<td>获取系统资源上限</td>
														</tr>
														<tr>
																<td>setrlimit</td>
																<td>设置系统资源上限</td>
														</tr>
														<tr>
																<td>getrusage</td>
																<td>获取系统资源使用情况</td>
														</tr>
														<tr>
																<td>uselib</td>
																<td>选择要使用的二进制函数库</td>
														</tr>
														<tr>
																<td>ioperm</td>
																<td>设置端口I/O权限</td>
														</tr>
														<tr>
																<td>iopl</td>
																<td>改变进程I/O权限级别</td>
														</tr>
														<tr>
																<td>outb</td>
																<td>低级端口操作</td>
														</tr>
														<tr>
																<td>reboot</td>
																<td>重新启动</td>
														</tr>
														<tr>
																<td>swapon</td>
																<td>打开交换文件和设备</td>
														</tr>
														<tr>
																<td>swapoff</td>
																<td>关闭交换文件和设备</td>
														</tr>
														<tr>
																<td>bdflush</td>
																<td>控制bdflush守护进程</td>
														</tr>
														<tr>
																<td>sysfs</td>
																<td>取核心支持的文件系统类型</td>
														</tr>
														<tr>
																<td>sysinfo</td>
																<td>取得系统信息</td>
														</tr>
														<tr>
																<td>adjtimex</td>
																<td>调整系统时钟</td>
														</tr>
														<tr>
																<td>alarm</td>
																<td>设置进程的闹钟</td>
														</tr>
														<tr>
																<td>getitimer</td>
																<td>获取计时器值</td>
														</tr>
														<tr>
																<td>setitimer</td>
																<td>设置计时器值</td>
														</tr>
														<tr>
																<td>gettimeofday</td>
																<td>取时间和时区</td>
														</tr>
														<tr>
																<td>settimeofday</td>
																<td>设置时间和时区</td>
														</tr>
														<tr>
																<td>stime</td>
																<td>设置系统日期和时间</td>
														</tr>
														<tr>
																<td>time</td>
																<td>取得系统时间</td>
														</tr>
														<tr>
																<td>times</td>
																<td>取进程运行时间</td>
														</tr>
														<tr>
																<td>uname</td>
																<td>获取当前UNIX系统的名称、版本和主机等信息</td>
														</tr>
														<tr>
																<td>vhangup</td>
																<td>挂起当前终端</td>
														</tr>
														<tr>
																<td>nfsservctl</td>
																<td>对NFS守护进程进行控制</td>
														</tr>
														<tr>
																<td>vm86</td>
																<td>进入模拟8086模式</td>
														</tr>
														<tr>
																<td>create_module</td>
																<td>创建可装载的模块项</td>
														</tr>
														<tr>
																<td>delete_module</td>
																<td>删除可装载的模块项</td>
														</tr>
														<tr>
																<td>init_module</td>
																<td>初始化模块</td>
														</tr>
														<tr>
																<td>query_module</td>
																<td>查询模块信息</td>
														</tr>
														<tr>
																<td>*get_kernel_syms</td>
																<td>取得核心符号,已被query_module代替</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="4">
														<span class="atitle">四、内存管理</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">brk</td>
																<td>改变数据段空间的分配</td>
														</tr>
														<tr>
																<td>sbrk</td>
																<td>参见brk</td>
														</tr>
														<tr>
																<td>mlock</td>
																<td>内存页面加锁</td>
														</tr>
														<tr>
																<td>munlock</td>
																<td>内存页面解锁</td>
														</tr>
														<tr>
																<td>mlockall</td>
																<td>调用进程所有内存页面加锁</td>
														</tr>
														<tr>
																<td>munlockall</td>
																<td>调用进程所有内存页面解锁</td>
														</tr>
														<tr>
																<td>mmap</td>
																<td>映射虚拟内存页</td>
														</tr>
														<tr>
																<td>munmap</td>
																<td>去除内存页映射</td>
														</tr>
														<tr>
																<td>mremap</td>
																<td>重新映射虚拟内存地址</td>
														</tr>
														<tr>
																<td>msync</td>
																<td>将映射内存中的数据写回磁盘</td>
														</tr>
														<tr>
																<td>mprotect</td>
																<td>设置内存映像保护</td>
														</tr>
														<tr>
																<td>getpagesize</td>
																<td>获取页面大小</td>
														</tr>
														<tr>
																<td>sync</td>
																<td>将内存缓冲区数据写回硬盘</td>
														</tr>
														<tr>
																<td>cacheflush</td>
																<td>将指定缓冲区中的内容写回磁盘</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="5">
														<span class="atitle">五、网络管理</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">getdomainname</td>
																<td>取域名</td>
														</tr>
														<tr>
																<td>setdomainname</td>
																<td>设置域名</td>
														</tr>
														<tr>
																<td>gethostid</td>
																<td>获取主机标识号</td>
														</tr>
														<tr>
																<td>sethostid</td>
																<td>设置主机标识号</td>
														</tr>
														<tr>
																<td>gethostname</td>
																<td>获取本主机名称</td>
														</tr>
														<tr>
																<td>sethostname</td>
																<td>设置主机名称</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="6">
														<span class="atitle">六、socket控制</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">socketcall</td>
																<td>socket系统调用</td>
														</tr>
														<tr>
																<td>socket</td>
																<td>建立socket</td>
														</tr>
														<tr>
																<td>bind</td>
																<td>绑定socket到端口</td>
														</tr>
														<tr>
																<td>connect</td>
																<td>连接远程主机</td>
														</tr>
														<tr>
																<td>accept</td>
																<td>响应socket连接请求</td>
														</tr>
														<tr>
																<td>send</td>
																<td>通过socket发送信息</td>
														</tr>
														<tr>
																<td>sendto</td>
																<td>发送UDP信息</td>
														</tr>
														<tr>
																<td>sendmsg</td>
																<td>参见send</td>
														</tr>
														<tr>
																<td>recv</td>
																<td>通过socket接收信息</td>
														</tr>
														<tr>
																<td>recvfrom</td>
																<td>接收UDP信息</td>
														</tr>
														<tr>
																<td>recvmsg</td>
																<td>参见recv</td>
														</tr>
														<tr>
																<td>listen</td>
																<td>监听socket端口</td>
														</tr>
														<tr>
																<td>select</td>
																<td>对多路同步I/O进行轮询</td>
														</tr>
														<tr>
																<td>shutdown</td>
																<td>关闭socket上的连接</td>
														</tr>
														<tr>
																<td>getsockname</td>
																<td>取得本地socket名字</td>
														</tr>
														<tr>
																<td>getpeername</td>
																<td>获取通信对方的socket名字</td>
														</tr>
														<tr>
																<td>getsockopt</td>
																<td>取端口设置</td>
														</tr>
														<tr>
																<td>setsockopt</td>
																<td>设置端口参数</td>
														</tr>
														<tr>
																<td>sendfile</td>
																<td>在文件或端口间传输数据</td>
														</tr>
														<tr>
																<td>socketpair</td>
																<td>创建一对已联接的无名socket</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="7">
														<span class="atitle">七、用户管理</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">getuid</td>
																<td>获取用户标识号</td>
														</tr>
														<tr>
																<td>setuid</td>
																<td>设置用户标志号</td>
														</tr>
														<tr>
																<td>getgid</td>
																<td>获取组标识号</td>
														</tr>
														<tr>
																<td>setgid</td>
																<td>设置组标志号</td>
														</tr>
														<tr>
																<td>getegid</td>
																<td>获取有效组标识号</td>
														</tr>
														<tr>
																<td>setegid</td>
																<td>设置有效组标识号</td>
														</tr>
														<tr>
																<td>geteuid</td>
																<td>获取有效用户标识号</td>
														</tr>
														<tr>
																<td>seteuid</td>
																<td>设置有效用户标识号</td>
														</tr>
														<tr>
																<td>setregid</td>
																<td>分别设置真实和有效的的组标识号</td>
														</tr>
														<tr>
																<td>setreuid</td>
																<td>分别设置真实和有效的用户标识号</td>
														</tr>
														<tr>
																<td>getresgid</td>
																<td>分别获取真实的,有效的和保存过的组标识号</td>
														</tr>
														<tr>
																<td>setresgid</td>
																<td>分别设置真实的,有效的和保存过的组标识号</td>
														</tr>
														<tr>
																<td>getresuid</td>
																<td>分别获取真实的,有效的和保存过的用户标识号</td>
														</tr>
														<tr>
																<td>setresuid</td>
																<td>分别设置真实的,有效的和保存过的用户标识号</td>
														</tr>
														<tr>
																<td>setfsgid</td>
																<td>设置文件系统检查时使用的组标识号</td>
														</tr>
														<tr>
																<td>setfsuid</td>
																<td>设置文件系统检查时使用的用户标识号</td>
														</tr>
														<tr>
																<td>getgroups</td>
																<td>获取后补组标志清单</td>
														</tr>
														<tr>
																<td>setgroups</td>
																<td>设置后补组标志清单</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right">
												<tbody>
														<tr align="right">
																<td>
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="8">
														<span class="atitle">八、进程间通信</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">ipc</td>
																<td>进程间通信总控制调用</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N1074A">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">1、信号</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">sigaction</td>
																<td>设置对指定信号的处理方法</td>
														</tr>
														<tr>
																<td>sigprocmask</td>
																<td>根据参数对信号集中的信号执行阻塞/解除阻塞等操作</td>
														</tr>
														<tr>
																<td>sigpending</td>
																<td>为指定的被阻塞信号设置队列</td>
														</tr>
														<tr>
																<td>sigsuspend</td>
																<td>挂起进程等待特定信号</td>
														</tr>
														<tr>
																<td>signal</td>
																<td>参见signal</td>
														</tr>
														<tr>
																<td>kill</td>
																<td>向进程或进程组发信号</td>
														</tr>
														<tr>
																<td>*sigblock</td>
																<td>向被阻塞信号掩码中添加信号,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*siggetmask</td>
																<td>取得现有阻塞信号掩码,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*sigsetmask</td>
																<td>用给定信号掩码替换现有阻塞信号掩码,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*sigmask</td>
																<td>将给定的信号转化为掩码,已被sigprocmask代替</td>
														</tr>
														<tr>
																<td>*sigpause</td>
																<td>作用同sigsuspend,已被sigsuspend代替</td>
														</tr>
														<tr>
																<td>sigvec</td>
																<td>为兼容BSD而设的信号处理函数,作用类似sigaction</td>
														</tr>
														<tr>
																<td>ssetmask</td>
																<td>ANSI C的信号处理函数,作用类似sigaction</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N107D1">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">2、消息</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">msgctl</td>
																<td>消息控制操作</td>
														</tr>
														<tr>
																<td>msgget</td>
																<td>获取消息队列</td>
														</tr>
														<tr>
																<td>msgsnd</td>
																<td>发消息</td>
														</tr>
														<tr>
																<td>msgrcv</td>
																<td>取消息</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10807">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">3、管道</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">pipe</td>
																<td>创建管道</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N10822">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">4、信号量</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">semctl</td>
																<td>信号量控制</td>
														</tr>
														<tr>
																<td>semget</td>
																<td>获取一组信号量</td>
														</tr>
														<tr>
																<td>semop</td>
																<td>信号量操作</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="N1084F">
														<span class="smalltitle">
																<strong>
																		<font face="Arial">5、共享内存</font>
																</strong>
														</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td width="30">shmctl</td>
																<td>控制共享内存</td>
														</tr>
														<tr>
																<td>shmget</td>
																<td>获取共享内存</td>
														</tr>
														<tr>
																<td>shmat</td>
																<td>连接共享内存</td>
														</tr>
														<tr>
																<td>shmdt</td>
																<td>拆卸共享内存</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="resources">
														<span class="atitle">参考资料 </span>
												</a>
												<br />
												<br />
												<a href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html">http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html</a>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/31477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-08 09:49 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/08/31477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux如何处理当前运行环境的环境变量</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Tue, 07 Aug 2007 13:55:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31468.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31468.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31468.html</trackback:ping><description><![CDATA[
		<div id="contitle">
				<h1>Linux如何处理当前运行环境的环境变量</h1>
				<p>
						<br /> </p>
		</div>
		<div id="conauthor">
				<span>2006-10-19 00:00 </span>
				<span>作者： </span>
				<span>出处： 天极博客 </span>
				<span>责任编辑：<a title="向本编辑提问" href="http://comments.yesky.com/t/%D4%AD%D2%B0/6,324/2623818.shtml" target="_blank">原野</a></span>
		</div>
		<div class="topadbg">
				<span id="ad9">
						<div id="ad9ad">
						</div>
				</span>
		</div>
		<div id="conneirong">
				<span id="ad3">
				</span>
				<div class="guanggao">
						<span id="contentAdv">
								<br />
						</span>
				</div>
				<p>
						<br />
						<strong>
								<font color="#ff0000">setenv(set environment variable)<br /></font>
						</strong>
						<br />
						<strong>功能说明：</strong>查询或显示环境变量。<br /><br /><b>语　　法：</b>setenv [变量名称][变量值<br /><br />　　GNU/Linux下面每个程序运行都有一个所谓的运行环境，这里的环境实际上就是一组变量的定义。所有的变量和他们的值都是字符串形式表达的。通过转换，通常变量名字都是用大写字符表达。 </p>
				<p>　　对于环境变量大家都不陌生，例如，我们都很熟悉的HOME这个环境变量，这个变量指示的当前用户的个人用户目录的路径。又例如，PATH这个环境变量，它指示出当前Linux系统搜索的的执行文件的路径列表。 </p>
				<p>　　对于我们在Linux下常用的BASH这个shell程序，它有自己的一套管理环境变量的方法。例如，通过$NAME来访问相应的环境变量，通过export来设置环境变量，下面是一个实例： <br /></p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>[hwang@langchao linuxprogram]$ echo $HOME 
　　/home/hwang 
　　[hwang@langchao linuxprogram]$ export MYNAME="Luster" 
　　[hwang@langchao linuxprogram]$ echo $MYNAME 
　　Luster 
　　[hwang@langchao linuxprogram]$</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
				<p>　　而在我们的应用程序里面，如果需要访问一个环境变量，我们可以通过getenv（）这个函数来实现，getenv这个函数在这个头文件中声明。这个函数的输入参数是需要访问的变量名字，得到的返回值是一个字符串，如果所访问的环境变量没有设置，则会返回NULL。如果需要在程序里面设置某个环境变量，则可以使用setenv这个函数，如果是要清除某个特定的环境变量，则使用unsetenv这个函数。它们的函数原型如下： <br /></p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>#include  
　　 char *getenv(const char *name); 
　　 int setenv(const char *name, const char *value, int overwrite); 
　　 void unsetenv(const char *name);</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
				<p>　　值得一提的是，GNU C函数库里面有一个特殊的全局的变量，名字叫做environ，这个变量的类型是char **，它所指向的是所有的环境变量的一个列表，最后是以NULL结尾。每个字符串都是“VALUE=value”这样的形式。例如下面的程序可以打印出当前运行环境里面的所有的环境变量： <br /><br /></p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>#include  
　　extern char**environ; 
　　int main () 
　　{ 
　　 char**var; 
　　 for (var =environ;*var !=NULL;++var) 
　　 printf (“%s  
　　 “,*var); 
　　 return 0; 
　　} 
　　</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
				<p>　　注意，如果你需要修改某个环境变量，不要直接修改environ这个变量，而应该使用setenv或者unsetenv这样的管理函数来做这件事情。 </p>
				<p>　　一般来说，当一个程序启动的时候，它就会拷贝一份启动它的“父”程序所拥有的环境变量。环境变量是GNU程序常用来配置某个应用程序的行为的一个方法，例如，通过环境变量来设置HTTP代理服务器的地址和端口号等等。下面是一段代码的演示： </p>
				<p>　　 </p>
				<center>
						<ccid_nobr>
								<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
										<tbody>
												<tr>
														<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
																<pre>
																		<ccid_code>　#include  
　　#include  
　　int main () 
　　{ 
　　 char *server_name =getenv (“SERVER_NAME ”); 
　　 if (server_name ==NULL) 
　　 server_name =“server.my-company.com ”; 
　　 printf (“accessing server %s  
　　 ”,server_name); 
　　 
　　 return 0; 
　　} 
</ccid_code>
																</pre>
														</td>
												</tr>
										</tbody>
								</table>
						</ccid_nobr>
				</center>
		</div>
		<br />源地址:<br /><a href="http://os.yesky.com/lin/318/2623818.shtml">http://os.yesky.com/lin/318/2623818.shtml</a><br /><br /><br />=============================================================================================<br /><br /><br /><strong>linux c 环境控制篇</strong><br /><br /><table width="100%"><tbody><tr><td><font face="宋体" size="2">getenv（取得环境变量内容） </font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">相关函数 </font></div></td><td><font face="宋体" size="2">putenv，setenv，unsetenv<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">表头文件 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">定义函数 </font></div></td><td><font face="宋体" size="2">char * getenv(const char *name);<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">函数说明 </font></div></td><td><font face="宋体" size="2">getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称，如果该变量存在则会返回指向该内容的指针。环境变量的格式为name＝value。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">返回值 </font></div></td><td><font face="宋体" size="2">执行成功则返回指向该内容的指针，找不到符合的环境变量名称则返回NULL。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">范例 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br />mian()<br />{<br />char *p;<br />if((p = getenv(“USER”)))<br />printf(“USER=%sn”,p);<br />}<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">执行 </font></div></td><td><font face="宋体" size="2">USER = root<br /></font></td></tr><tr><td valign="top" width="80">　 
<div align="right"><br /><font face="宋体" size="2"><a name="linuxc290"></a></font></div></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2"><br /></font></div></td><td><font face="宋体" size="2"><br />putenv（改变或增加环境变量） </font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">相关函数 </font></div></td><td><font face="宋体" size="2">getenv，setenv，unsetenv<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">表头文件 </font></div></td><td><font face="宋体" size="2">#include4&lt;stdlib.h&gt;<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">定义函数 </font></div></td><td><font face="宋体" size="2">int putenv(const char * string);<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">函数说明 </font></div></td><td><font face="宋体" size="2">putenv()用来改变或增加环境变量的内容。参数string的格式为name＝value，如果该环境变量原先存在，则变量内容会依参数string改变，否则此参数内容会成为新的环境变量。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">返回值 </font></div></td><td><font face="宋体" size="2">执行成功则返回0，有错误发生则返回-1。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">错误代码 </font></div></td><td><font face="宋体" size="2">ENOMEM 内存不足，无法配置新的环境变量空间。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">范例 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br />main()<br />{<br />char *p;<br />if((p = getenv(“USER”)))<br />printf(“USER =%sn”,p);<br />putenv(“USER=test”);<br />printf(“USER+5sn”,getenv(“USER”));<br />}<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">执行 </font></div></td><td><font face="宋体" size="2">USER=root<br />USER=root<br /></font></td></tr><tr><td valign="top" width="80">　 
<div align="right"><br /><font face="宋体" size="2"><a name="linuxc291"></a></font></div></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2"><br /></font></div></td><td><font face="宋体" size="2"><br />setenv（改变或增加环境变量） </font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">相关函数 </font></div></td><td><font face="宋体" size="2">getenv，putenv，unsetenv<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">表头文件 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">定义函数 </font></div></td><td><font face="宋体" size="2">int setenv(const char *name,const char * value,int overwrite);<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">函数说明 </font></div></td><td><font face="宋体" size="2">setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">参数 </font></div></td><td><font face="宋体" size="2">value则为变量内容，参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0，而该环境变量原已有内容，则原内容会被改为参数value所指的变量内容。如果overwrite为0，且该环境变量已有内容，则参数value会被忽略。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">返回值 </font></div></td><td><font face="宋体" size="2">执行成功则返回0，有错误发生时返回-1。<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">错误代码 </font></div></td><td><font face="宋体" size="2">ENOMEM 内存不足，无法配置新的环境变量空间<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">范例 </font></div></td><td><font face="宋体" size="2">#include&lt;stdlib.h&gt;<br />main()<br />{<br />char * p;<br />if((p=getenv(“USER”)))<br />printf(“USER =%sn”,p);<br />setenv(“USER”,”test”,1);<br />printf(“USER=%sn”,getenv(“USEr”));<br />unsetenv(“USER”);<br />printf(“USER=%sn”,getenv(“USER”));<br />}<br /></font></td></tr><tr><td valign="top" width="80"><div align="right"><font face="宋体" size="2">执行 </font></div></td><td><font face="宋体" size="2">USER = root<br />USER = test<br />USER = (null)<br /></font></td></tr></tbody></table><img src ="http://www.cnitblog.com/guopingleee/aggbug/31468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-07 21:55 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/07/31468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(原创) Linux下的地址解析函数(res_*)的应用实例</title><link>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31453.html</link><dc:creator>向左向右走</dc:creator><author>向左向右走</author><pubDate>Tue, 07 Aug 2007 08:05:00 GMT</pubDate><guid>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31453.html</guid><wfw:comment>http://www.cnitblog.com/guopingleee/comments/31453.html</wfw:comment><comments>http://www.cnitblog.com/guopingleee/archive/2007/08/07/31453.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/guopingleee/comments/commentRss/31453.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/guopingleee/services/trackbacks/31453.html</trackback:ping><description><![CDATA[
		<div class="content" id="BodyLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
				<h2 align="center">
						<strong>(原创) Linux下的地址解析函数(res_*)的应用实例</strong>
				</h2>Linux下的地址解析函数应用实例<br />excel常用函数实例，vb调用api 函数实例，excel函数实例， <br />作者: 默难 ( monnand@gmail.com )<br /><br />0        引言<br />域名系统(DNS)是一种用于TCP/IP应用程序的分布式数据库, 它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息.[1] 目前, 它已经在全球范围内被广泛应用. 从应用的角度上看, 对DNS的访问是通过一个地址解析器(resolver)来完成的. 本文通过讲解一些常用的地址解析函数, 并利用精简后的部分qmail代码, 让不熟悉DNS相关函数的程序员了解并掌握常用的地址解析函数.<br />index函数应用实例， <br />1        概述<br />DNS查询中, 最常用的两类分别是A类查询(A query)和指针查询(PTR query). 前者是已知主机名, 询问IP; 后者是已知IP, 询问主机名. 对于这些查询, 在Unix主机中可以直接调用基本DNS函数: gethostbyname(3)和gethostbyaddr(3)来实现. 但是对于其他类型的查询(例如MX查询),linux下的sleep函数， 则没有专门的函数来负责处理. 此时, 程序员不得不依赖地址解析函数来亲自处理这些问题. 这需要对DNS报文格式有基本的了解, 这些将在下面几节进行说明. 关于gethostbyname(3)和gethostbyaddr(3)两个函数, 读者可以查阅自己系统上的man手册.<br /><br />2        DNS报文格式<br />在对地址解析函数讲解之前,linux下c解析xml， 有必要先了解一下DNS报文格式. 之后的几节会频繁地涉及到本节所讲的内容. 如果想对DNS相关协议有更深的了解, 可以阅读参考文献[1] [2] [3].<br /><br />DNS定义了一个用于查询和响应的报文格式, 图1 显示了这个报文的总体格式.<br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/monnand/Fig-1.jpg" border="0" /><br />linux下的应用程序， [图1]<br /><br />每个DNS查询(或响应)报文都包含有一个12字节长的首部和四个变长的字段组成.<br /><br />对于本文来说, 首部中主要关心的是问题数和资源记录数两个字段. 这两个字段分别用于说明各自对应的变长字段中的条目数. 问题数说明查询问题字段中的条目数; 资源记录数则说明回答字段中的条目数. 对于一个DNS查询报文, 问题数通常是1. 对于应答报文, 回答数至少是1.<br /><br />首部以下是四个变长字段,php在linux下的应用， 本文所关心的是查询问题字段和回答字段.<br /><br />查询问题字段可以包含多个查询问题, 每个问题的格式如图2 所示.<br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/monnand/Fig-2.jpg" border="0" /><br />[图2]<br /><br />其中, 查询名一项存储着要查找的名字. 它长度可变并以一种特殊的格式存储. 程序可以通过其中存储的内容确定其长度. 具体获得其中存储内容的方法, 将在下一节中进行详细讲解. 每一个问题有一个查询类型, 每个响应(下文中将会提到)也同样有一个类型. 常用的类型有: A类型---表示期望获得查询名的IP地址; PTR查询---表示期望获得一个IP地址对应的域名; MX查询---邮件交换查询(关于MX查询的具体内容, 下文会提到). 查询类指定了所使用的协议簇, 通常是1, 表示Internet地址.<br />linux下的应用软件， <br />回答字段可以包含多个条目. 每个回答字段是以一种叫做资源记录(Resource Record, RR)的格式存储的. ( 授权字段和额外信息字段也同样以资源记录的格式存储信息). 资源记录的格式如图3 所示.<br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/monnand/Fig-3.jpg" border="0" /><br />[图3]<br /><br />域名是记录中资源数据对应的名字. 它的格式和前面介绍的查询名字段格式相同. 类型和类字段和前面介绍的查询类型, 查询类字段的功能一样. 类字段的取值通常是1, 表示Internet地址. 生存时间字段是客户程序保留该资源记录的秒数. 资源数据长度说明资源数据包含的字节数. 资源数据则根据类型字段的值有不同的格式. 对于A类型, 资源数据是IP地址. 对于MX查询, 资源数据是优先值和域名, 域名的格式与查询名字段格式相同(MX记录的具体内容下文会有介绍).<br /><br />至此, DNS中用到的报文格式已经基本介绍完. 下一节中将会介绍一些常用的地址解析函数. 阅读下文时, 最好随时翻阅本节所讲的内容以便于理解.<br /><br />3        地址解析函数<br /><br />除了经常用到的gethostbyname(3)和gethostbyaddr(3)函数以外, Linux(以及其它UNIX/UNIX-like系统)还提供了一套用于在底层处理DNS相关问题的函数(这里所说的底层仅是相对gethostbyname和gethostbyaddr两个函数而言). 这套函数被称为地址解析函数(resolver functions). 用户可以通过键入man resolver来了解其中的具体信息. 这里将对其中常用到的函数做一个解释. 常用的地址解析函数原型如下:<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" href="http://www.preset.cn/###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code0" style="FONT-FAMILY: Fixdays">       #include &lt;netinet/in.h&gt;<br />       #include &lt;arpa/nameser.h&gt;<br />       #include &lt;resolv.h&gt;<br />       extern struct state _res;<br /><br />       int res_init(void);<br /><br />       int res_query(const char *dname, int class, int type,<br />              unsigned char *answer, int anslen);<br /><br />       int res_search(const char *dname, int class, int type,<br />              unsigned char *answer, int anslen);<br /><br />       int dn_expand(unsigned char *msg, unsigned char *eomorig,<br />              unsigned char *comp_dn,excel函数实例 pdf， unsigned char *exp_dn,<br />              int length);</div><br />_res: 这个结构体用于保存相关的状态信息. 它的定义在&lt;resolv.h&gt;中.<br /><br />res_init: 读取配置文件并修改环境变量:LOCALDOMAIN. 在调用其他地址解析函数前通常要先调用res_init. 如果执行成功, 函数返回0; 否则返回-1.<br /><br />res_query:  用来发出一个指定类(由参数class指定)和类型(由参数type指定)的DNS询问. dname是要查询的主机名. 返回信息被存储在answser指向的内存区域中. 信息的长度不能大于anslen个字节. 这个函数会创建一个DNS查询报文并把它发送到指定的DNS服务器.<br /><br />res_search: 和res_query的行为类似, 与res_query不同的是, 当域名中不包含点时, 会在域名后面加上默认域名; 同时, 支持递归查询(即当一个服务器没有存储询问的信息时, 会继续向其他服务器询问). 一般情况下尽量使用res_search. 因为它的成功几率会比较大.<br /><br />res_query和res_search函数返回值是响应报文的长度; 如果发生错误则返回-1.<br /><br />dn_expand: 上一节中已经说到, DNS报文中主机名是以一种特殊格式存储的. dn_expand函数则是将这种特殊格式存储的字符串还原成一般格式. msg参数值是整个DNS报文的首地址; eomorig参数指向DNS报文的最后一个字节后的一字节,api函数实例， 用于指定报文的结束位置; comp_dn参数指向报文中需要被还原的主机名的首地址; 还原后的主机名被存储在exp_dn指向的内存区域中, 长度不大于length个字节. 函数返回主机名在DNS报文中的长度(即被还原前的长度); 如果发生错误则返回-1.<br /><br />需要注意的是, 如果程序中用到了这些地址解析函数, 那么在编译的时候需要加上-lresolv选项才能正常编译.<br /><br />利用这些地址解析函数, 不仅可以完成A类查询或PTR查询, 还可以进行其他类型的询问. 下一节将给出利用地址解析函数进行MX查询的实例.<br /><br />4        地址解析函数应用实例---MX查询<br />在发送电子邮件时, 需要用到MX(Mail eXchange)记录. 一个电子邮箱的地址是 "用户名@域名" 的格式. 当要给某个用户发送电子邮件时, 首先需要从这个用户的电子邮箱地址中得到域名; 然后向DNS服务器发出一个MX查询, 询问该域名由哪些服务器负责处理.DNS服务器会返回处理该域名的服务器的主机名. 每个主机名对应一个16bit的整数值, 该值称为优先值(preference value), 如果一个域存在多条MX记录, 则首先使用优先值较小的主机名. 之后, 就是利用SMTP协议与相应的主机进行连接并发送邮件.<br /><br />如果要发出一个MX查询, 可以利用host命令:<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" href="http://www.preset.cn/###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code1" style="FONT-FAMILY: Fixdays">        [monnand@monnand-host ~]$ host -t mx gmail.com<br />        gmail.com mail is handled by 50 gsmtp183.google.com.<br />        gmail.com mail is handled by 5 gmail-smtp-in.l.google.com.<br />        gmail.com mail is handled by 10 alt1.gmail-smtp-in.l.google.com.<br />        gmail.com mail is handled by 10 alt2.gmail-smtp-in.l.google.com.<br />        gmail.com mail is handled by 50 gsmtp163.google.com.</div><br />-t 选项用于指明查询类型, -t mx表示发起一个MX查询. 后面的参数是要查询的域名(这里以gmail.com为例).<br />显示出的是关于查询域名的MX记录. 这里关于gmail.com的MX记录共5条, 每条记录都有相应的优先值(显示在主机名前面), 例如第一条记录的优先值是50.<br /><br />下面, 我们就利用前面讲到的地址解析函数来实现一个类似功能的程序. 即指定查询域名, 打印出关于这个域名的MX记录. 该程序的代码是从qmail的代码中精简出来的, 其中去掉了一些错误检测, 并修改了与qmail其他部分相关联的代码, 使整个程序能够独立出来(当然, 因为去掉了很多错误检测, 程序也失去了原有的健壮性和安全性). 但是整体的思路基本没有大的改动. 有兴趣的读者可以自己阅读qmail的源代码. 相信会有更多的收获.<br /><br />整个程序被写到了两个文件中, 分别名为dns.h和dns.c.<br /><br />以下是dns.h中的内容:<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" href="http://www.preset.cn/###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code2" style="FONT-FAMILY: Fixdays">1        #ifndef DNS_H <br />2        #define        DNS_H <br />3         <br />4        #define        DNS_MSG_END        -2 <br />5         <br />6        #define        dns_mx_query(str)        dns_resolve((str),T_MX) <br />7        #define        dns_mx_expand()                dns_findmx(T_MX) <br />8         <br />9        #define        foreach_mxrr(p,dn)        while(dns_mx_expand()!=DNS_MSG_END        \ <br />10                                                &amp;&amp;(!dns_get_mxrr(&amp;p,dn,MAXDNAME))) <br />11         <br />12        void dns_init(void); <br />13        int dns_get_mxrr(unsigned short *,unsigned char *,unsigned int); <br />14        int dns_resolve(char *,int); <br />15        int dns_findmx(int); <br />16         <br />17        #endif /* #ifndef MONNAND_DNS_H */ </div><br />该文件中声明了4个函数. 为了便于操作, 定义了三个宏. 关于其中具体的用法, 之后会有介绍. 下面给出dns.c中的源代码:<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" href="http://www.preset.cn/###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code3" style="FONT-FAMILY: Fixdays">1        #include &lt;stdio.h&gt; <br />2        #include &lt;stdlib.h&gt; <br />3        #include &lt;string.h&gt; <br />4        #include &lt;netdb.h&gt; <br />5        #include &lt;sys/types.h&gt; <br />6        #include &lt;netinet/in.h&gt; <br />7        #include &lt;arpa/nameser.h&gt; <br />8        #include &lt;resolv.h&gt; <br />9        #include &lt;errno.h&gt; <br />10         <br />11        #include "dns.h" <br />12         <br />13        extern int res_query(); <br />14        extern int res_search(); <br />15        extern int errno; <br />16        extern int h_errno; <br />17         <br />18        static unsigned short getshort(unsigned char *c) { unsigned short u; u = c[0]; return (u &lt;&lt; 8) + c[1]; } <br />19         <br />20        static union { HEADER hdr; unsigned char buf[PACKETSZ]; } response; <br />21        static int responselen; <br />22        static unsigned char *responseend; <br />23        static unsigned char *responsepos; <br />24        static int numanswers; <br />25        static char name[MAXDNAME]; <br />26        unsigned short pref; <br />27         <br />28        int dns_resolve(char *domain,int type) <br />29        { <br />30                int n; <br />31                int i; <br />32                errno=0; <br />33                if(NULL == domain) <br />34                        return -1; <br />35                responselen = res_search(domain,C_IN,type,response.buf,sizeof(response)); <br />36                if(responselen &lt;= 0) <br />37                        return -1; <br />38                if(responselen &gt;= sizeof(response)) <br />39                        responselen = sizeof(response); <br />40                responseend = response.buf + responselen; <br />41                responsepos = response.buf + sizeof(HEADER); <br />42                n = ntohs(response.hdr.qdcount); <br />43                while(n--&gt;0) <br />44                { <br />45                        i = dn_expand(response.buf,responseend,responsepos,name,MAXDNAME); <br />46                        responsepos += i; <br />47                        i = responseend - responsepos; <br />48                        if(i &lt; QFIXEDSZ) return -1; <br />49                        responsepos += QFIXEDSZ; <br />50                } <br />51                numanswers = ntohs(response.hdr.ancount); <br />52                return numanswers; <br />53        } <br />54         <br />55        int dns_findmx(int wanttype) <br />56        { <br />57                unsigned short rrtype; <br />58                unsigned short rrdlen; <br />59                int i; <br />60         <br />61                if(numanswers &lt;=0) return DNS_MSG_END; <br />62                numanswers--; <br />63                if(responsepos == responseend) return -1; <br />64                i = dn_expand(response.buf,responseend,responsepos,name,MAXDNAME); <br />65                if(i &lt; 0) return -1; <br />66                responsepos += i; <br />67                i = responseend - responsepos; <br />68                if(i &lt; 10) return -1; <br />69                rrtype = getshort(responsepos); <br />70                rrdlen = getshort(responsepos + 8); <br />71                responsepos += 10; <br />72                if(rrtype == wanttype) <br />73                { <br />74                        if(rrdlen &lt; 3) <br />75                                return -1; <br />76                        pref = (responsepos[0] &lt;&lt; 8) + responsepos[1]; <br />77                        memset(name,0,MAXDNAME); <br />78                        if(dn_expand(response.buf,responseend,responsepos + 2,name,MAXDNAME) &lt; 0) <br />79                                return -1; <br />80                        responsepos += rrdlen; <br />81                        return strlen(name); <br />82                } <br />83                responsepos += rrdlen; <br />84                return 0; <br />85        } <br />86         <br />87        void dns_init() <br />88        { <br />89                res_init(); <br />90                memset(name,0,MAXDNAME); <br />91        } <br />92         <br />93        int dns_get_mxrr(unsigned short *p,unsigned char *dn,unsigned int len) <br />94        { <br />95                *p = pref; <br />96                strncpy(dn,name,len); <br />97                if(len &lt; (strlen(name)+1)) <br />98                        return -1; <br />99                return 0; <br />100        } <br />101         <br />102        int main(int argc, char *argv[]) <br />103        { <br />104                char dname[MAXDNAME]; <br />105                int i; <br />106                unsigned short p; <br />107                dns_init(); <br />108                if(argc!=2) <br />109                { <br />110                        fprintf(stderr,"bad argument\n"); <br />111                        exit(-1); <br />112                } <br />113                i = dns_mx_query(argv[1]); <br />114                if(i&lt;0) <br />115                { <br />116                        fprintf(stderr,"err\n"); <br />117                        return 0; <br />118                } <br />119                printf("pref\tdomain name\n"); <br />120                foreach_mxrr(p,dname) <br />121                { <br />122                        printf("%d\t%s\n",p,dname); <br />123                } <br />124                return 0; <br />125        } </div><br />注释:<br />18: getshort函数从指定地址读取16bit网络字节顺序的数据, 并将其转换成little-endian的顺序返回.<br />20: 定义了一个联合体变量名为response, 用于存储DNS响应报文. HEADER是用于存储DNS首部的结构体, 定义在&lt;arpa/nameser_compat.h&gt;中(通常在/usr/include/arpa/nameser_compat.h中. &lt;arpa/nameser_compat.h&gt;这个头文件则在&lt;arpa/nameser.h&gt;中被include. 后面用到的很多宏都定义在&lt;arpa/nameser_compat.h&gt;这个头文件中). HEADER结构体中本文会用到的成员是dncount和ancout, 分别表示问题数和资源记录数(参见图1).PACKETSZ也定义在&lt;arpa/nameser_compat.h&gt;中, 这个宏表示一个报文的最大长度.<br />21-26: responselen是响应报文的长度. responseend指向了响应报文最后一个字节之后的一字节, 即response.buf+responselen. responsepos指向了即将处理的字段. numanswers是还未处理的回答数. name用来存储主机名, 长度是MAXDNAME个字节. MAXDNAME定义在&lt;arpa/nameser.h&gt;中, 表示域名的最大长度. pref用来存储MX记录的优先值.<br /><br />28: dns_resolve函数发起一个指定查询名(domain)和查询类型(type)的DNS查询. type可取的值在&lt;arpa/nameser_compat.h&gt;中定义成了宏. 这些宏都是以T_开头. 例如, A类查询的值是T_A. 对于MX查询, 则可以调用dns_resolve(domain,T_MX)(这也就是dns.h中, dns_mx_query这个宏所做的). 如果发生错误, 函数返回-1, 否则返回资源记录数(参见图1).<br />35: 利用res_search函数发起一条指定类型的DNS查询. 其中的参数C_IN表示Internet地址. C_IN这个宏也定义在&lt;arpa/nameser_compat.h&gt;中. 返回值赋给responselen, 即响应报文长度. <br />36: 检查是否有错误发生, 如果发生返回-1. 实际上这种错误检测是不完善的. 关于详细的错误检测方法可以参考qmail源代码中的dns.c文件.<br />40-42: 调整responseend和responsepos的值. 并将报文中的问题数存储在临时变量n中, 用于之后的处理. 由于响应报文中的数据都是网络字节顺序, 因此需要调用ntohs函数进行转换. ntohs函数的具体内容可以参考man手册.调整后, responsepos指向第一个查询问题的首地址.<br />43-50: 跳过所有的查询问题, 让responsepos指向第一个回答的首地址. 此时, 需要参考第二节中的内容来帮助理解. 首先利用dn_expand函数获得查询问题字段中查询名的长度, 并把该值赋给i. 之后, responsepos+=i使得responsepos指向了查询类型字段的首地址(参见图2). QFIXEDSZ宏定义在&lt;arpa/nameser_compat.h&gt;中, 其值等于4. 它表示DNS查询报文中问题部分的定长字段的字节数, 即查询类型和查询类两个字段的总长度. i = responseend - responsepos令i的值等于responsepos和responseend之间的距离, 由于此时responsepos指向问题部分查询类型的第一个字节, 因此, 对于一个正常的报文来说, i的值应该至少等于4. 因此, 在第48行进行了检测, 若i &lt; QFIXEDSZ, 表明该报文格式有错. 则返回-1. 否则, responsepos+=QFIXEDSZ. 此时, responsepos指向了下一个查询问题字段(或第一个回答字段)的首地址. 如此反复, 直至跳过全部的查询问题字段. 则循环执行完, responsepos指向第一个回答字段的首地址.<br />51-52: 将资源记录数的值赋给numanswers. 返回numansers.<br /><br />55: dns_findmx函数用于在调用了dns_resolve函数之后, 分析DNS响应报文中的回答字段. 如果当前responsepos指向的回答字段的类型是参数wanttype指定的类型, 则对该回答字段进行处理. 参数wanttype可取的值与dns_resolve函数中的type参数可取值一样. 对于MX记录, 值为T_MX. dns.h中dns_mx_expand宏的定义就是dns_findmx(T_MX). 该函数若发生错误则返回-1, 若报文中已经没有可以处理的字段, 则返回DNS_MSG_END. 否则返回name数组存储的字符串长度(不包括结尾的'\0').<br />61-62: 检查未处理的回答字段数目, 若达到或小于零, 则返回DNS_MSG_END. 否则numanswers值减一.<br />64: 回答字段是以资源记录格式存储的. 第一项是域名(参见图3). 因此用dn_expand函数将该字段还原为普通字符串格式. 并将返回的该字段长度赋值给i.<br />66: 调整responsepos的值, 使其跳过域名部分, 指向类型字段(参见图3).<br />67-68: 资源记录中, 定长字段的总长度为10字节,即类型, 类, 生存时间和资源数据长度字段的总长度(参见图3). 若responseend-responsepos的值小于10, 则表明该报文非法.<br />69-71: 此时responsepos指向了资源记录中类型字段的首地址. 利用getshort函数分别获得类型和资源数据长度字段的值, 存储在rrtype和rrdlen变量中. 之后,调整responsepos的值, 使其指向资源数据的首地址(参见图3). 对于一个MX查询, 资源数据中的内容是优先值和主机名.<br />72-82: 如果这条资源记录的类型是函数参数所指定的类型, 则对其进行处理. MX记录中, 资源数据内第一项存储着16bit的优先值, 之后存储着主机名. 优先值长度为2字节, 主机名长度至少1字节, 则资源数据长度至少要3字节. 否则报文格式为非法. 第74, 75行就是利用这种方法检测资源数据是否为非法. 第76行从资源数据中获得优先值存储在pref中. 由于报文中的优先值是按照网络字节顺序存储的, 因此需要将其转换成little-endian顺序后存到pref中. 接着对name数组清零. 之后从资源数据中提取主机名. responsepos+=rrdlen令responsepos指向了下一条资源数据. 最后利用strlen函数返回主机名的字符串长度.<br />83: 该资源记录的类型与参数指定类型不符, 则跳过该条记录, 将responsepos调整至下一条资源记录.<br /><br />87-91: 调用res_init函数执行相关初始化操作. 并对name数组清零. 此处没有对res_init的返回值进行检测.<br /><br />93-100: dns_get_mxrr函数将pref的值(优先值)存储到p指向的地址中, 并将name中存储的主机名复制到dn指向的地址中, 复制的长度不超过len个字节. 如果len个字节不足以存储整个主机名, 则返回-1, 否则返回0.<br /><br />102: main函数, argv[1]中会存储着要查询的域名.<br />104-106: dname用于存储查找到的主机名. 变量i用于存储相关函数的返回值. p用于存储优先值.<br />108-112: 用户提供的参数有错误.<br />113: 利用dns.h中定义的宏, 发起MX查询. 该语句相当与i = dns_resolve(argv[1],T_MX);<br />120: 利用dns.h中定义的宏, 对响应报文中的每条资源记录进行处理. foreach_mxrr宏在dns.h中定义, 该语句相当于while(dns_findmx(T_MX)!=DNS_MSG_END&amp;&amp;(!dns_get_mxrr(&amp;p,dname,MAXDNAME)))<br />121-124: 打印每条资源记录后函数返回.<br /><br />该程序在Magic Linux 2.0正式版上编译成功( 内核版本2.6.15.3; gcc版本3.4.4; i386体系结构 ).编译和运行结果如下:<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" href="http://www.preset.cn/###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code4" style="FONT-FAMILY: Fixdays">        [monnand@monnand-host src]$ gcc -lresolv dns.c -o dns<br />        [monnand@monnand-host src]$ ./dns gmail.com<br />        pref    domain name<br />        50      gsmtp163.google.com<br />        50      gsmtp183.google.com<br />        5       gmail-smtp-in.l.google.com<br />        10      alt1.gmail-smtp-in.l.google.com<br />        10      alt2.gmail-smtp-in.l.google.com</div><br />5        后记<br />本文简要介绍了DNS报文格式, 讲解了常用的地址解析函数并给出了这些函数的应用实例. 第4节中的代码可以应用在其他程序内, 但是使用前最好对其进行一定的修改从而增强健壮性和安全性. 修改时可以参考qmail的源代码中dns.c和dns.h两个文件. 如果想了解更多的地址解析函数, 可以查阅man resolver. 如果想对DNS相关的协议及报文格式有更深的了解, 可以查阅附录中的参考文献.<br /><br />附录        参考文献<br />[1]W. Richard Stevens.TCP/IP详解 卷1：协议.北京:机械工业出版社.1993.<br />[2]Mockapetris, P. V. "Domain Names: Concepts and Facilities," RFC 1034. 1987<br />[3]Mockapetris, P. V. "Domain Names: Implementation and Specification," RFC1035. 1987[/code]</div>
<img src ="http://www.cnitblog.com/guopingleee/aggbug/31453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/guopingleee/" target="_blank">向左向右走</a> 2007-08-07 16:05 <a href="http://www.cnitblog.com/guopingleee/archive/2007/08/07/31453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>