<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[敏老板的咸菜缸]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[站在巨人的肩上，学习linux点点滴滴记录，转贴居多。自己写的原创在这里和linuxeden都有发布。]]></description>
<link>http://hi.baidu.com/mgqw</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[linux面试题目--2（转）]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/b84222ecbf99893727979158.html]]></link>
        <description><![CDATA[
		
		<p><br>
102． B 命令是在vi编辑器中执行存盘退出。<br>
A :q B<font style="background-color: rgb(255, 255, 128);">ZZ</font>C :q! D :WQ<br>
103．下列关于/etc/fstab文件描述，正确的是 D 。<br>
A fstab文件只能描述属于linux的文件系统 B CD_ROM和软盘必须是自动加载的<br>
C fstab文件中描述的文件系统不能被卸载 D 启动时按fstab文件描述内容加载文件系统<br>
104．通过文件名存取文件时，文件系统内部的操作过程是通过 C 。<br>
A 文件在目录中查找文件数据存取位置。B 文件名直接找到文件的数据，进行存取操作。<br>
<u>C 文件名在目录中查找对应的I节点，通过I节点存取文件数据。</u><br>
D 文件名在中查找对应的超级块，在超级块查找对应i节点，通过i节点存取文件数据<br>
105．Linux将存储设备和输入/输出设备均看做文件来操作， C 不是以文件的形式出现。<br>
A 目录 B 软链接 C i节点表 D 网络适配器<br>
106．关于i节点和超级块，下列论述不正确的是 B 。<br>
A i节点是一个长度固定的表 B 超级块在文件系统的个数是唯一的<br>
C i节点包含了描述一个文件所必需的全部信息<br>
D 超级块记录了i节点表和空闲块表信息在磁盘中存放的位置<br>
107． D 设备是字符设备。<br>
A hdc B fd0 C hda1 D tty1(A,B,C为块设备)<br>
108． B 目录存放着Linux的源代码。<br>
A /etc B /usr/src C /usr D /home<br>
109．关于文件系统的安装和卸载，下面描述正确的是 A 。<br>
A 如果光盘未经卸载，光驱是打不开的 B 安装文件系统的安装点只能是/mnt下<br>
C 不管光驱中是否有光盘，系统都可以安装CD-ROM设备<br>
D mount /dev/fd0 /floppy 此命令中目录/floppy是自动生成的<br>
110． B 不是进程和程序的区别。<br>
A 程序是一组有序的静态指令，进程是一次程序的执行过程<br>
B 程序只能在前台运行，而进程可以在前台或后台运行<br>
C 程序可以长期保存，进程是暂时的<br>
D 程序没有状态，而进程是有状态的<br>
111．文件exer1的访问权限为rw-r--r--，现要增加所有用户的执行权限和同组用户的写权限，下列命令正确的是 A 。<br>
<u>A chmod a+x g+w exer1</u>B chmod 765 exer1<br>
C chmod o+x exer1 D chmod g+w exer1<br>
112．有关归档和压缩命令，下面描述正确的是 C 。<br>
A 用uncompress命令解压缩由compress命令生成的后缀为.zip的压缩文件<br>
B unzip命令和gzip命令可以解压缩相同类型的文件<br>
C tar归档且压缩的文件可以由gzip命令解压缩<br>
D tar命令归档后的文件也是一种压缩文件<br>
113．不是shell具有的功能和特点的是 C 。<br>
A 管道 B 输入输出重定向 C 执行后台进程 D 处理程序命令<br>
114．下列对shell变量FRUIT操作，正确的是： C 。<br>
A 为变量赋值：$FRUIT=apple B 显示变量的值：fruit=apple<br>
C 显示变量的值：echo $FRUIT D 判断变量是否有值：[ -f “$FRUIT” ]<br>
三．简答题：<br>
1．简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。<br>
参考答案：<br>
Linux通过i节点表将文件的逻辑结构和物理结构进行转换。<br>
i 节点是一个64字节长的表，表中包含了文件的相关信息，其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。在i节点表中最重要 的内容是<font color="#ff0000">磁盘地址表</font>。在磁盘地址表中有13个块号，文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。Linux文件系统通过把i节点和文件名进行 连接，当需要读取该文件时，文件系统在当前目录表中查找该文件名对应的项，由此得到该文件相对应的i节点号，<font color="#ff0000">通过该i节点的磁盘地址表把分散存放的文件物 理块连接成文件的逻辑结构。</font></p>
<p>2．简述进程的启动、终止的方式以及如何进行进程的查看。<br>
参考答案：<br>
在Linux中启动一个进程有手工启动和调度启动两种方式：<br>
（1）手工启动<br>
用户在输入端发出命令，直接启动一个进程的启动方式。可以分为：<br>
①前台启动：直接在SHELL中输入命令进行启动。<br>
②后台启动：启动一个目前并不紧急的进程，如打印进程。<br>
（2）调度启动<br>
系统管理员根据系统资源和进程占用资源的情况，事先进行调度安排，指定任务运行的时间和场合，到时候系统会自动完成该任务。<br>
经常使用的进程调度命令为：at、batch、crontab。<br>
3. 简述DNS进行域名解析的过程。<br>
参考答案：<br>
首先，客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后：<br>
（1）检查DNS服务器的缓存，若查到请求的地址或名字，即向客户机发出应答信息；<br>
（2）若没有查到，则在数据库中查找，若查到请求的地址或名字，即向客户机发出应答信息；<br>
（3）若没有查到，则将请求发给根域DNS服务器，并依序从根域查找顶级域，由顶级查找二级域，二级域查找三级，直至找到要解析的地址或名字，即向客户机所在网络的DNS服务器发出应答信息，DNS服务器收到应答后现在缓存中存储，然后，将解析结果发给客户机。<br>
（4）若没有找到，则返回错误信息。</p>
<p>4．系统管理员的职责包括那些？管理的对象是什么？<br>
参考答案：<br>
系统管理员的职责是进行系统资源管理、设备管理、系统性能管理、安全管理和系统性能监测。管理的对象是服务器、用户、服务器的进程及系统的各种资源等。<br>
5．简述安装Slackware Linux系统的过程。<br>
参考答案：<br>
（1）对硬盘重新分区。 （2）启动Linux系统（用光盘、软盘等）。<br>
（3）建立Linux主分区和交换分区。（4）用setup命令安装Linux系统。<br>
（5）格式化Linux主分区和交换分区（6）安装Linux软件包<br>
（7）安装完毕，建立从硬盘启动Linux系统的LILO启动程序，或者制作一张启动Linux系统的软盘。重新启动Linux系统。<br>
6．什么是静态路由，其特点是什么？什么是动态路由，其特点是什么？<br>
参考答案：<br>
静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场合，且网络拓朴结构不经常变化的网络。其缺点是不能动态地适用网络状况的变化，当网络状况变化后必须由网络管理员修改路由表。<br>
动态路由是由路由选择协议而动态构建的，路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容。动态路由可以自动<a nclick="javascript.:tagshow(event, '%D1%A7%CF%B0');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">学习</font></strong></u></a></strong></u>网络的拓朴结构，并更新路由表。其缺点是路由广播更新信息将占据大量的网络带宽。<br>
87．进程的查看和调度分别使用什么命令？<br>
参考答案：<br>
进程查看的命令是ps和top。<br>
进程调度的命令有at，crontab，batch，kill。<br>
8．当文件系统受到破坏时，如何检查和修复系统？<br>
参考答案：<br>
成功修复文件系统的前提是要有两个以上的主文件系统，并保证在修复之前首先卸载将被修复的文件系统。<br>
使 用命令fsck对受到破坏的文件系统进行修复。fsck检查文件系统分为5步，每一步检查系统不同部分的连接特性并对上一步进行验证和修改。在执行 fsck命令时，检查首先从超级块开始，然后是分配的磁盘块、路径名、目录的连接性、链接数目以及空闲块链表、i-node。<br>
9．解释i节点在文件系统中的作用。<br>
参考答案：<br>
在linux文件系统中，是以块为单位存储信息的，为了找到某一个文件在存储空间中存放的位置，用i节点对一个文件进行索引。I节点包含了描述一个文件所必须的全部信息。所以i节点是文件系统管理的一个数据结构。<br>
10．什么是符号链接，什么是硬链接？符号链接与硬链接的区别是什么？<br>
参考答案：<br>
链接分硬链接和符号链接。<br>
符号链接可以建立对于文件和目录的链接。符号链接可以跨文件系统，即可以跨磁盘分区。符号链接的文件类型位是l，链接文件具有新的i节点。<br>
硬链接不可以跨文件系统。它只能建立对文件的链接，硬链接的文件类型位是－，且硬链接文件的i节点同被链接文件的i节点相同。<br>
11．在对linux系统分区进行格式化时需要对磁盘簇（或i节点密度）的大小进行选择，请说明选择的原则。<br>
参考答案：<br>
磁盘簇（或i节点密度）是文件系统调度文件的基本单元。磁盘簇的大小，直接影响系统调度磁盘空间效率。当磁盘分区较大时，磁盘簇也应选得大些；当分区较小时，磁盘簇应选得小些。通常使用经验值。<br>
12．简述网络文件系统NFS，并说明其作用。<br>
参考答案：<br>
网 络文件系统是应用层的一种应用服务，它主要应用于Linux和Linux系统、Linux和Unix系统之间的文件或目录的共享。对于用户而言可以通过 NFS方便的访问远地的文件系统，使之成为本地文件系统的一部分。采用NFS之后省去了登录的过程，方便了用户访问系统资源。</p>
<p>13．某/etc/fstab文件中的某行如下：<br>
/dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2<br>
请解释其含义。<br>
参考答案:<br>
（1）第一列：将被加载的文件系统名；（2）第二列：该文件系统的安装点；<br>
（3）第三列：文件系统的类型；（4）第四列：设置参数；<br>
（5）第五列：供备份程序确定上次备份距现在的天数；<br>
（6）第六列：在系统引导时检测文件系统的顺序。<br>
14．Apache服务器的配置文件httpd.conf中有很多内容，请解释如下配置项：<br>
（1）MaxKeepAliveRequests 200 （2）UserDir public_html<br>
（3）DefaultType text/plain （4）AddLanguare en.en<br>
（5）DocumentRoot“/usr/local/httpd/htdocs”<br>
（6）AddType application/x-httpd-php.php.php.php4<br>
参考答案:<br>
（1）允许每次连接的最大请求数目，此为200；（2）设定用户放置网页的目录；<br>
（3）设置服务器对于不认识的文件类型的预设格式；<br>
（4）设置可传送语言的文件给浏览器；（5）该目录为Apache放置网页的地方；<br>
（6）服务器选择使用php4。<br>
15．某Linux主机的/etc/rc.d/rc.inet1文件中有如下语句，请修正错误，并解释其内容。<br>
/etc/rc.d/rc.inet1：<br>
……<br>
ROUTE add –net default gw 192.168.0.101 netmask 255.255.0.0 metric 1<br>
ROUTE add –net 192.168.1.0 gw 192.168.0.250 netmask 255.255.0.0 metric 1<br>
参考答案:<br>
修正错误:<br>
（1）ROUTE应改为小写：route；（2）netmask 255.255.0.0应改为:netmask 255.255.255.0；<br>
（3）缺省路由的子网掩码应改为:netmask 0.0.0.0；<br>
（4）缺省路由必须在最后设定,否则其后的路由将无效。<br>
解释内容:<br>
（1）route：建立静态路由表的命令；（2）add：增加一条新路由；<br>
（3）-net 192.168.1.0：到达一个目标网络的网络地址；<br>
（4）default：建立一条缺省路由；（5）gw 192.168.0.101：网关地址；<br>
（6）metric 1：到达目标网络经过的<a nclick="javascript.:tagshow(event, '%C2%B7%D3%C9%C6%F7');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">路由器</font></strong></u></a></strong></u>数（跳数）。</p>
<p>16．试解释apache服务器以下配置的含义：<br>
（1）port 1080 （2）UserDir userdoc<br>
（3）DocumentRoot “/home/htdocs”<br>
（4）&lt;Directory /home/htdocs/inside&gt;;<br>
Options Indexes FollowSymLinks<br>
AllowOverride None<br>
Order deny,allow<br>
deny from all<br>
allow from 192.168.1.5<br>
&lt;/Directory&gt;;<br>
（5）Server Type Standlone<br>
参考答案：<br>
Apache服务器配置行含义如下：<br>
（1）将apache服务器的端口号设定为1080；<br>
（2）设定用户网页目录为userdoc；<br>
（3）设定apache服务器的网页根目录:/home/htdocs；<br>
（4）在此apache服务器上设定一个目录/home/htdocs/inside，且此目录只允许IP地址为192.168.1.5的主机访问；<br>
（5）定义apache服务器以独立进程的方式运行。<br>
17．简述使用ftp进行文件传输时的两种登录方式？它们的区别是什么？常用的ftp文件传输命令是什么？<br>
参考答案：<br>
（1）ftp有两种登录方式：匿名登录和授权登录。使用匿名登录时，用户名为：anonymous，密码为：任何合法email地址；使用授权登录时，用户名为用户在远程系统中的用户帐号，密码为用户在远程系统中的用户密码。<br>
区别：使用匿名登录只能访问ftp目录下的资源，默认配置下只能下载；而授权登录访问的权限大于匿名登录，且上载、下载均可。<br>
（2）ftp文件传输有两种文件传输模式：ASCII模式和binary模式。ASCII模式用来传输文本文件，其他文件的传输使用binary模式。<br>
（3）常用的ftp文件传输命令为：bin、asc、put、get、mput、mget、prompt、bye</p>
<p><font size="2">四．编程与应用题：<br>
1．用Shell编程，判断一文件是不是字符设备文件，如果是将其拷贝到 /dev 目录下。<br>
参考程序：<br>
#!/bin/sh<br>
FILENAME=<br>
echo “Input file name：”<br>
read FILENAME<br>
if [ -c &quot;$FILENAME&quot; ]<br>
then<br>
cp $FILENAME /dev<br>
fi<br>
2．请下列shell程序加注释，并说明程序的功能和调用方法：#!/bin/sh<br>
#!/bin/sh<br>
#<br>
# /etc/rc.d/rc.httpd<br>
#<br>
# Start/stop/restart the Apache web server.<br>
#<br>
# To make Apache start automatically at boot, make this<br>
# file executable: chmod 755 /etc/rc.d/rc.httpd<br>
#<br>
case &quot;$1&quot; in<br>
'start')<br>
/usr/sbin/apachectl start ;;<br>
'stop')<br>
/usr/sbin/apachectl stop ;;<br>
'restart')<br>
/usr/sbin/apachectl restart ;;<br>
*)<br>
echo &quot;usage $0 start|stop|restart&quot; ;;<br>
esac<br>
参考答案：<br>
（1）程序注释<br>
#!/bin/sh 定义实用的shell<br>
#<br>
# /etc/rc.d/rc.httpd 注释行，凡是以星号开始的行均为注释行。<br>
#<br>
# Start/stop/restart the Apache web server.<br>
#<br>
# To make Apache start automatically at boot, make this</font></p>
<p><br>
<font size="2"># file executable: chmod 755 /etc/rc.d/rc.httpd<br>
#<br>
case &quot;$1&quot; in #case结构开始，判断“位置参数”决定执行的操作。本程序携带一个“位置参数”，即$1<br>
'start') #若位置参数为start<br>
/usr/sbin/apachectl start ;; #启动httpd进程<br>
'stop') #若位置参数为stop<br>
/usr/sbin/apachectl stop ;; #关闭httpd进程<br>
'restart') #若位置参数为stop<br>
/usr/sbin/apachectl restart ;; #重新启动httpd进程<br>
*) #若位置参数不是start、stop或restart时<br>
echo &quot;usage $0 start|stop|restart&quot; ;; #显示命令提示信息：程序的调用方法<br>
esac #case结构结束<br>
（2）程序的功能是启动，停止或重新启动httpd进程<br>
（3）程序的调用方式有三种：启动，停止和重新启动。<br>
3．设计一个shell程序，添加一个新组为class1，然后添加属于这个组的30个用户，用户名的形式为stdxx，其中xx从01到30。<br>
参考答案：<br>
#!/bin/sh<br>
i=1<br>
groupadd class1<br>
while [ $i -le 30 ]<br>
do<br>
if [ $i -le 9 ] ;then<br>
USERNAME=stu0${i}<br>
else<br>
USERNAME=stu${i}<br>
fi<br>
useradd $USERNAME<br>
mkdir /home/$USERNAME<br>
chown -R $USERNAME /home/$USERNAME<br>
chgrp -R class1 /home/$USERNAME<br>
i=$(($i+1))<br>
done</font></p>
<p><font size="2">4．编写shell程序，实现自动删除50个账号的功能。账号名为stud1至stud50。<br>
参考程序：<br>
#!/bin/sh<br>
i=1<br>
while [ $i -le 50 ]<br>
do<br>
userdel -r stud${i}<br>
i=$(($i+1 ))<br>
done<br>
5．某系统管理员需每天做一定的重复工作，请按照下列要求，编制一个解决<a nclick="javascript.:tagshow(event, '%B7%BD%B0%B8');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">方案</font></strong></u></a></strong></u>：<br>
（1）在下午4 :50删除/abc目录下的全部子目录和全部文件；<br>
（2）从早8:00～下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入到/backup目录下的bak01.txt文件内；<br>
（3）每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件：backup.tar.gz；<br>
（4）在下午5:55将IDE接口的CD-ROM卸载（假设：CD-ROM的设备名为hdc）；<br>
（5）在早晨8:00前开机后启动。<br>
参考答案:<br>
解决方案：<br>
（1）用vi创建编辑一个名为prgx的crontab文件；<br>
（2）prgx文件的内容：<br>
50 16 * * * rm -r /abc/*<br>
0 8-18/1 * * * cut -f1 /xyz/x1 &gt;;&gt;; /backup/bak01.txt<br>
50 17 * * * tar zcvf backup.tar.gz /data<br>
55 17 * * * umount /dev/hdc<br>
（3）由超级用户登录，用crontab执行 prgx文件中的内容：<br>
</font><a href="mailto:root@xxx:#crontab"><font size="2" color="#0000ff">root@xxx:#crontab</font></a><font size="2">prgx；在每日早晨8:00之前开机后即可自动启动crontab。<br>
6．设计一个shell程序，在每月第一天备份并压缩/etc目录的所有内容，存放在/root/bak目录里，且文件名为如下形式yymmdd_etc，yy为年，mm为月，dd为日。Shell程序fileback存放在/usr/bin目录下。<br>
参考答案：<br>
（1）编写shell程序fileback：<br>
#!/bin/sh<br>
DIRNAME=`ls /root | grep bak`<br>
if [ -z &quot;$DIRNAME&quot; ] ; then<br>
mkdir /root/bak<br>
cd /root/bak<br>
fi<br>
YY=`date +%y`<br>
MM=`date +%m`<br>
DD=`date +%d`<br>
BACKETC=$YY$MM$DD_etc.tar.gz<br>
tar zcvf $BACKETC /etc<br>
echo &quot;fileback finished!&quot;<br>
（2）编写任务定时器：<br>
echo &quot;0 0 1 * * /bin/sh /usr/bin/fileback&quot; &gt;; /root/etcbakcron<br>
crontab /root/etcbakcron<br>
或使用crontab -e 命令添加定时任务：<br>
0 1 * * * /bin/sh /usr/bin/fileback<br>
7．有一普通用户想在每周日凌晨零点零分定期备份/user/backup到/tmp目录下，该用户应如何做？<br>
参考答案：（1）第一种方法：<br>
用户应使用crontab –e 命令创建crontab文件。格式如下：<br>
0 0 * * sun cp –r /user/backup /tmp<br>
（2）第二种方法：<br>
用户先在自己目录下新建文件file，文件内容如下：<br>
0 * * sun cp –r /user/backup /tmp<br>
然后执行 crontab file 使生效。<br>
8.设计一个Shell程序，在/userdata目录下建立50个目录，即user1～user50，并设置每个目录的权限，其中其他用户的权限为：读；文件所有者的权限为：读、写、执行；文件所有者所在组的权限为：读、执行。<br>
参考答案: 建立程序 Pro16如下：<br>
#!/bin/sh<br>
i=1<br>
while [ i -le 50 ]<br>
do<br>
if [ -d /userdata ];then<br>
mkdir -p /userdata/user$i<br>
chmod 754 /userdata/user$i<br>
echo &quot;user$i&quot;<br>
let &quot;i = i + 1&quot; （或i=$（（$i＋1））<br>
else<br>
mkdir /userdata<br>
mkdir -p /userdata/user$i<br>
chmod 754 /userdata/user$i<br>
echo &quot;user$i&quot;<br>
let &quot;i = i + 1&quot; （或i=$（（$i＋1））<br>
fi<br>
done<br>
</font></p>
<p><font size="2"><span style="font-weight: bold;">五、多选题</span><br>
1．关于硬链接的描述正确的（BE）。<br>
A 跨文件系统 B不可以跨文件系统 D可以做目录的连接<br>
C 为链接文件创建新的i节点 E链接文件的i节点同被链接文件的i节点<br>
2．在网站发布用户wang的个人网页时，需要创建用户网页目录，假定用户网页目录设定为web<br>
（用户目录在/home目录下），如下描述正确的是（BCE）<br>
A 存放用户网页的绝对路径/wang/web B存放用户网页的目录～wang/<br>
C 存放用户网页的绝对路径/home/wang/web D存放用户网页的绝对路径/home/web<br>
E 在本机访问用户wang的个人网页的URL地址http://localhost/～wang/<br>
3．在一台WWW服务器上将端口号设定为8000，默认的网页文件index.html，服务器网页的根目录/www。在本机访问服务器时，正确的用法是（BDE）<br>
A 浏览器访问该服务器的URL地址http://localhost/<br>
B 浏览器访问该服务器的URL地址http://localhost:8000/<br>
C 浏览器访问该服务器的用户li网页URL地址http://localhost/~li<br>
D 浏览器访问该服务器的用户li网页URL地址http://localhost:8000/~li<br>
E 浏览器访问该服务器的URL地址localhost:8000/<br>
4．在shell编程中关于$2的描述正确的是（CE）<br>
A 程序后携带了两个位置参数 B 宏替换 C 程序后面携带的第二个位置参数<br>
D 携带位置参数的个数 E 用$2引用第二个位置参数<br>
5．某文件的权限是 - r w x r - - r- -，下面描述正确的是(CD)<br>
A 文件的权限值是755 B 文件的所有者对文件只有读权 限<br>
C 文件的权限值是 744 D 其他用户对文件只有读权限 E同组用户对文件只有写权限<br>
6．关于OpenSSH的作用的描述正确的是（ACE）<br>
A 开放源代码的安全加密程序 B OpenSSH常用于为http协议加密<br>
C OpenSSH用于提高远程登录访问的安全性 D 它和telnet实用同样的端口号<br>
E OpenSSH是免费下载的应程序<br>
7．关于NFS服务器描述正确的是（BC）<br>
A 网络中实现Windows系统之间文件系统共享的应用软件<br>
B 网络中实现Linux系统之间文件系统共享的应用软件<br>
C 网络中实现Unix系统之间文件系统共享的应用软件<br>
D 网络中实现Windows系统和Unix之间文件系统共享的应用软件<br>
E 网络中实现Windows系统和Linux之间文件系统共享的应用软件<br>
8．关于sed描述正确的是（ABD）<br>
A sed 是Linux系统中的流编辑器 B sed 是UNIX系统中的流编辑器<br>
C sed 网络文件系统的类型 D 利用管道对标准输入/标准输入的数据进行编辑和组合<br>
E sed是NFS的应用程序<br>
9．关于限制磁盘限额，描述正确的是（ABD）<br>
A 使用edquota可以监控系统所有用户使用的磁盘空间，并在接近极限时提示用户<br>
B 用户组的磁盘限额是用户组内所有用户予设磁盘空间总和<br>
C 单个用户的磁盘限额就是该用户所在用户组内所有磁盘限额的总合<br>
D 在Linux系统下限制用户使用的磁盘空间可以使用edquota<br>
E 用户组的磁盘限额就是该用户组内拥有最大磁盘限额值的用户的磁盘限额<br>
10．关于建立系统用户的正确描述是（）<br>
A 在Linux系统下建立用户使用adduser命令<br>
B 每个系统用户分别在/etc/passwd和/etc/shadow文件中有一条记录<br>
C 访问每个用户的工作目录使用命令“cd /用户名”<br>
D 每个系统用户在默认状态下的工作目录在/home/用户名<br>
E 每个系统用户在/etc/fstab文件中有一条记录</font></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/b84222ecbf99893727979158.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-29  14:43</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/b84222ecbf99893727979158.html</guid>
</item>

<item>
        <title><![CDATA[linux面试题目--1（转）]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/f409d3dae1a8e1d1b7fd485f.html]]></link>
        <description><![CDATA[
		
		<p>一．填空题：<br>
1. 在<a target="_self" href=" :;" ><u><strong><font color="#800080">Linux</font></strong></u></a><a target="_self" href=" :;" ><u><strong><font color="#800080">系统</font></strong></u></a>中，以<strong><a nclick="javascript.:tagshow(event, '%CE%C4%BC%FE');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">文件</font></strong></u></a></strong></u></strong>方式访问设备 。<br>
2. Linux内核引导时，从文件<font color="#ff0000"><strong>/etc/fstab</strong></font>中读取要加载的文件<a nclick="javascript.:tagshow(event, '%CF%B5%CD%B3');" target="_self" href=" .:;"><u><strong><font color="#0000ff">系统</font></strong></u></a>。<br>
3. Linux文件系统中每个文件用<strong><font color="#ff0000">i节点</font></strong>来标识。<br>
<font style="background-color: rgb(255, 255, 128);">4. 全部磁盘块由四个部分组成，分别为<font color="#ff0000"><strong>引导块 、专用块 、 i节点表块 和<a nclick="javascript.:tagshow(event, '%CA%FD%BE%DD');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">数据</font></strong></u></a></strong></u>存储块</strong></font></font>。<br>
5. 链接分为：<font color="#ff0000"><strong>硬链接 和 符号链接</strong></font>。<br>
6. 超级块包含了<font color="#ff0000"><strong>i节点表 和 空闲块表</strong></font>等重要的文件系统信息。<br>
<font style="background-color: rgb(255, 255, 128);">7. 某文件的权限为：d-rw-_r--_r--，用数值形式表示该权限，则该八进制数为：<font color="#ff0000"><strong>644</strong></font>，该文件属性是<font color="#ff0000"><strong>目录</strong></font>。<br>
</font>8. 前台起动的进程使用<font color="#ff0000"><strong>Ctrl+c</strong></font>终止。<br>
9. 静态<a nclick="javascript.:tagshow(event, '%C2%B7%D3%C9');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">路由</font></strong></u></a></strong></u>设定后，若<a nclick="javascript.:tagshow(event, '%CD%F8%C2%E7');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">网络</font></strong></u></a></strong></u>拓扑结构发生变化，需由<font color="#ff0000"><strong>系统<a nclick="javascript.:tagshow(event, '%B9%DC%C0%ED');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">管理</font></strong></u></a></strong></u>员</strong></font>修改路由的<a nclick="javascript.:tagshow(event, '%C9%E8%D6%C3');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">设置</font></strong></u></a></strong></u>。<br>
10. 网络管理的重要任务是：<font color="#ff0000"><strong>控制 和 监控</strong></font>。<br>
11. 安装Linux系统对硬盘分区时，必须有两种分区类型：<font color="#ff0000"><strong>文件系统分区 和 交换分区</strong></font>。<br>
<font style="background-color: rgb(255, 255, 128);">13. 编写的<a nclick="javascript.:tagshow(event, 'Shell');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">Shell</font></strong></u></a></strong></u>程序运行前必须赋予该脚本文件<font color="#ff0000"><strong>执行</strong></font>权限。</font><br>
14. 系统管理的任务之一是能够在<strong><font color="#ff0000">分布式</font></strong>环境中实现对程序和数据的安全保护、备份、恢复和更新。<br>
<font style="background-color: rgb(255, 255, 128);">15. 系统交换分区是作为系统<font color="#ff0000"><strong>虚拟存储器</strong></font>的一块区域</font><font style="background-color: rgb(255, 255, 128);">。<br>
</font>16. 内核分为<font color="#ff0000"><strong>进程管理系统 、 内存管理系统 、 I/O管理系统 和文件管理系统</strong></font>等四个子系统。<br>
17. 内核配置是系统管理员在改变系统配置<font color="#ff0000"><strong>硬件</strong></font>时要进行的重要操作。<br>
<font style="background-color: rgb(255, 255, 128);">18. 在安装Linux系统中，使用netconfig程序对网络进行配置，该安装程序会一步步提示<a nclick="javascript.:tagshow(event, '%D3%C3%BB%A7');" target="_self" href=" .:;"><u><strong><font color="#0000ff">用户</font></strong></u></a>输入主机名、域名、域名<a nclick="javascript.:tagshow(event, '%B7%FE%CE%F1%C6%F7');" target="_self" href=" .:;"></a><u><strong><a nclick="javascript.:tagshow(event, '%B7%FE%CE%F1');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">服务</font></strong></u></a></strong></u>器</strong></u>、IP地址、<font color="#ff0000"><strong>网关地址</strong>和<strong>子网掩码</strong></font>等必要信息。</font><br>
<font style="background-color: rgb(255, 255, 128);">19. 唯一标识每一个用户的是<font color="#ff0000">用户<strong>ID</strong>和用户名</font>。</font><br>
20 .<strong><font color="#ff0000">RIP</font></strong><a nclick="javascript.:tagshow(event, '%D0%AD%D2%E9');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">协议</font></strong></u></a></strong></u>是最为普遍的一种内部协议，一般称为<font color="#ff0000">动态路由信息协议</font>。<br>
21. 在Linux系统中所有内容都被表示为文件，组织文件的各种方法称为<font color="#ff0000"><strong>文件系统</strong></font>。<br>
22. DHCP可以实现<strong>动态</strong>IP 地址分配。<br>
23. 系统网络管理员的管理对象是<a target="_self" href=" :;" ><u><strong><font color="#800080">服务器</font></strong></u></a>、<strong>用户</strong>和服务器的进程 以及系统的各种资源。<br>
24. 网络管理通常由<strong>监测、传输和管理</strong>三部分组成，其中管理部分是整个网络管理的中心。<br>
25.<font style="background-color: rgb(255, 255, 128);">当想删除本系统用不上的<strong>设备驱动程序</strong>时必须编译内核，当内核不支持系统上的<strong>设备驱动程序</strong>时，必须对内核<strong>升级</strong>。</font><br>
26 Ping命令可以测试网络中本机系统是否能到达<strong>一台远程主机</strong>，所以常常用于测试网络的 连通性 。<br>
27. vi编辑器具有两种工作模式：<strong><a nclick="javascript.:tagshow(event, '%C3%FC%C1%EE');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">命令</font></strong></u></a></strong></u>模式 和 输入模式</strong>。<br>
28. 可以用ls –al命令来观察文件的权限，每个文件的权限都用10位表示，并分为四段，其中第一段占 1 位，表示 文件类型 ，第二段占3位，表示<strong>文件所有者</strong>对该文件的权限。<br>
29. 进程与程序的区别在于其动态性，动态的产生和终止，从产生到终止进程可以具有的基本状态为：<strong>运行态 、 就绪态 和 等待态（阻塞态） 。<br>
</strong>30. DNS实际上是分布在internet上的主机信息的<a nclick="javascript.:tagshow(event, '%CA%FD%BE%DD%BF%E2');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">数据库</font></strong></u></a></strong></u>，其作用是实现<strong>IP地址和主机名</strong>之间的转换。<br>
31. Apache是实现WWW服务器<a nclick="javascript.:tagshow(event, '%B9%A6%C4%DC');" target="_self" href=" .:;"><u><strong><font color="#0000ff">功能</font></strong></u></a>的<a nclick="javascript.:tagshow(event, '%D3%A6%D3%C3');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">应用</font></strong></u></a></strong></u>程序，即通常所说的“浏览web服务器”，在服务器端<strong>为用户提供浏览 web服务</strong>的就是apache应用程序。<br>
32.<font style="background-color: rgb(255, 255, 128);">在Linux系统上做备份可以有两种类型：<strong>系统备份</strong>和<strong>用户备份</strong></font>。其中前者是指对<strong><a nclick="javascript.:tagshow(event, '%B2%D9%D7%F7%CF%B5%CD%B3');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">操作系统</font></strong></u></a></strong></u></strong>的备份，后者是指对<strong>应用程序和用户文件的备份</strong>。<br>
33. CD-ROM标准的文件系统类型是<strong>iso9660</strong>。<br>
34. 当lilo.conf配置完毕后，使之生效，应运行的命令及参数是<strong>lilo</strong>。<br>
35. 在使用ls命令时，用八进制形式显示非打印字符应使用参数<strong>-b</strong>。<br>
36. Linux使用支持<a nclick="javascript.:tagshow(event, 'Windows');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">Windows</font></strong></u></a></strong></u>9.x/2000长文件名的文件系统的类型是 vfat 。<br>
<font style="background-color: rgb(255, 255, 128);">37. 设定限制用户使用磁盘<a nclick="javascript.:tagshow(event, '%BF%D5%BC%E4');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">空间</font></strong></u></a></strong></u>的命令是<strong>quota</strong>。<br>
</font>38 在Linux系统中，用来存放系统所需要的配置文件和子目录的目录是<strong>/etc</strong>。<br>
39. 硬连接只能建立对<strong>文件</strong>链接。符号链接可以跨不同文件系统创建。<br>
40. 套接字文件的属性位是<strong>s</strong>。<br>
41. 结束后台进程的命令是<strong>kill</strong>。<br>
<font style="background-color: rgb(255, 255, 128);">42. 进程的运行有两种方式，即<strong>独立运行和使用父进程运行</strong>。</font><br>
43. Links分为<strong>硬链接和符号链接</strong>。<br>
<font style="background-color: rgb(255, 255, 128);">44. 在超级用户下显示Linux系统中正在运行的全部进程，应使用的命令及参数是<strong>ps -aux</strong></font>。<br>
45. 管道文件的属性位是<strong>p</strong>。<br>
46. 将前一个命令的标准输出作为后一个命令的标准输入，称之为<strong>管道</strong>。<br>
4<font style="background-color: rgb(255, 255, 128);">7. 为脚本程序指定执行权的命令及参数是<strong>chmod a+x filename</strong></font>。<br>
48. 进行远程登录的命令是<strong>telnet</strong>。<br>
49. 欲发送10个分组报文测试与主机abc.tuu.edu.cn的连通性，应使用的命令和参数是：<strong>ping abc.tuu.edu.cn –c 10 。<br>
</strong><font style="background-color: rgb(255, 255, 128);">50. DNS服务器的进程命名为named，当其启动时，自动装载 /etc目录下的 named.conf 文件中定义的DNS分区数据库文件。<br>
</font><font style="background-color: rgb(255, 255, 128);">51. Apache服务器进程配置文件是<strong>httpd.conf</strong></font>。</p>
<p>52.在 Linux系统中，压缩文件后生成后缀为.gz文件的命令是<strong>gzip</strong>。<br>
53. 在用vi编辑文件时，将文件内容存入test.txt文件中，应在命令模式下键入 ：<strong>w test.txt</strong>。<br>
54 可以在标准输出上显示整年日历的命令及参数是<strong>cal -y</strong>。<br>
<font style="background-color: rgb(255, 255, 128);">55. 在shell编程时，使用方括号表示测试条件的规则是：方括号两边必须有<strong>空格</strong>。</font><br>
56. 检查已安装的文件系统/dev/had5是否正常，若检查有错，则自动修复，其命令及参数是<font style="background-color: rgb(255, 255, 128);"><strong>fsck –a /dev/had</strong>5 。<br>
</font>57. 在Windows9.x环境下共享Unix/Linux中的用户目录的一个工具是<strong>Samba</strong>服务器 。<br>
58. 系统管理员的职责是进行系统资源管理、系统性能管理、设备管理、安全管理和<strong>系统性能监测</strong>。<br>
<font style="background-color: rgb(255, 255, 128);">59 在Linux系统中，测试DNS服务器是否能够正确<a nclick="javascript.:tagshow(event, '%BD%E2%CE%F6');" target="_self" href=" .:;"><u><strong><font color="#0000ff">解析</font></strong></u></a>域名的的客户端命令，使用命令<strong>nslookup</strong></font>。<br>
60. 在Linux系统下，第二个IDE通道的硬盘（从盘）被标识为<strong>hdb</strong>。<br>
61. 当系统管理员需升级内核版本和改变系统硬件配置时，应<strong>重新编译内核</strong>。<br>
<font style="background-color: rgb(255, 255, 128);">62. 如果只是要修改系统的IP地址，应修改<strong>/etc/rc.d/rc.inet1</strong>配置文件。</font><br>
<font style="background-color: rgb(128, 255, 128);">63. 当LAN内没有条件建立DNS服务器，但又想让局域网内的用户可以使用计算机名互相访问时，应配置<strong>/etc/hosts</strong>文件。<br>
</font>64. 在vi编辑环境下，使用<strong>Esc键</strong>进行模式转换。<br>
65. Slackware Linux 9.0通常使用<strong>ext3</strong>文件系统，系统的全部磁盘块由<strong>四</strong>部分组成。<br>
66. 将/home/stud1/wang目录做归档压缩，压缩后生成wang.tar.gz文件，并将此文件保存到/home目录下，实现此任务的tar命令格式<strong>tar zcvf /home/wang.tar.gz /home/stud1/wang</strong>。<br>
67. 管道就是将前一个命令的 标准输出 作为后一个命令的<strong>标准输入</strong>。<br>
<font style="background-color: rgb(255, 255, 128);">68. 在使用手工的方法配置网络时，可通过修改<strong>/etc/HOSTNAME</strong>文件来改变主机名，若要配置该计算机的域名解析客户端，需配置<strong>/etc/resolv.conf</strong>文件。<br>
</font><font style="background-color: rgb(255, 255, 128);">69. 启动进程有手动启动和调度启动两种方法，其中调度启动常用的命令为 at 、 batch 和 crontab</font>。<br>
70. test.bns.com.cn的域名是<strong>bns.com.cn</strong>，<font style="background-color: rgb(255, 255, 128);">如果要配置一域名服务器，应在<strong>named.conf</strong>文件中定义DNS数据库的工作目录。<br>
</font>71. Sendmail邮件系统使用的两个主要协议是：<strong><font style="background-color: rgb(255, 255, 128);">SMTP 和 POP</font></strong>，前者用来发送邮件,后者用来接收邮件。<br>
72. DHCP是动态主机配置协议的简称，其作用是：<strong><font style="background-color: rgb(255, 255, 128);">为网络中的主机分配IP地址</font></strong>。<br>
73. 目前代理服务器使用的软件包有很多种，教材中使用的是<strong>squid</strong>。<br>
74. rm命令可删除文件或目录，其主要差别就是是否使用递归开关<strong>-r或-R</strong>。<br>
75.<strong>mv</strong>命令可以移动文件和目录，还可以为文件和目录重新命名。<br>
76. 路由<a nclick="javascript.:tagshow(event, '%D1%A1%D4%F1');" target="_self" href=" .:;"><u><strong><font color="#0000ff">选择</font></strong></u></a>协议（RIP）的跳数表示到达目的地之前必须通过的<strong>网关</strong>数，RIP接受的最长距离是<strong>15跳</strong>。<br>
77. ping命令用于测试网络的连通性，<font style="background-color: rgb(255, 255, 128);">ping命令通过<strong>ICMP</strong>协议（internet控制信息协议）来实现。<br>
</font>78.<strong>nfs 协议</strong>用于实现<a nclick="javascript.:tagshow(event, 'Unix');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">Unix</font></strong></u></a></strong></u>（/linux）主机之间的文件系统共享。<br>
79. 在Linux操作系统中，设备都是通过特殊的<strong>文件</strong>来访问。<br>
80. shell不仅是<strong>用户命令的解释器</strong>，它同时也是一种功能强大的编程语言。 bash是Linux的缺省shell。<br>
81. 用<strong>&gt;;&gt;;</strong>符号将输出重定向内容附加在原文的后面。<br>
82. 增加一个用户的命令是：<strong>adduser 或useradd</strong>。<br>
83 进行字符串查找，使用<strong>grep</strong>命令。<br>
84. 使用<strong>*</strong>每次匹配若干个字符。<br>
85.<strong>/sbin</strong>目录用来存放系统管理员使用的管理程序。</p>
<p>二．单项选择题:<br>
1. 下面的网络协议中，面向连接的的协议是： A 。<br>
A 传输控制协议 B 用户数据报协议 C 网际协议 D 网际控制报文协议<br>
2. 在/etc/fstab文件中指定的文件系统加载参数中，<font style="background-color: rgb(255, 255, 128);">D</font>参数一般用于CD-ROM等移动设备。<br>
A defaults B sw C rw和ro D noauto<br>
3. Linux文件权限一共10位长度，分成四段，第三段表示的内容是 C 。<br>
A 文件类型 B 文件所有者的权限<br>
C 文件所有者所在组的权限 D 其他用户的权限<br>
4. 终止一个前台进程可能用到的命令和操作 B 。<br>
A kill B &lt;CTRL&gt;;+C C shut down D halt<br>
<font style="background-color: rgb(255, 255, 128);">5．</font>在使用mkdir命令创建新的目录时，在其父目录不存在时先创建父目录的选项是 D 。<br>
A -m B -d C -f D -p<br>
<font style="background-color: rgb(255, 255, 128);">6. 下面关于i节点描述错误的是 A</font><font color="#cc3333"><strong>。（inode是一种数据结构，vfs中描述文件的相关参数？？）<br>
</strong></font>A i节点和文件是一一对应的<br>
B i节点能描述文件占用的块数<br>
C i节点描述了文件大小和指向数据块的指针<br>
D 通过i节点实现文件的逻辑结构和物理结构的转换<br>
<font style="background-color: rgb(255, 255, 128);">7. 一个文件名字为rr.Z，可以用来解压缩的命令是： D 。<br>
A tar B gzip C compress D uncompress<br>
</font><font style="background-color: rgb(128, 255, 128);">8. 具有很多C语言的功能，又称过滤器的是 C 。<br>
</font>A csh<br>
B tcsh<br>
<strong>C awk</strong>　　（<a target="_blank" href="http://www.itisedu.com/phrase/200603021801255.html"><font color="#800080">awk详解</font></a>）<br>
D sed<br>
9. 一台主机要实现通过局域网与另一个局域网通信，需要做的工作是 C 。</p>
<p>A 配置域名服务器<br>
B 定义一条本机指向所在网络的路由<br>
<u>C 定义一条本机指向所在网络网关的路由<br>
</u>D 定义一条本机指向目标网络网关的路由<br>
<font style="background-color: rgb(255, 255, 128);">10. 建立动态路由需要用到的文件有 D</font>。<br>
A /etc/hosts B /etc/HOSTNAME C /etc/resolv.conf D /etc/gateways<br>
<font style="background-color: rgb(255, 255, 128);">11. 局域网的网络地址192.168.1.0/24，局域网络连接其它网络的网关地址是192.168.1.1。主机192.168.1.20访问172.16.1.0/24网络时，其路由设置正确的是 B</font>。<br>
A route add –net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0 metric 1<br>
B route add –net 172.16.1.0 gw 192.168.1.1 netmask 255.255.255.255 metric 1<br>
C route add –net 172.16.1.0 gw 172.16.1.1 netmask 255.255.255.0 metric 1<br>
D route add default 192.168.1.0 netmask 172.168.1.1 metric 1<br>
12. 下列提法中，不属于ifconfig命令作用范围的是 D 。<br>
A 配置本地回环地址 B 配置网卡的IP地址<br>
C 激活网络适配器 D 加载网卡到内核中<br>
13. 下列关于链接描述，错误的是 B 。<br>
A 硬链接就是让链接文件的i节点号指向被链接文件的i节点<br>
B 硬链接和符号连接都是产生一个新的i节点<br>
C 链接分为硬链接和符号链接 D 硬连接不能链接目录文件<br>
14. 在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同，而不能与公网连通，问题可能是 C。<br>
A 主机IP设置有误<br>
B 没有设置连接局域网的网关<br>
C 局域网的网关或主机的网关设置有误<br>
D 局域网DNS服务器设置有误<br>
15. 下列文件中，包含了主机名到IP地址的映射关系的文件是： B 。<br>
A /etc/HOSTNAME B /etc/hosts C /etc/resolv.conf D /etc/networks<br>
16. 不需要编译内核的情况是 D 。<br>
A 删除系统不用的设备驱动程序时 B 升级内核时<br>
C 添加新硬件时 D 将网卡激活<br>
17. 在shell中变量的赋值有四种方法，其中，采用name=12的方法称 A 。<br>
A 直接赋值 B使用read命令<br>
C 使用命令行参数 D使用命令的输出<br>
18. D 命令可以从文本文件的每一行中截取指定内容的数据。<br>
A cp B dd C fmt D cut<br>
19. 下列不是Linux系统进程类型的是 D 。<br>
A 交互进程 B 批处理进程 C 守护进程 D 就绪进程（进程状态）<br>
20．配置Apache 1.3.19服务器需要修改的配置文件为___A______<br>
A httpd.conf B access.conf C srm.conf D named.conf<br>
21. 内核不包括的子系统是 D 。<br>
A 进程管理系统 B 内存管理系统 C I/O管理系统 D硬件管理系统<br>
22． 在日常管理中，通常CPU会影响系统性能的情况是： A 。<br>
A CPU已满负荷地运转 B CPU的运行效率为30%<br>
C CPU的运行效率为50% D CPU的运行效率为80%<br>
23． 若一台计算机的内存为128MB，则交换分区的大小通常是 C 。<br>
A 64MB B 128MB C 256MB D 512MB<br>
24． 在安装Linux的过程中的第五步是让用户选择安装方式，如果用户希望安装部分组件（软件程序），并在选择好后让系统自动安装，应该选择的选项是 D 。<br>
A full B expert C newbie D menu<br>
25． Linux有三个查看文件的命令，若希望在查看文件内容过程中可以用光标上下移动来查看文件内容，应使用 C 命令。<br>
A cat B more C less D menu<br>
26． 下列信息是某系统用ps –ef命令列出的正在运行的进程， D 进程是运行Internet超级服务器，它负责监听Internet sockets上的连接，并调用合适的服务器来处理接收的信息。<br>
A root 1 4.0 0.0 344 204? S 17:09 0:00 init<br>
B root 2 0.0 0.1 2916 1520? S 17:09 0:00 /sbin/getty<br>
C root 3 0.0 0.2 1364 632? S 17:09 0:00 /usr/sbin/syslogd<br>
D root 4 0.0 1344 1204? S 17:09 0:10 /usr/sbin/inetd<br>
27．在TCP/IP模型中，应用层包含了所有的高层协议，在下列的一些应用协议中， B 是能够实现本地与远程主机之间的文件传输工作。<br>
A telnet B FTP C SNMP D NFS<br>
28．当我们与某远程网络连接不上时，就需要跟踪路由查看，以便了解在网络的什么位置出现了问题，满足该目的的命令是 C 。<br>
A ping B ifconfig C traceroute D netstat<br>
29．对名为fido的文件用chmod 551 fido 进行了修改，则它的许可权是 D 。<br>
A -rwxr-xr-x B -rwxr--r-- C -r--r--r-- D -r-xr-x—x<br>
30． 在i节点表中的磁盘地址表中，若一个文件的长度是从磁盘地址表的第1块到第11块，则该文件共占有 B 块号。<br>
A 256 B 266 C 11 D 256×10<br>
<strong><font color="#990000">(??)</font></strong>31． 用ls –al 命令列出下面的文件列表， D 文件是符号连接文件。<br>
A -rw-rw-rw- 2 hel-s users 56 Sep 09 11:05 hello<br>
B -rwxrwxrwx 2 hel-s users 56 Sep 09 11:05 goodbey<br>
C drwxr--r-- 1 hel users 1024 Sep 10 08:10 zhang</p>
<p>D<font style="background-color: rgb(128, 255, 255);">l</font>rwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng<br>
32． DNS域名系统主要负责主机名和 A 之间的解析。<br>
A IP地址 B MAC地址 C 网络地址 D 主机别名<br>
33． WWW服务器是在Internet上使用最为广泛，它采用的是 B 结构。<br>
A 服务器/工作站 B<font style="background-color: rgb(255, 255, 128);">B/S</font>C 集中式 D 分布式<br>
34．Linux系统通过 C 命令给其他用户发消息。<br>
A less B mesg y C write D echo to</p>
<p>[ 注：mesg [y|n] 所有使用者 决定是否允许其他人传讯息到自己的终端机介面 ]<br>
<br>
<br>
35．NFS是 C 系统。<br>
A 文件 B 磁盘 C 网络文件 D 操作<br>
36． B 命令可以在Linux的安全系统中完成文件向磁带备份的工作。<br>
A cp B<font style="background-color: rgb(255, 153, 153);">tr</font>C dir D cpio</p>
<p>[注：<font color="#333333">如果用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等类似的命令来显示路径信息的话，我们看到的将会是一大堆用冒号连接在一起的路径， tr 命令可以把这些冒号转换为回车，这样，这些路径就具有很好的可读性了：<br>
echo $PATH | tr &quot;:&quot; &quot;\n&quot;</font>]<br>
37．Linux文件系统的文件都按其作用分门别类地放在相关的目录中，对于外部设备文件，一般应将其放在 C 目录中。<br>
A /bin B /etc C /dev D /lib<br>
38．在重新启动Linux系统的同时把内存中的信息写入硬盘，应使用 D 命令实现。<br>
A # reboot B # halt C # reboot D # shutdown –r now<br>
39．网络管理具备以下几大功能：配置管理、 A 、性能管理、安全管理和计费管理等。<br>
A<a nclick="javascript.:tagshow(event, '%B9%CA%D5%CF');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">故障</font></strong></u></a></strong></u>管理 B 日常备份管理 C 升级管理 D 发送邮件<br>
40．关于代理服务器的论述，正确的是 A 。<br>
A 使用internet上已有的公开代理服务器，只需配置客户端。<br>
B 代理服务器只能代理客户端http的请求。<br>
C 设置好的代理服务器可以被网络上任何主机使用。<br>
D 使用代理服务器的客户端没有自己的ip地址。<br>
41.关闭linux系统（不重新启动）可使用命令 B 。<br>
A Ctrl+Alt+Del B halt C shutdown -r now D reboot<br>
42．实现从IP地址到以太网MAC地址转换的命令为： C 。<br>
A ping B ifconfig C<font style="background-color: rgb(255, 153, 153);">arp</font>D traceroute<br>
43．在vi编辑器中的命令模式下，键入 B 可在光标当前所在行下添加一新行。<br>
A &lt;a&gt;; B &lt;o&gt;; C &lt;I&gt;; D A<br>
44．在vi编辑器中的命令模式下，删除当前光标处的字符使用 A 命令。<br>
A &lt;x&gt;; B &lt;d&gt;;&lt;w&gt;; C &lt;D&gt;; D &lt;d&gt;;&lt;d&gt;;<br>
45．在vi编辑器中的命令模式下，重复上一次对编辑的文本进行的操作，可使用 C 命令。<br>
A 上箭头 B 下箭头<font style="background-color: rgb(255, 255, 128);">C &lt;.&gt;;</font>D &lt;*&gt;;<br>
46．用命令ls -al显示出文件ff的描述如下所示，由此可知文件ff的类型为 A 。<br>
-rwxr-xr-- 1 root root 599 Cec 10 17:12 ff<br>
A 普通文件 B 硬链接 C 目录 D 符号链接<br>
47．删除文件命令为： D 。<br>
A mkdir B rmdir C mv D rm<br>
48．在下列的名称中，不属于DNS服务器类型的是：____C_____<br>
A Primary Master Server B Secondary Master Server<br>
C samba D Cache_only Server<br>
49．网络管理员对WWW服务器进行访问、控制存取和运行等控制，这些控制可在 A 文件中体现。<br>
A httpd.conf B lilo.conf C inetd.conf D resolv.conf<br>
50．邮件转发代理也称邮件转发服务器，它可以使用SMTP协议，也可以使用 C 协议。<br>
A FTP B<a nclick="javascript.:tagshow(event, 'TCP');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">TCP</font></strong></u></a></strong></u>C UUCP D POP<br>
51．启动samba服务器进程，可以有两种方式：独立启动方式和父进程启动方式，其中前者是在 C 文件中以独立进程方式启动。<br>
A /usr/sbin/smbd B /usr/sbin/nmbd C<u>rc.samba</u>D /etc/inetd.conf<br>
52．DHCP是动态主机配置协议的简称，其作用是可以使网络管理员通过一台服务器来管理一个网络系统，自动地为一个网络中的主机分配___D______地址。<br>
A 网络 B MAC C TCP D IP<br>
53．为了保证在启动服务器时自动启动DHCP进程，应将 A文件中的dhcpd=no改为dhcpd=yes。<br>
A<u>rc.inet1</u>B lilo.conf C inetd.conf D httpd.conf</p>
<p>[注：<span class="top11">英文原义：RC</span></p>
<p><span class="top11">中文释义：含有程序（应用程序甚至操作系统）启动指令的脚本文件</span></p>
<p>注解：这一文件在操作系统启动时会自动执行，它含有要运行的指令（命令或其它脚本）列表。]</p>
<p><br>
54．对文件进行归档的命令为 D 。<br>
A dd B cpio C gzip D tar<br>
55．改变文件所有者的命令为 C 。<br>
A chmod B touch C chown D cat<br>
56．在给定文件中查找与设定条件相符字符串的命令为： A 。<br>
A grep B gzip C find D sort<br>
57．建立一个新文件可以使用的命令为 D 。<br>
A chmod B more C cp D<u>touch</u>(指令改变档案的时间记录。)<br>
58．在下列命令中，不能显示文本文件内容的命令是： D 。<br>
A more B less C tail D join<br>
59．在使用匿名登录ftp时，用户名为 B 。<br>
A users B anonymous C root D guest<br>
60．在实际操作中，想了解命令logname 的用法，可以键入 D 得到帮助。<br>
A logname --man B logname/？ C help logname D logname --help<br>
61．如果LILO被安装在MBR，使用 A 命令即可卸载LILO。<br>
A lilo –u B lilo –c C lilo –v D lilo -V<br>
62．当用命令ls –al查看文件和目录时，欲观看卷过屏幕的内容，应使用组合键 D 。<br>
A Shift+Home B Ctrl+ PgUp C Alt+ PgDn D Shift+ PgUp<br>
63．mc是UNIX风格操作系统的 C 。<br>
A 文件编辑器/程序编译器 B 配置网络的窗口工具<br>
C 目录浏览器/文件管理器 D Samba服务器管理工具<br>
64．<u>i节点是一个 D 长的表</u>，表中包含了文件的相关信息。</p>
<p>A 8字节 B 16字节 C 32字节 D 64字节<br>
65．文件权限读、写、执行的三种标志符号依次是 A 。<br>
A rwx B xrw C rdx D srw<br>
66．<u>Linux 文件名的长度不得超过 C 个字符。<br>
</u>A 64 B 128 C 256 D 512<br>
67．进程有三种状态： C 。<br>
A 准备态、执行态和退出态 B 精确态、模糊态和随机态<br>
C 运行态、就绪态和等待态 D 手工态、自动态和自由态<br>
68． 从后台启动进程，应在命令的结尾加上符号 A 。<br>
A &amp; B @ C # D $<br>
69． B 不是邮件系统的组成部分。<br>
A 用户代理<u>B 代理服务器</u>C 传输代理 D 投递代理<br>
70．在Shell脚本中，用来读取文件内各个域的内容并将其赋值给Shell变量的命令是 D 。<br>
A fold B join C tr D read<br>
71<font style="background-color: rgb(255, 255, 128);">．crontab文件由六个域组成</font>，每个域之间用空格分割，其排列如下： B 。<br>
A MIN HOUR DAY MONTH YEAR COMMAND<br>
B MIN HOUR DAY MONTH DAYOFWEEK COMMAND<br>
C COMMAND HOUR DAY MONTH DAYOFWEEK<br>
D COMMAND YEAR MONTH DAY HOUR MIN</p>
<p>crontab命令：实现程序定时运行</p>
<p><br>
72．用ftp进行文件传输时，有两种模式： C 。<br>
A Word和binary B .txt和Word Document<br>
C ASCII和binary D ASCII和Rich Text Format<br>
73．某文件的组外成员的权限为只读；所有者有全部权限；组内的权限为读与写，则该文件的权限为 D 。<br>
A 467 B 674 C 476 D 764<br>
74．<font style="background-color: rgb(255, 255, 128);">在DNS系统测试时，设named进程号是53，命令 D 通知进程重读配置文件。</font><br>
A kill –USR2 53 B kill –USR1 53 C kill -INT 63 D kill –HUP 53<br>
75．Apache服务器默认的接听连接端口号是 C 。<br>
A 1024 B 800 C 80 (http)D 8<br>
76．<a target="_self" href=" :;" ><u><strong><font color="#800080">PHP</font></strong></u></a>和<a nclick="javascript.:tagshow(event, 'MySQL');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">MySQL</font></strong></u></a></strong></u>的联合使用<a nclick="javascript.:tagshow(event, '%BD%E2%BE%F6');" target="_self" href=" .:;"></a><u><strong><a target="_self" href=" :;" ><u><strong><font color="#800080">解决</font></strong></u></a></strong></u>了 C 。<br>
A 在Proxy上处理数据库的访问问题 B 在WWW服务器上处理黑客的非法访问问题<br>
C 在WWW服务器上处理数据库的访问问题<br>
D 在Sendmail邮件系统上处理数据库的访问问题<br>
77．OpenSSL是一个 A 。<br>
A 加密软件 B 邮件系统 C 数据库管理系统 D 嵌入式脚本编程语言<br>
78．Samba服务器的配置文件是 D 。<br>
A httpd.conf B inetd.conf C rc.samba D smb.conf<br>
79．关于DNS服务器，叙述正确的是 D 。<br>
A DNS服务器配置不需要配置客户端<br>
B 建立某个分区的DNS服务器时只需要建立一个主DNS服务器<br>
C 主DNS服务器需要启动named进程，而辅DNS服务器不需要<br>
D DNS服务器的root.cache文件包含了根名字服务器的有关信息<br>
80．退出交互模式的shell，应键入 C 。<br>
A &lt;Esc&gt;; B ^q C exit D quit<br>
81．将Windows C:盘(hda1)安装在Linux文件系统的/winsys目录下，命令是 B 。<br>
A<a href="mailto:root@l04.edu.cn:%7E#mount"><font color="#0000ff">root@l04.edu.cn:~#mount</font></a>dev/had1 /winsys<br>
B<a href="mailto:root@l04.edu.cn:%7E#mount"><font color="#0000ff">root@l04.edu.cn:~#mount</font></a>/dev/had1 /winsys<br>
C<a href="mailto:root@l04.edu.cn:%7E#mount"><font color="#0000ff">root@l04.edu.cn:~#mount</font></a>/dev/had1 winsys<br>
D<a href="mailto:root@l04.edu.cn:%7E#mount"><font color="#0000ff">root@l04.edu.cn:~#mount</font></a>dev/had1 winsys<br>
82．设超级用户root当前所在目录为：/usr/local，键入cd命令后，用户当前所在目录为 B 。<br>
A /home B /root C /home/root D /usr/local<br>
83．字符设备文件类型的标志是 B 。<br>
A p B c C s D l<br>
84．将光盘CD-ROM（hdc）安装到文件系统的/mnt/cdrom目录下的命令是 C 。<br>
A mount /mnt/cdrom B mount /mnt/cdrom /dev/hdc<br>
<u>C mount /dev/hdc /mnt/cdrom</u>D mount /dev/hdc<br>
85．将光盘/dev/hdc卸载的命令是 C 。<br>
A umount /dev/hdc B unmount /dev/hdc<br>
C umount /mnt/cdrom /dev/hdc D unmount /mnt/cdrom /dev/hdc<br>
86．在/home/stud1/wang目录下有一文件file，使用 D 可实现在后台执行命令，此命令将file文件中的内容输出到file.copy文件中。<br>
A cat file &gt;;file.copy B cat &gt;;file.copy C cat file file.copy &amp; D cat file &gt;;file.copy &amp;<br>
87．在DNS配置文件中，用于表示某主机别名的是： B 。<br>
A NS B CNAME C NAME D CN<br>
88．可以完成主机名与IP地址的正向解析和反向解析任务的命令是： A 。<br>
A<u>nslookup</u>B arp C ifconfig D dnslook<br>
89．下列变量名中有效的shell变量名是： C 。<br>
A -2-time B _2$3 C trust_no_1 D 2004file<br>
90．qmail是 B 。<br>
A 收取邮件的协议 B 邮件服务器的一种 C 发送邮件的协议 D 邮件队列<br>
92．已知某用户stud1，其用户目录为/home/stud1。分页显示当前目录下的所有文件的文件或目录名、用户组、用户、文件大小、文件或目录权限、文件创建时间等信息的命令是 D 。<br>
A more ls –al B more –al ls C more &lt; ls –al D ls –al | more<br>
93．关于进程调度命令， B 是不正确的。at--定期执行程序的调度命令<br>
A 当日晚11点执行clear命令，使用at命令：at 23:00 today clear</p>
<p>B 每年1月1日早上6点执行date命令，使用at命令：at 6am Jan 1 date<br>
C 每日晚11点执行date命令，crontab文件中应为：0 23 * * * date<br>
D 每小时执行一次clear命令，crontab文件中应为：0 */1 * * * clear<br>
94．系统中有用户user1和user2，同属于users组。在user1用户目录下有一文件file1，它拥有644的权限，如果user2用户想修改user1用户目录下的file1文件，应拥有 B 权限。<br>
A 744 B 664 C 646 D 746<br>
??95．如果想配置一台匿名ftp服务器，应修改 C 文件。<br>
A /etc/gateway B /etc/ftpservers C /etc/ftpusers D /etc/inetd.conf<br>
96．Samba服务器的进程由B 两部分组成 。<br>
A named和sendmail B<u>smbd和nmbd</u>C bootp和dhcpd D httpd和squid<br>
97．要配置NFS服务器，在服务器端主要配置 C 文件。<br>
A /etc/rc.d/rc.inet1 B /etc/rc.d/rc.M<u>C /etc/exports</u>D /etc/rc.d/rc.S<br>
98．为保证在启动服务器时自动启动DHCP进程，应对 B 文件进行编辑。<br>
A /etc/rc.d/rc.inet2<u>B /etc/rc.d/rc.inet1</u>C /etc/dhcpd.conf D /etc/rc.d/rc.S<br>
99．在配置代理服务器时，若设置代理服务器的工作缓存为64MB，配置行应为 D 。<br>
A cache 64MB B cache_dir ufs /usr/local/squid/cache 10000 16 256<br>
C cache_ mgr 64MB D<u>cache_ mem 64MB</u><br>
100．安全管理涉及的问题包括保证网络管理工作可靠进行的安全问题和保护网络用户及网络管理对象问题。 C 属于安全管理的内容。<br>
A 配置设备的工作参数 B 收集与网络性能有关的数据<br>
C 控制和维护访问权限 D 监测故障<br>
101．以下命令对中，正确的是： B 。<br>
A ls和sl B cat和tac C more和erom D exit和tixe</p>
<p><u>cat是显示文件夹的命令，这个大家都知道，tac是cat的倒写，意思也和它是相反的。cat是从第一行显示到最后一行，而tac是从最后一行显示到第一行，而rev 则是从最后一个字符显示到第一个字符</u></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/f409d3dae1a8e1d1b7fd485f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-29  14:43</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/f409d3dae1a8e1d1b7fd485f.html</guid>
</item>

<item>
        <title><![CDATA[宏定义[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/b1eff00ec0ed04c07bcbe193.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://hi.baidu.com/ufo008ahw/blog/item/5e943d4f5f49513caec3abd1.html<br>
<br>
<br>
<div class="cnt" ><font size="3">宏定义有<strong>无参数宏定义</strong>和<strong>带参数宏定义</strong>两种。<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> <strong>无参数的宏定义的一般形式为<br>
</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong>&#160;</strong><wbr></wbr><strong> # define 标识符 字符序列</strong><br>
其中# define之后的标识符称为宏定义名(简称宏名)，要求宏名与字符序列之间用空格符分隔。这种宏定义要求编译预处理程序将源程序中随后所有的定名的出现(注释与字符串常量中的除外)均用字符序列替换之。前面经常使用的定义符号常量是宏定义的最简单应用。如有：<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define TRUE 1<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define FALSE 0<br>
则在定义它们的源程序文件中，凡定义之后出现的单词TRUE将用1替代之；出现单词FALSE将用0替代之。<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 在宏定义的＃之前可以有若干个空格、制表符，但不允许有其它字符。宏定义在源程序中单独另起一行，换行符是宏定义的结束标志。如果一个宏定义太长，一行不 够时，<font color="#ff0000"><strong>可采用续行的方法。续行是在键人回车符之前先键入符号&quot;\&quot;。注意回车要紧接在符号&quot;\&quot;之后，中间不能插入其它符号。</strong></font><br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 宏定义的有效范围称为宏定义名的辖域，<strong><font color="#ff0000">辖域从宏定义的定义结束处开始到其所在的源程序文件末尾。宏定义名的辖域不受分程序结构的影响。可以用预处理命令#undef终止宏定义名的辖域。</font></strong><br>
<wbr></wbr>&#160;<wbr></wbr> 在新的宏定义中，可以使用前面已定义的宏名。例如，<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define R 2.5<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define PI 3.1415926<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define Circle 2*PI*R<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define Area PI* R * R<br>
程序中的Circle被展开为2*3.1415926* 2.5， Area被展开为3.1415926*2.5*2.5。<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 如有必要，宏名可被重复定义。被重复定义后，宏名原先的意义被新意义所代替。</font>
<p align="left" style="margin: 0px 0px 0px 7px; text-indent: 8px; line-height: 150%;"><font size="3">&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 通常，无参数的宏定义多用于定义常量。程序中统一用宏名表示常量值，便于程序前后统一，不易出错，也便于修改，能提高程序的可读性和可移植性。特别是给数组元素个数一个宏定义，并用宏名定义数组元素个数能部分弥补数组元素个数固定的不足。<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 注意：<strong><font color="#ff0000">预处理程序在处理宏定义时</font></strong>，只作字符序列的替换工作，不作任何语法的检查。如果宏定义不当，错误要到预处理之后的编译阶段才能发现。宏定义以换行结束，不需要分号等符号作分隔符。如有以下定定义：<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define PI 3.1415926；<br>
原希望用PI求圆的周长的语句<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> c＝2*PI*r；<br>
经宏展开后，变成<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> c＝2*3.1415926*r；<br>
这就不能达到希望的要求。<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr><strong><font color="#000000"> </font><font color="#000000">带参数宏定义进一步扩充了无参数宏定义的能力，在字符序列替换同时还能进行参数替换。带参数定定义的一般形式为<br>
</font></strong><wbr></wbr><strong><font color="#000000">&#160;</font></strong><wbr></wbr><strong><font color="#000000">&#160;</font></strong><wbr></wbr><strong><font color="#000000"> # define 标识符(参数表)字符序列</font></strong><br>
<strong>其中参数表中的参数之间用逗号分隔，字符序列中应包含参数表中的参数。</strong>在定义带参数的宏时，<font color="#ff0000"><strong>宏名标识符与左圆括号之间不允许有空白符，应紧接在一起，否则变成了无参数的宏定义。</strong></font>如有宏定义：<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define MAX(A，B) ((A) &gt; (B)?(A):(B))</font></p>
<p align="left" style="margin: 0px 0px 0px 7px; text-indent: 8px; line-height: 150%;"><font size="3">则代码 y＝ MAX( p＋q， u+v)将被替换成 y＝((p＋q) &gt;(u＋v)?(p＋q):(u＋v)。<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 程序中的宏调用是这样被替换展开的，分别用宏调用中的实在参数字符序列(如p＋q和u＋V) 替换宏定义字符序列中对应所有出现的形式参数(如用p＋q替代所有形式参数A，用u＋V替代所有形式参数B)，而宏定义字符序列中的不是形式参数的其它字 符则保留。这样形成的字符序列，即为宏调用的展开替换结果。<font color="#ff0000"><strong>宏调用提供的实在参数个数必须与宏定义中的形式参数个数相同。</strong></font><br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 注意：宏调用与函数调用的区别。函数调用在程序运行时实行，而宏展开是在编译的预处理阶段进行；函数调用占用程序运行时间，宏调用只占编译时间；函数调用 对实参有类型要求，而宏调用实在参数与宏定义形式参数之间没有类型的概念，只有字符序列的对应关系。函数调用可返回一个值，宏调用获得希望的C代码。另 外，函数调用时，实参表达式分别独立求值在前，执行函数体在后。宏调用是实在参数字符序列替换形式参数。替换后，实在参数字符序列就与相邻的字符自然连 接，实在参数的独立性就不一定依旧存在。如下面的宏定义：<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define SQR(x) x*x<br>
希望实现表达式的平方计算。对于宏调用<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> P＝SQR(y)<br>
能得到希望的宏展开p＝ y*y。但对于宏调用q＝SQR(u＋v)得到的宏展开是q＝u＋V*u＋V。显然，后者的展开结果不是程序设计者所希望的。为能保持实在参数替换后的独 立性，应在宏定义中给形式参数加上括号。进一步，为了保证宏调用的独立性，作为算式的宏定义也应加括<br>
号。如 SQR宏定义改写成：<br>
<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> # define SQR((x)*(x))<br>
才是正确的宏定义。</font></p>
<p align="left" style="margin: 0px 0px 0px 7px; text-indent: 8px; line-height: 150%;"><font size="3">&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr>&#160;<wbr></wbr> 对于简短的表达式计算函数，或为了提高程序的执行效率、避免函数调用时的分配存储单元、保留现场、参数值传递、释放存储单元等工作。可将函数定义改写成宏定义。所以合理使用宏定义，可以使程序更简洁。</font></p>
<p align="left" style="margin: 0px 0px 0px 7px; text-indent: 8px; line-height: 150%;"><font size="3"><br>
</font></p>
<p align="left" style="margin: 0px 0px 0px 7px; text-indent: 8px; line-height: 150%;"><font color="#ff0000"><strong><font size="3">使用一些宏跟踪调试 </font></strong></font></p>
<p><font size="3"><font color="#ff0000"><strong>A N S I标准</strong></font>说明了五个预定义的宏名。它们是： </font></p>
<p><font color="#ff0000" size="3">_ L I N E _ (两个下划线)，对应%d</font></p>
<p><font color="#ff0000" size="3">_ F I L E _&#160;&#160;&#160; 对应%s</font></p>
<p><font color="#ff0000" size="3">_ D A T E _&#160;&#160; 对应%s</font></p>
<p><font color="#ff0000" size="3">_ T I M E _&#160;&#160; 对应%s</font></p>
<p><font color="#ff0000" size="3">_ S T D C _ </font></p>
<p><font size="3">如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序 </font></p>
<p><font size="3">也许还提供其它预定义的宏名。 </font></p>
<p><font size="3">_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。 </font></p>
<p><font size="3">_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。 </font></p>
<p><font size="3">源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时：分：秒。 </font></p>
<p><font size="3">如果实现是标准的,则宏_ S T D C _含有十进制常量1。如果它含有任何其它数,则实现是 </font></p>
<p><font size="3">非标准的。 </font></p>
<p><font size="3">可以定义宏,例如: </font></p>
<p><font size="3">当定义了_DEBUG,输出数据信息和所在文件所在行 </font></p>
<p><font size="3">#ifdef _DEBUG </font></p>
<p><font size="3">#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%s”,date,_LINE_,_FILE_) </font></p>
<p><font size="3">#else </font></p>
<p><font size="3">&#160;&#160;&#160;&#160;&#160; #define DEBUGMSG(msg,date) </font></p>
<p><font size="3">#endif </font></p>
<p><font size="3">20,宏定义防止使用是错误 </font></p>
<p><font color="#ff0000"><strong><font size="3">用小括号包含。 </font></strong></font></p>
<p><font size="3">例如：#define ADD(a,b) （a+b） </font></p>
<p><font size="3">用do{}while(0)语句包含多语句防止错误 </font></p>
<p><font size="3">例如：#difne DO(a,b) a+b;\ </font></p>
<p><font size="3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a++; </font></p>
<p><font size="3">应用时：if(….) </font></p>
<p><font size="3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; DO(a,b); //产生错误 </font></p>
<p><font size="3">&#160;&#160;&#160;&#160;&#160;&#160;&#160; else </font></p>
<p><font size="3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></p>
<p><font size="3">解决方法: #difne DO(a,b) do{a+b;\ </font></p>
<p><font size="3">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a++;}while(0) </font></p>
<p><font size="3"><br>
宏中&quot;#&quot;和&quot;##&quot;的用法 <br>
一、一般用法 <br>
<strong><font color="#ff0000">我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起（这里说的是在预处理是对源文件的操作）</font>. </strong><br>
用法: <br>
#include&lt;cstdio&gt; <br>
#include&lt;climits&gt; <br>
using namespace std;</font></p>
<p><font size="3">#define STR(s)&#160;&#160;&#160;&#160; #s <br>
#define CONS(a,b) int(a##e##b)</font></p>
<p><font size="3">int main() <br>
{ <br>
printf(STR(vck));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 输出字符串&quot;vck&quot; <br>
printf(&quot;%d\n&quot;, CONS(2,3)); // 2e3 输出:2000 <br>
return 0; <br>
}</font></p>
<p><font size="3">二、<font color="#ff0000"><strong>当宏参数是另一个宏的时候 </strong></font><br>
<font color="#ff0000"><strong>需要注意的是凡宏定义里有用''#''或''##''的地方宏参数是不会再展开.</strong></font></font></p>
<p><font size="3">1, 非''#''和''##''的情况 <br>
#define TOW&#160;&#160;&#160;&#160;&#160; (2) <br>
#define MUL(a,b) (a*b)</font></p>
<p><font size="3">printf(&quot;%d*%d=%d\n&quot;, TOW, TOW, MUL(TOW,TOW)); <br>
这行的宏会被展开为： <br>
printf(&quot;%d*%d=%d\n&quot;, (2), (2), ((2)*(2))); <br>
MUL里的参数TOW会被展开为(2).</font></p>
<p><font size="3">2, 当有''#''或''##''的时候 <br>
#define A&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (2) <br>
#define STR(s)&#160;&#160;&#160;&#160; #s <br>
#define CONS(a,b) int(a##e##b)</font></p>
<p><font size="3">printf(&quot;int max: %s\n&quot;, STR(INT_MAX));&#160;&#160;&#160; // INT_MAX #include&lt;climits&gt; <br>
这行会被展开为： <br>
printf(&quot;int max: %s\n&quot;, &quot;INT_MAX&quot;);</font></p>
<p><font size="3">printf(&quot;%s\n&quot;, CONS(A, A));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // compile error <br>
这一行则是： <br>
printf(&quot;%s\n&quot;, int(AeA));</font></p>
<p><font size="3"><strong><font color="#ff0000">INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏. </font></strong><br>
<font color="#ff0000"><strong>加这层宏的用意是把所有宏的参数在中间层里全部展开</strong></font>, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.</font></p>
<p><font size="3">#define A&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (2) <br>
#define _STR(s)&#160;&#160;&#160;&#160; #s <br>
#define STR(s)&#160;&#160;&#160;&#160;&#160; _STR(s)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 转换宏 <br>
#define _CONS(a,b) int(a##e##b) <br>
#define CONS(a,b)&#160;&#160; _CONS(a,b)&#160;&#160;&#160;&#160;&#160;&#160; // 转换宏</font></p>
<p><font size="3">printf(&quot;int max: %s\n&quot;, STR(INT_MAX));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // INT_MAX,int型的最大值,为一个变量 #include&lt;climits&gt; <br>
输出为: int max: 0x7fffffff <br>
STR(INT_MAX) --&gt; _STR(0x7fffffff) 然后再转换成字符串;</font></p>
<p><font size="3">printf(&quot;%d\n&quot;, CONS(A, A)); <br>
输出为：200 <br>
CONS(A, A) --&gt; _CONS((2), (2)) --&gt; int((2)e(2))</font></p>
<p><font size="3">三、''#''和''##''的一些应用特例 <br>
1、<font color="#ff0000"><strong>合并匿名变量名 </strong></font><br>
#define ___ANONYMOUS1(type, var, line) type var##line <br>
#define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line) <br>
#define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__) <br>
例：ANONYMOUS(static int); 即: static int _anonymous70; 70表示该行行号; <br>
第一层：ANONYMOUS(static int); --&gt; __ANONYMOUS0(static int, __LINE__); <br>
第二层：&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; --&gt; ___ANONYMOUS1(static int, _anonymous, 70); <br>
第三层：&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; --&gt; static int _anonymous70; <br>
即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开;</font></p>
<p><font size="3">2、<font color="#ff0000"><strong>填充结构 </strong></font><br>
#define FILL(a)&#160;&#160; {a, #a}</font></p>
<p><font size="3">enum IDD{OPEN, CLOSE}; <br>
typedef struct MSG{ <br>
IDD id; <br>
const char * msg; <br>
}MSG;</font></p>
<p><font size="3">MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; <br>
相当于： <br>
MSG _msg[] = {{OPEN, &quot;OPEN&quot;}, <br>
{CLOSE, &quot;CLOSE&quot;}};</font></p>
<p><font size="3">3、<font color="#ff0000"><strong>记录文件名 </strong></font><br>
#define _GET_FILE_NAME(f)&#160;&#160; #f <br>
#define GET_FILE_NAME(f)&#160;&#160;&#160; _GET_FILE_NAME(f) <br>
static char FILE_NAME[] = GET_FILE_NAME(__FILE__);</font></p>
<p><font size="3">4、得到一个数值类型所对应的字符串缓冲大小 <br>
#define _TYPE_BUF_SIZE(type) sizeof #type <br>
#define TYPE_BUF_SIZE(type)&#160;&#160; _TYPE_BUF_SIZE(type) <br>
char buf[TYPE_BUF_SIZE(INT_MAX)]; <br>
--&gt; char buf[_TYPE_BUF_SIZE(0x7fffffff)]; <br>
--&gt; char buf[sizeof &quot;0x7fffffff&quot;]; <br>
这里相当于： <br>
char buf[11]; </font></p>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/c%D3%EF%D1%D4%D4%D3%BC%C7">c语言杂记</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/b1eff00ec0ed04c07bcbe193.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-27  17:11</pubDate>
        <category><![CDATA[c语言杂记]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/b1eff00ec0ed04c07bcbe193.html</guid>
</item>

<item>
        <title><![CDATA[Linux指定动态库搜索路径[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/fde7aa34dd0bc9315ab5f50d.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://hi.baidu.com/mgqw/creat/blog/<br>
<br>
<br>
<div class="cnt" >
<div class="cnt">
<p>众所周知，Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后，一般都复制到这两个目录中。当程序执行时需要某动态库， 并且该动态库还未加载到内存中，则系统会自动到这两个默认搜索路径中去查找相应的动态库文件，然后加载该文件到内存中，这样程序就可以使用该动态库中的函 数，以及该动态库的其它资源了。在Linux 中，动态库的搜索路径除了默认的搜索路径外，还可以通过以下三种方法来指定。</p>
<div class="postText">
<p style="text-indent: 20pt;"><span>方法一：在配置文件/etc/ld.so.conf中指定动态库搜索路径。 </span></p>
<p style="text-indent: 20pt;">可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径，该文件中每行为一个动态库搜索路径。每次编辑完该文件后，都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。</p>
<p style="text-indent: 20pt;">例1：</p>
<p style="text-indent: 20pt;">我们通过以下命令用源程序pos_conf.c（见程序1）来创建动态库 libpos.so，详细创建过程请参考文[1]。</p>
<p style="text-indent: 35pt;"># gcc -c pos_conf.c<br>
# gcc -shared -fPCI -o libpos.so pos_conf.o<br>
#</p>
<p style="text-indent: 35pt;">#include &lt;stdio.h&gt;<br>
void pos()<br>
{<br>
printf(&quot;/root/test/conf/lib\n&quot;);<br>
}<br>
程序1: pos_conf.c</p>
<p style="text-indent: 20pt;">接着通过以下命令编译main.c（见程序2）生成目标程序pos。</p>
<p style="text-indent: 35pt;"># gcc -o pos main.c -L. -lpos<br>
#</p>
<p style="text-indent: 35pt;">void pos();<br>
int main()<br>
{<br>
pos();<br>
return 0;<br>
}<br>
程序2: main.c</p>
<p style="text-indent: 20pt;">然后把库文件移动到目录/root/test/conf/lib中。</p>
<p style="text-indent: 35pt;"># mkdir -p /root/test/conf/lib<br>
# mv libpos.so /root/test/conf/lib<br>
#</p>
<p style="text-indent: 20pt;">最后编辑配置文件/etc/ld.so.conf，在该文件中追加一行&quot;/root/test/conf/lib&quot;。</p>
<p style="text-indent: 20pt;">运行程序pos试试。</p>
<p style="text-indent: 35pt;"># ./pos<br>
./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory<br>
#</p>
<p style="text-indent: 20pt;">出错了，系统未找到动态库libpos.so。找找原因，原来在编辑完配置文件/etc/ld.so.conf后，没有运行命令ldconfig，所以刚才的修改还未生效。我们运行ldconfig后再试试。</p>
<p style="text-indent: 35pt;"># ldconfig<br>
# ./pos<br>
/root/test/conf/lib <br>
#</p>
<p style="text-indent: 20pt;">程序pos运行成功，并且打印出正确结果。</p>
<p style="text-indent: 20pt;"><span>方法二：通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。 </span></p>
<p style="text-indent: 20pt;">通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时，路径之间用冒号&quot;：&quot;分隔。下面通过例2来说明本方法。</p>
<p style="text-indent: 20pt;">例2：</p>
<p style="text-indent: 20pt;">我们通过以下命令用源程序pos_env.c（见程序3）来创建动态库libpos.so。</p>
<p style="text-indent: 35pt;"># gcc -c pos_env.c<br>
# gcc -shared -fPCI -o libpos.so pos_env.o<br>
#</p>
<p style="text-indent: 35pt;">#include &lt;stdio.h&gt;<br>
void pos()<br>
{<br>
printf(&quot;/root/test/env/lib\n&quot;);<br>
}<br>
程序3: pos_env.c</p>
<p style="text-indent: 20pt;">测试用的可执行文件pos可以使用例1中的得到的目标程序pos，不需要再次编译。因为pos_conf.c中的函数pos和pos_env.c中的函数pos 函数原型一致，且动态库名相同，这就好比修改动态库pos后重新创建该库一样。这也是使用动态库的优点之一。</p>
<p style="text-indent: 20pt;">然后把动态库libpos.so移动到目录/root/test/conf/lib中。</p>
<p style="text-indent: 35pt;"># mkdir -p /root/test/env/lib<br>
# mv libpos.so /root/test/env/lib<br>
#</p>
<p style="text-indent: 20pt;">我们可以使用export来设置该环境变量，在设置该环境变量后所有的命令中，该环境变量都有效。</p>
<p style="text-indent: 20pt;">例如：</p>
<p style="text-indent: 35pt;"># export LD_LIBRARY_PATH=/root/test/env/lib<br>
#</p>
<p style="text-indent: 20pt;">但本文为了举例方便，使用另一种设置环境变量的方法，既在命令前加环境变量设置，该环境变量只对该命令有效，当该命令执行完成后，该环境变量就无效了。如下述命令：</p>
<p style="text-indent: 35pt;"># LD_LIBRARY_PATH=/root/test/env/lib ./pos<br>
/root/test/env/lib<br>
#</p>
<p style="text-indent: 20pt;">程序pos运行成功，并且打印的结果是&quot;/root/test/env/lib&quot;，正是程序pos_env.c中的函数pos的运行结果。因此程序pos搜索到的动态库是/root/test/env/lib/libpos.so。</p>
<p style="text-indent: 20pt;"><span>方法三：在编译目标代码时指定该程序的动态库搜索路径。 </span></p>
<p style="text-indent: 20pt;">还可以在编译目标代码时指定程序的动态库搜索路径。-Wl,表示后面的参数将传给link程序ld（因为gcc可能会自动调用ld）。这里通过gcc 的参数&quot;-Wl,-rpath,&quot;指定（如例3所示）。当指定多个动态库搜索路径时，路径之间用冒号&quot;：&quot;分隔。</p>
<p style="text-indent: 20pt;">例3：</p>
<p style="text-indent: 20pt;">我们通过以下命令用源程序pos.c（见程序4）来创建动态库libpos.so。</p>
<p style="text-indent: 35pt;"># gcc -c pos.c<br>
# gcc -shared -fPCI -o libpos.so pos.o<br>
#</p>
<p style="text-indent: 35pt;">#include &lt;stdio.h&gt;<br>
void pos()<br>
{<br>
printf(&quot;./\n&quot;);<br>
}<br>
程序4: pos.c</p>
<p style="text-indent: 20pt;">因为我们需要在编译目标代码时指定可执行文件的动态库搜索路径，所以需要用gcc命令重新编译源程序main.c(见程序2)来生成可执行文件pos。</p>
<p style="text-indent: 35pt;"># gcc -o pos main.c -L. -lpos -Wl,-rpath,./<br>
#</p>
<p style="text-indent: 20pt;">再运行程序pos试试。</p>
<p style="text-indent: 35pt;"># ./pos<br>
./<br>
#</p>
<p style="text-indent: 20pt;"> </p>
<p style="text-indent: 20pt;">程序pos运行成功，输出的结果正是pos.c中的函数pos的运行结果。因此程序pos搜索到的动态库是./libpos.so。</p>
<p style="text-indent: 20pt;"><font color="#ff0000">example:<br>
</font></p>
<p style="text-indent: 20pt;"><font color="#ff0000">gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c</font></p>
<p style="text-indent: 20pt;">以上介绍了三种指定动态库搜索路径的方法，加上默认的动态库搜索路径/lib和/usr/lib，共五种动态库的搜索路径，那么它们搜索的先后顺序是什么呢？</p>
<p style="text-indent: 20pt;">在 介绍上述三种方法时，分别创建了动态库./libpos.so、 /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我们再用源程序 pos_lib.c（见程序5）来创建动态库/lib/libpos.so，用源程序pos_usrlib.c（见程序6）来创建动态库 /usr/lib/libpos.so。</p>
<p style="text-indent: 35pt;">#include &lt;stdio.h&gt;<br>
void pos()<br>
{<br>
printf(&quot;/lib\n&quot;);<br>
}<br>
程序5: pos_lib.c</p>
<p style="text-indent: 35pt;">#include &lt;stdio.h&gt;<br>
void pos()<br>
{<br>
printf(&quot;/usr/lib\n&quot;);<br>
}<br>
程序6: pos_usrlib.c</p>
<p style="text-indent: 20pt;">这 样我们得到五个动态库libpos.so，这些动态库的名字相同，且都包含相同函数原型 的公用函数pos。但存储的位置不同和公用函数pos 打印的结果不同。每个动态库中的公用函数pos都输出该动态库所存放的位置。这样我们可以通过执行例3中的可执行文件pos得到的结果不同获知其搜索到了 哪个动态库，从而获得第1个动态库搜索顺序，然后删除该动态库，再执行程序pos，获得第2个动态库搜索路径，再删除第2个被搜索到的动态库，如此往复， 将可得到Linux搜索动态库的先后顺序。程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示：</p>
<center>
<table border="1">
    <tbody>
        <tr>
            <th>程序pos输出结果</th>
            <th>使用的动态库</th>
            <th>对应的动态库搜索路径指定方式</th>
        </tr>
        <tr>
            <td>./</td>
            <td>./libpos.so</td>
            <td>编译目标代码时指定的动态库搜索路径</td>
        </tr>
        <tr>
            <td>/root/test/env/lib</td>
            <td>/root/test/env/lib/libpos.so</td>
            <td>环境变量LD_LIBRARY_PATH指定的动态库搜索路径</td>
        </tr>
        <tr>
            <td>/root/test/conf/lib</td>
            <td>/root/test/conf/lib/libpos.so</td>
            <td>配置文件/etc/ld.so.conf中指定的动态库搜索路径</td>
        </tr>
        <tr>
            <td>/lib</td>
            <td>/lib/libpos.so</td>
            <td>默认的动态库搜索路径/lib</td>
        </tr>
        <tr>
            <td>/usr/lib</td>
            <td>/usr/lib/libpos.so</td>
            <td>默认的动态库搜索路径/usr/lib</td>
        </tr>
    </tbody>
</table>
表1: 程序pos输出结果和动态库的对应关系 </center>
<p style="text-indent: 20pt;">创建各个动态库，并放置在相应的目录中。测试环境就准备好了。执行程序pos，并在该命令行中设置环境变量LD_LIBRARY_PATH。</p>
<p style="text-indent: 35pt;"># LD_LIBRARY_PATH=/root/test/env/lib ./pos<br>
./<br>
#</p>
<p style="text-indent: 20pt;">根据程序pos的输出结果可知，最先搜索的是编译目标代码时指定的动态库搜索路径。然后我们把动态库./libpos.so删除了，再运行上述命令试试。</p>
<p style="text-indent: 35pt;"># rm libpos.so<br>
rm: remove regular file `libpos.so'? y<br>
# LD_LIBRARY_PATH=/root/test/env/lib ./pos<br>
/root/test/env/lib<br>
#</p>
<p style="text-indent: 20pt;">根据程序pos的输出结果可知，第2个动态库搜索的路径是环境变量LD_LIBRARY_PATH指定的。我们再把/root/test/env/lib/libpos.so删除，运行上述命令。</p>
<p style="text-indent: 35pt;"># rm /root/test/env/lib/libpos.so<br>
rm: remove regular file `/root/test/env/lib/libpos.so'? y<br>
# LD_LIBRARY_PATH=/root/test/env/lib ./pos<br>
/root/test/conf/lib<br>
#</p>
<p style="text-indent: 20pt;">第3个动态库的搜索路径是配置文件/etc/ld.so.conf指定的路径。删除动态库/root/test/conf/lib/libpos.so后再运行上述命令。</p>
<p style="text-indent: 35pt;"># rm /root/test/conf/lib/libpos.so<br>
rm: remove regular file `/root/test/conf/lib/libpos.so'? y<br>
# LD_LIBRARY_PATH=/root/test/env/lib ./pos<br>
/lib<br>
#</p>
<p style="text-indent: 20pt;">第4个动态库的搜索路径是默认搜索路径/lib。我们再删除动态库/lib/libpos.so，运行上述命令。</p>
<p style="text-indent: 35pt;"># rm /lib/libpos.so<br>
rm: remove regular file `/lib/libpos.so'? y<br>
# LD_LIBRARY_PATH=/root/test/env/lib ./pos<br>
/usr/lib<br>
#</p>
<p style="text-indent: 20pt;">最后的动态库搜索路径是默认搜索路径/usr/lib。</p>
<p style="text-indent: 20pt;">综合以上结果可知，动态库的搜索路径搜索的先后顺序是：</p>
<p style="text-indent: 20pt;">1.编译目标代码时指定的动态库搜索路径；</p>
<p style="text-indent: 20pt;">2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径；</p>
<p style="text-indent: 20pt;">3.配置文件/etc/ld.so.conf中指定的动态库搜索路径；</p>
<p style="text-indent: 20pt;">4.默认的动态库搜索路径/lib；</p>
<p style="text-indent: 20pt;">5.默认的动态库搜索路径/usr/lib。</p>
<p style="text-indent: 20pt;">在上述1、2、3指定动态库搜索路径时，都可指定多个动态库搜索路径，其搜索的先后顺序是按指定路径的先后顺序搜索的。对此本文不再举例说明，有兴趣的读者可以参照本文的方法验证。</p>
</div>
</div>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/c%D3%EF%D1%D4%D4%D3%BC%C7">c语言杂记</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/fde7aa34dd0bc9315ab5f50d.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-24  17:05</pubDate>
        <category><![CDATA[c语言杂记]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/fde7aa34dd0bc9315ab5f50d.html</guid>
</item>

<item>
        <title><![CDATA[系统升级到 Fedora 12 了[转CU]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/b99f1a22a714c5f9d7cae297.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://blog.chinaunix.net/u/1096/showart.php?id=2098691<br>
<br>
<br>
Fedora 12 已经发布，昨天花了一个晚上的时间来升级。<br>
由于以前使用preupgrade 升级失败，这两个版本都是采用 yum 直接升级。<br>
参考：<a href="http://fedoraproject.org/wiki/Upgrading_Fedora_using_yum" title="http://fedoraproject.org/wiki/Upgrading_Fedora_using_yum">http://fedoraproject.org/wiki/Upgrading_Fedora_using_yum</a><br>
<br>
以下所有操作以超级用户执行。<br>
首先，下载最新版本(Fedora 12)的fedora-release&#160; rpm包.<br>
然后安装。<br>
rpm -Uvh fedora-releaseXXX.rpm<br>
<br>
它主要提供了fedora的repository 配置文件和版本说明文件/etc/redhat-release等。<br>
执行 <br>
yum clean all<br>
<br>
清理系统的所有缓存。<br>
重启一下系统，执行 <br>
<br>
yum update rpm<br>
<br>
Fedora 12 中rpm文件的压缩方式发生了变化，所以首先将rpm先升级到最新版本。<br>
然后执行<br>
<br>
yum upgrade -y <br>
<br>
升级整个系统，如果出现依赖问题，先逐个删除出现依赖问题的包。<br>
根据带宽不同和系统软件包的数量不同，下载时间也不一样，我是开了一晚上机完成。<br>
执行<br>
<br>
yum groupupdate &quot;Base&quot;<br>
<br>
保持基础系统的完整性。<br>
如果没有什么意外，一切领事问题都可以自动解决。<br>
<br>
安装新内核，执行<br>
yum update kernel<br>
<br>
重新启动一下。<br>
<br>
检查系统是否有fc11 残留软件。<br>
<br>
rpm -aq|grep fc11<br>
<br>
将不需要的包一一删除，一些新安装 Fedora 12可能会因为依赖问题一并删除，你可以完成这步之后再重新安装。<br>
目前rpmfusion 还没有释放出最新 Nvidia 驱动程序，所有必需用手动的方式安装。<br>
从 www.nvidia.com 官方网站下载最新的 nvida驱动。<br>
<br>
进入grub 界面，按下e（动作要快啊，默认Fedora只有一秒时间），在kernel一行结尾追加（3之前要添加空格）<br>
3 nouveau.modeset=0<br>
然后执行 ./NVIDIA-XXXX.run 进行编译。<br>
需要安装编译相关工具，还有kernel-headers,kernel-devel等。<br>
安装完毕，如果不需要kms，直接在/boot/grub/menu.lst中的kernel一行加上nouveau.modeset=0。<br>
如果需要kms，可以参照 fedora wiki 上的设置进行（自己上官方网站查找，我自己不用，Fedora 11 中试了一次，没有意思）。<br>
Fedora 12 好像默认启用了kms，如果你的显卡无法通过nouveau驱动，默认会转换到framebuffer 模式（模仿图形启动）。。。而启用fb模块，就可能导致不能加载nvidia.ko。                  <br>
<br>
Fedora 12 带有 Gnome shell 预览版本，在 Gnome 3 正式发布，有机会一下gnome 3 的新特性。<br>
执行<br>
yum install gnome-shell desktop-effects <br>
<br>
然后从Perference -&gt; Desktop Effects 中选择 Gnome Shell。<br>
不过我的感觉不好，没有 compiz 效果好。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/fc%26%2347%3B%BA%EC%C3%B1%20%CF%B5%C1%D0">fc&#47;红帽 系列</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/b99f1a22a714c5f9d7cae297.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-24  09:01</pubDate>
        <category><![CDATA[fc&#47;红帽 系列]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/b99f1a22a714c5f9d7cae297.html</guid>
</item>

<item>
        <title><![CDATA[Compiz默认插件快捷键]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/bb955309f6d15c88d1581b83.html]]></link>
        <description><![CDATA[
		
		好像是从fedora9开始，就默认集成了compiz桌面效果，在系统-》首选项-》桌面效果 开启即可<br>
<br>
懒人不需要太多设置，默认的设置实用又华丽，足够了：<br>
<br>
<p>Compiz-&gt;General-&gt;Screen0-&gt;Options 有很多设置</p>
<ul>
    <li><strong>切换窗口</strong> = Alt + Tab</li>
    <li><strong>铺开显示全部窗口</strong> = 指针移到屏幕右上角作为开关；单击窗口使之缩放到前台。</li>
    <li><strong>切换立方体桌面</strong> = Ctrl + Alt + 左/右箭头</li>
    <li><strong>切换立方体桌面 ＋ 活动窗口跟随</strong> = Ctrl + Shift + Alt + 左/右箭头</li>
    <li><strong>手动旋转立方体</strong> = Ctrl + Alt + 左键单击并拖拽桌面空白处</li>
    <li><strong>窗口透明/不透明</strong> = possible with the &quot;transset&quot; utility or Alt + 滚轮</li>
    <li><strong>放大一次</strong> = 超级键 + 右击</li>
    <li><strong>手动放大</strong> = 超级键 + 滚轮向上</li>
    <li><strong>手动缩小</strong> = 超级键 + 滚轮向下</li>
    <li><strong>移动窗口</strong> = Alt + 左键单击</li>
    <li><strong>移动窗口时贴住边框</strong> = Ctrl + Shift + 左键拖动</li>
    <li><strong>调整窗口大小</strong> = Alt + 中击</li>
    <li><strong>Bring up the window below the top window</strong> = Alt + 右键单击</li>
    <li><strong>动态效果减速</strong> = Shift + F10</li>
    <li><strong>水纹</strong> = 按住 Ctrl+超级键
    <ul>
        <li><strong>雨点</strong> = Shift-F9</li>
    </ul>
    </li>
    <li><strong>桌面展开</strong>＝ Ctrl + Alt + 下箭头，然后按住  Ctrl + Alt 和左/右箭头选择桌面</li>
</ul>
<p><em>&quot;超级键&quot;指因Linux而异的 Win 徽标键。<br>
</em> <em>如果你知道其他的，添加在这里。</em></p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/fc%26%2347%3B%BA%EC%C3%B1%20%CF%B5%C1%D0">fc&#47;红帽 系列</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/bb955309f6d15c88d1581b83.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-21  01:42</pubDate>
        <category><![CDATA[fc&#47;红帽 系列]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/bb955309f6d15c88d1581b83.html</guid>
</item>

<item>
        <title><![CDATA[在Linux操作系统下使用虚拟光驱的方法[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/231ce0d9341ee82610df9bc2.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://www.51cto.com/art/200706/49556.htm<br>
<br>
<p>在Linux下使用虚拟光驱 其实根本不需要什么虚拟光驱软件，用mount命令就可以完成。</p>
<p><strong>1. 把光盘制作成iso文件</strong></p>
<p>$cp /dev/cdrom XXXXX.iso</p>
<p>XXXXX.iso为你所命名的镜像文件。执行此命令之后就可以将整个光盘制作成iso文件。XXXXX.iso前你可以加上路径哦。</p>
<p><strong>2.将硬盘上的iso文件加载到光盘(或者说虚拟光驱)。</strong></p>
<p>$mount -t iso9660 -o loop /*/XXXXX.iso /mnt/iso</p>
<p><strong>3.如果是安装系统盘所提供的文件，如添加删除程序，系统可能会提示你插入光盘，但我们没有光盘，只有镜像，怎么办？</strong></p>
<p>对于Redhat，先 mount iso,然后执行</p>
<p>$redhat-install-packages --isodir=/mnt/iso</p>
<p><strong>4.一般情况虚拟光驱</strong></p>
<p>$rm -rf /dev/cdrom #删除光驱</p>
<p>$ln /dev/loop7 /dev/cdrom</p>
<p>$losetup /dev/loop7 /*/XXXXX.iso</p>
<p>$mount /mnt/cdrom</p>
<p>然后你再看看iso文件，是不是变成了虚拟光驱？</p>
<p>取消这个光驱：</p>
<p>$losetup -d /dev/loop7</p>
<p>换盘的话：</p>
<p>只需转移iso关联到/dev/loop</p>
<p>$losetup /dev/loop7 /*/XXXXX.iso</p>
<br>
<br>
<br>
<h3>linux下使用“虚拟光驱”</h3>
<br>
http://www.51cto.com/art/200512/14295.htm<br>
在＃提示符下执行命令<br>
cp /dev/cdrom XXXXX.iso<br>
XXXXX.iso即为需要命名的ISO文件名<br>
执行之后，光盘上所有文件就被映射成XXXXX.iso<br>
至于如何加载请看下面，<br>
还是在＃提示符下执行命令<br>
rm -rf /dev/cdrom<br>
ln -s /dev/loop7 /dev/cdrom<br>
losetup /dev/loop7 /PATH（iso文件路径）<br>
mount /mnt/cdrom<br>
如果需要换盘<br>
losetup -d /dev/loop7<br>
再重复<br>
losetup /dev/loop7 /PATH（iso文件路径）<br>
mount /mnt/cdrom<br>
如果是普通含有iso的光盘<br>
可以直接使用命令<br>
mount -t iso9660 -o loop /../*.iso /path<br>
/.../*.iso 是iso文件路径<br>
/path 是挂载点<br>
<br>
<br>
<h1 class="title_txt"> </h1>
<div class="blogstory">


其实根本不需要什么虚拟光驱软件，用mount命令就可以完成。<br>
<div class="postText"><span class="tpc_content">1. 把光盘制作成iso文件<br>
cp /dev/cdrom XXXXX.iso<br>
<br>
XXXXX.iso为你所命名的镜像文件。执行此命令之后就可以将整个光盘制作成iso文件。XXXXX.iso<br>
前你可以加上路径哦。<br>
2.将硬盘上的iso文件加载到光盘(或者说虚拟光驱)。<br>
mount -t iso9660 -o loop /*/XXXXX.iso /mnt/iso<br>
3.如果是安装系统盘所提供的文件，如添加删除程序，系统可能会提示你插入光盘，但我们没有光盘，只有镜像，怎么办？<br>
对于Redhat&#160; : redhat-install-packages --isodir=iso文件目录<br>
对于Fedora Core 4 : </span><code>system-config-packages --isodir=iso文件目录</code><br>
<span class="tpc_content"><br>
<br>
4.一般情况虚拟光驱<br>
rm -rf /dev/cdrom #删除光驱<br>
<br>
ln /dev/loop7 /dev/cdrom<br>
<br>
losetup /dev/loop7 /*/XXXXX.iso <br>
<br>
mount /mnt/cdrom<br>
<br>
然后你再看看iso文件，是不是变成了虚拟光驱？<br>
<br>
取消这个光驱：<br>
losetup -d /dev/loop7<br>
<br>
换盘的话：<br>
<br>
只需转移iso关联到/dev/loop<br>
losetup /dev/loop7 /*/XXXXX.iso </span></div>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/231ce0d9341ee82610df9bc2.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-20  23:06</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/231ce0d9341ee82610df9bc2.html</guid>
</item>

<item>
        <title><![CDATA[Linux下配置ip地址[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/d22029649aa6c3faf63654a5.html]]></link>
        <description><![CDATA[
		
		转自：<br>
<span class="submitted"><a class="active" href="http://www.drupaluser.org/node/1048">http://www.drupaluser.org/node/1048</a></span><br>
<br>
<br>
<p>即时生效:<br>
ifconfig eth0 192.168.1.102 netmask 255.255.255.0<br>
启动生效:<br>
vim /etc/sysconfig/network-scripts/ifcfg-eth0<br>
加入<br>
IPADDR=192.168.1.102<br>
NETMASK=255.255.255.0</p>
<p>修改default gateway<br>
即时生效:<br>
route add default gw 192.168.1.1<br>
启动生效:<br>
vim /etc/sysconfig/network-scripts/ifcfg-eth0<br>
加入<br>
GATEWAY=192.168.1.1<br>
最后结果如下：<br>
DEVICE=eth0<br>
BOOTPROTO=static<br>
IPADDR=192.168.1.102<br>
NETMASK=255.255.255.0<br>
GETEWAY=192.168.1.1<br>
ONBOOT=yes<br>
TYPE=Ethernet<br>
注：BOOTPROTO只有在static(静态)模式下才可以使用设置的IP信息<br>
修改dns<br>
vim /etc/resolv.conf<br>
修改后可即时生效，启动同样有效</p>
<p>形式<br>
加入nameserver= ***.***.***.***<br>
最多可有三个，作为上一个失败后的候选</p>
<p>修改host name<br>
即时生效:<br>
hostname fc2<br>
启动生效:<br>
vim /etc/sysconfig/network<br>
形式如下：<br>
NETWORKING=yes<br>
HOSTNAME=rh-linux.fc.org<br>
##########################################################<br>
首先,先了解传统的网络配置命令:<br>
1. 使用ifconfig命令配置并查看网络接口情况<br>
示例1: 配置eth0的IP，同时激活设备:<br>
ifconfig eth0 192.168.4.1 netmask 255.255.255.0 up<br>
示例2: 配置eth0别名设备 eth0:1 的IP，并添加路由<br>
ifconfig eth0:1 192.168.4.2<br>
route add –host 192.168.4.2 dev eth0:1<br>
示例3:激活（禁用）设备<br>
ifconfig eth0:1 up(down)<br>
示例4:查看所有（指定）网络接口配置<br>
ifconfig (eth0)<br>
—————————<br>
2. 使用route 命令配置路由表<br>
示例1:添加到主机路由<br>
route add –host 192.168.4.2 dev eth0:1<br>
route add –host 192.168.4.1 gw 192.168.4.250<br>
示例2:添加到网络的路由<br>
route add –net IP netmask MASK eth0<br>
route add –net IP netmask MASK gw IP<br>
route add –net IP/24 eth1<br>
示例3:添加默认网关<br>
route add default gw IP<br>
示例4:删除路由<br>
route del –host 192.168.4.1 dev eth0:1<br>
示例5:查看路由信息<br>
route 或　 route -n　 (-n 表示不解析名字,列出速度会比route 快)<br>
—————————<br>
3.ARP 管理命令<br>
示例1:查看ARP缓存<br>
arp<br>
示例2:　添加<br>
arp –s IP MAC<br>
示例3: 删除<br>
arp –d IP<br>
—————————<br>
4.　ip是iproute2软件包里面的一个强大的网络配置工具，它能够替代一些传统的网络管理工具。例如：ifconfig、route等,<br>
上面的示例完全可以用下面的ip命令实现,而且ip命令可以实现更多的功能.下面介绍一些示例:</p>
<p>4.0 ip命令的语法<br>
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]</p>
<p>4.1 ip link set–改变设备的属性.　缩写：set、s</p>
<p>示例1：up/down 起动／关闭设备。<br>
ip link set dev eth0 up<br>
这个等于传统的<br>
ifconfig eth0 up<br>
ifconfig eth0 down<br>
示例2：改变设备传输队列的长度。<br>
参数:txqueuelen NUMBER或者txqlen NUMBER<br>
ip link set dev eth0 txqueuelen 100<br>
示例3：改变网络设备MTU(最大传输单元)的值。<br>
ip link set dev eth0 mtu 1500<br>
示例4： 修改网络设备的MAC地址。<br>
参数: address LLADDRESS<br>
ip link set dev eth0 address 00:01:4f:00:15:f1</p>
<p>4.2 ip link show–显示设备属性.　　缩写：show、list、lst、sh、ls、l<br>
-s选项出现两次或者更多次，ip会输出更为详细的错误信息统计。<br>
示例:<br>
ip -s -s link ls eth0<br>
这个命令等于传统的<br>
ifconfig eth0<br>
—————————<br>
5.1 ip address add–添加一个新的协议地址. 缩写：add、a<br>
示例1：为每个地址设置一个字符串作为标签。为了和Linux-2.0的网络别名兼容，这个字符串必须以设备名开头，接着一个冒号，<br>
ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0<br>
等价于<br>
ifconfig eth0:5 192.168.4.1/28<br>
ip addr add local 192.168.4.1/28 dev eth0<br>
示例2: 在以太网接口eth0上增加一个地址192.168.20.0，掩码长度为24位(155.155.155.0)，标准广播地址，标签为eth0:Alias：<br>
ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1<br>
这个命令等于传统的:　<br>
ifconfig eth1:1 192.168.4.2/24</p>
<p>5.2 ip address delete–删除一个协议地址. 缩写：delete、del、d<br>
ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias1</p>
<p>5.3 ip address show–显示协议地址. 缩写：show、list、lst、sh、ls、l<br>
ip addr ls eth0</p>
<p>5.4.ip address flush–清除协议地址. 缩写：flush、f<br>
示例1 : 删除属于私网10.0.0.0/8的所有地址：<br>
ip -s -s a f to 10/8<br>
示例2 : 取消所有以太网卡的IP地址<br>
ip -4 addr flush label “eth0″<br>
—————————<br>
6. ip neighbour–neighbour/arp表管理命令<br>
缩写 neighbour、neighbor、neigh、n<br>
命令 add、change、replace、delete、fulsh、show(或者list)</p>
<p>6.1 ip neighbour add — 添加一个新的邻接条目<br>
ip neighbour change–修改一个现有的条目<br>
ip neighbour replace–替换一个已有的条目<br>
缩写：add、a；change、chg；replace、repl<br>
示例1: 在设备eth0上，为地址10.0.0.3添加一个permanent ARP条目：<br>
ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm<br>
示例2:把状态改为reachable<br>
ip neigh chg 10.0.0.3 dev eth0 nud reachable</p>
<p>6.2.ip neighbour delete–删除一个邻接条目<br>
示例1:删除设备eth0上的一个ARP条目10.0.0.3<br>
ip neigh del 10.0.0.3 dev eth0<br>
6.3.ip neighbour show–显示网络邻居的信息.　缩写：show、list、sh、ls<br>
示例1: ip -s n ls 193.233.7.254<br>
193.233.7.254. dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 nud reachable<br>
6.4.ip neighbour flush–清除邻接条目. 缩写：flush、f<br>
示例1: (-s 可以显示详细信息)<br>
ip -s -s n f 193.233.7.254<br>
—————————<br>
7. 路由表管理<br>
7.1.缩写 route、ro、r<br>
7.5.路由表<br>
从Linux-2.2开始，内核把路由归纳到许多路由表中，这些表都进行了编号，编号数字的范围是1到255。另外，<br>
为了方便，还可以在/etc/iproute2/rt_tables中为路由表命名。<br>
默认情况下，所有的路由都会被插入到表main(编号254)中。在进行路由查询时，内核只使用路由表main。</p>
<p>7.6.ip route add — 添加新路由<br>
ip route change — 修改路由<br>
ip route replace — 替换已有的路由<br>
缩写：add、a；change、chg；replace、repl<br>
示例1: 设置到网络10.0.0/24的路由经过网关193.233.7.65<br>
ip route add 10.0.0/24 via 193.233.7.65</p>
<p>示例2: 修改到网络10.0.0/24的直接路由，使其经过设备dummy<br>
ip route chg 10.0.0/24 dev dummy</p>
<p>示例3: 实现链路负载平衡.加入缺省多路径路由，让ppp0和ppp1分担负载(注意：scope值并非必需，它只不过是告诉内核，这个路由要经过网关而不是直连的。实际上，如果你知道远程端点的地址，使用via参数来设置就更好了)。<br>
ip route add default scope global nexthop dev ppp0 nexthop dev ppp1<br>
ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1<br>
示例4: 设置NAT路由。在转发来自192.203.80.144的数据包之前，先进行网络地址转换，把这个地址转换为193.233.7.83<br>
ip route add nat 192.203.80.142 via 193.233.7.83</p>
<p>示例5: 实现数据包级负载平衡,允许把数据包随机从多个路由发出。weight 可以设置权重.<br>
ip route replace default equalize nexthop via 211.139.218.145 dev eth0 weight 1 nexthop via 211.139.218.145 dev eth1 weight 1</p>
<p>7.7.ip route delete– 删除路由<br>
缩写：delete、del、d<br>
示例1:删除上一节命令加入的多路径路由<br>
ip route del default scope global nexthop dev ppp0 nexthop dev ppp1</p>
<p>7.8.ip route show — 列出路由<br>
缩写：show、list、sh、ls、l</p>
<p>示例1: 计算使用gated/bgp协议的路由个数<br>
ip route ls proto gated/bgp |wc<br>
1413　　9891　　79010</p>
<p>示例2: 计算路由缓存里面的条数，由于被缓存路由的属性可能大于一行，以此需要使用-o选项<br>
ip -o route ls cloned |wc<br>
159　　2543　　18707<br>
示例3: 列出路由表TABLEID里面的路由。缺省设置是table main。TABLEID或者是一个真正的路由表ID或者是/etc/iproute2/rt_tables文件定义的字符串，<br>
或者是以下的特殊值：<br>
all — 列出所有表的路由；<br>
cache — 列出路由缓存的内容。<br>
ip ro ls 193.233.7.82 tab cache<br>
示例4: 列出某个路由表的内容<br>
ip route ls table fddi153</p>
<p>示例5: 列出默认路由表的内容<br>
ip route ls<br>
这个命令等于传统的: route</p>
<p>7.9.ip route flush — 擦除路由表<br>
示例1: 删除路由表main中的所有网关路由（示例：在路由监控程序挂掉之后）：<br>
ip -4 ro flush scope global type unicast<br>
示例2:清除所有被克隆出来的IPv6路由：<br>
ip -6 -s -s ro flush cache<br>
示例3:　在gated程序挂掉之后，清除所有的BGP路由：<br>
ip -s ro f proto gated/bgp<br>
示例4: 清除所有ipv4路由cache<br>
ip route flush cache<br>
*** IPv4 routing cache is flushed.</p>
<p>7.10　ip route get — 获得单个路由 .缩写：get、g<br>
使用这个命令可以获得到达目的地址的一个路由以及它的确切内容。<br>
ip route get命令和ip route show命令执行的操作是不同的。ip route show命令只是显示现有的路由，而ip route get命令在必要时会派生出新的路由。<br>
示例1: 搜索到193.233.7.82的路由<br>
ip route get 193.233.7.82<br>
193.233.7.82 dev eth0　src 193.233.7.65 realms inr.ac cache　mtu 1500 rtt 300<br>
示例2: 搜索目的地址是193.233.7.82，来自193.233.7.82，从eth0设备到达的路由（这条命令会产生一条非常有意思的路由，这是一条到193.233.7.82的回环路由）<br>
ip r g 193.233.7.82 from 193.233.7.82 iif eth0<br>
193.233.7.82 from 193.233.7.82 dev eth0　src 193.233.7.65　realms inr.ac/inr.ac<br>
cache</p>
<p>示例1: 通过路由表inr.ruhep路由来自源地址为192.203.80/24的数据包<br>
ip ru add from 192.203.80/24 table inr.ruhep prio 220</p>
<p>示例2:把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144，并通过表1进行路由<br>
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320</p>
<p>示例3:删除无用的缺省规则<br>
ip ru del prio 32767</p>
<p>8.7. ip rule show — 列出路由规则<br>
缩写：show、list、sh、ls、l<br>
示例1:　<br>
ip ru ls<br>
0:　　　from all lookup local<br>
32762:　from 192.168.4.89 lookup fddi153<br>
32764:　from 192.168.4.88 lookup fddi153<br>
32766:　from all lookup main<br>
32767:　from all lookup 253<br>
—————————<br>
9.　ip maddress — 多播地址管理<br>
缩写：show、list、sh、ls、l<br>
9.3.ip maddress show — 列出多播地址<br>
示例1:<br>
ip maddr ls dummy</p>
<p>9.4. ip maddress add — 加入多播地址<br>
ip maddress delete — 删除多播地址<br>
缩写：add、a；delete、del、d<br>
使用这两个命令，我们可以添加／删除在网络接口上监听的链路层多播地址。这个命令只能管理链路层地址。</p>
<p>示例1: 增加　　　 ip maddr add 33:33:00:00:00:01 dev dummy<br>
示例2: 查看　　　<br>
ip -O maddr ls dummy<br>
2:　dummy<br>
link　33:33:00:00:00:01 users 2 static<br>
link　01:00:5e:00:00:01<br>
示例3: 删除　　<br>
ip maddr del 33:33:00:00:00:01 dev dummy<br>
—————————<br>
10.ip mroute — 多播路由缓存管理</p>
<p>10.4.　ip mroute show — 列出多播路由缓存条目<br>
缩写：show、list、sh、ls、l</p>
<p>示例1:查看　 ip mroute ls<br>
(193.232.127.6, 224.0.1.39)　　　Iif: unresolved<br>
(193.232.244.34, 224.0.1.40)　　 Iif: unresolved<br>
(193.233.7.65, 224.66.66.66)　　 Iif: eth0　　　 Oifs: pimreg<br>
示例2:查看　 ip -s mr ls 224.66/16<br>
(193.233.7.65, 224.66.66.66)　　 Iif: eth0　　　 Oifs: pimreg<br>
9383 packets, 300256 bytes<br>
—————————<br>
11. ip tunnel — 通道配置<br>
缩写　tunnel、tunl</p>
<p>11.4.ip tunnel add — 添加新的通道<br>
ip tunnel change — 修改现有的通道<br>
ip tunnel delete — 删除一个通道<br>
缩写：add、a；change、chg；delete、del、d<br>
示例1:建立一个点对点通道，最大TTL是32<br>
ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32</p>
<p>11.4.ip tunnel show — 列出现有的通道<br>
缩写：show、list、sh、ls、l<br>
示例1:　 ip -s tunl ls Cisco<br>
—————————<br>
12. ip monitor和rtmon — 状态监视<br>
ip命令可以用于连续地监视设备、地址和路由的状态。这个命令选项的格式有点不同，命令选项的名字叫做monitor，接着是操作对象：<br>
ip monitor [ file FILE ] [ all | OBJECT-LIST ]<br>
示例1:　<br>
rtmon file /var/log/rtmon.log<br>
示例2:　<br>
ip monitor file /var/log/rtmon.log r</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/shell%BC%C7%C2%BC">shell记录</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/d22029649aa6c3faf63654a5.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-19  16:18</pubDate>
        <category><![CDATA[shell记录]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/d22029649aa6c3faf63654a5.html</guid>
</item>

<item>
        <title><![CDATA[Big endian and Little endian[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/be10234489b4f188b3b7dc3c.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://hi.baidu.com/419836321/blog/item/2965c6a675d9559dd0435851.html<br>
<br>
<div class="cnt" >
<div class="articleTitle">
<div style="display: inline;"><font face="黑体" color="#4d7401" size="5">Big endian and Little endian</font><span class="time"><font color="#585858" size="1">(2007-09-05 09:08:02)</font></span></div>
</div>
<div class="articleTag">
<table border="0" width="100%" cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td>标签：<a target="_blank" href="http://uni.sina.com.cn/c.php?t=blog&amp;k=%D6%AA%CA%B6%2F%CC%BD%CB%F7&amp;ts=bpost&amp;stype=tag" class="tag"><font color="#4f7200">知识/探索</font></a><wbr></wbr></td>
            <td align="right" width="250" valign="top">分类：<a href="http://blog.sina.com.cn/s/articlelist_1269485165_2_1.html"><font color="#4f7200">知识积累</font></a></td>
        </tr>
    </tbody>
</table>
</div>
<div class="articleContent">
<div><wbr></wbr>谈到字节排序的问题，必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列 CPU。PowerPC系列采用big endian方式存储数据，而x86系列则采用little endian方式存储数据。ARM同时支持 big和little，实际应用中通常使用little endian。那么究竟什么是big endian，什么又是little endian呢？
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 其实big endian是指低地址存放最高有效字节（MSB），而little endian则是低地址存放最低有效字节（LSB）。用文字说明可能比较抽象，下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示：</p>
<p><strong>Big Endian</strong><br>
一个Word中的高位的Byte放在内存中这个Word区域的低地址处</p>
<p>低地址 高地址<br>
-----------------------------------------&gt;<br>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br>
| 12 | 34 | 56 | 78 |<br>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p><strong>Little Endian</strong><br>
一个Word中的低位的Byte放在内存中这个Word区域的低地址处</p>
<p>低地址 高地址<br>
-----------------------------------------&gt;<br>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br>
| 78 | 56 | 34 | 12 |<br>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 从上面两图可以看出，采用big endian方式存储数据是符合我们人类的思维习惯的。必须注意的是：一个Word的长度是16位，一个Byte的长度是8位。如果一个数超过一个 Word的长度，必须先按Word分成若干部分，然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来 处理字节。<br>
<wbr></wbr> <wbr></wbr> 一个例子：<br>
如果我们将0x1234abcd写入到以0x0000开始的内存中，则结果为<br>
big-endian little-endian<br>
0x0000 0x12 0xcd<br>
0x0001 0x34 0xab<br>
0x0002 0xab 0x34<br>
0x0003 0xcd 0x12</p>
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的.简单的说,little endian把低位存放到高位,而big endian把低位存放到低位. 现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian.<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 以下是判断字节存储顺序的可移植的C语言代码:<br>
/*可移植的用于判断存储格式是<br>
<wbr></wbr> little endian还是big ednian的C代码*/<br>
#include <wbr></wbr> &lt; stdio.h &gt;<br>
union<br>
<wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> long <wbr></wbr> Long;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> char <wbr></wbr> Char[ sizeof ( long )];<br>
<wbr></wbr> } u;</p>
<p><wbr></wbr>int <wbr></wbr> main()<br>
<wbr></wbr> { <wbr></wbr> <wbr></wbr> <wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> u.Long <wbr></wbr> = <wbr></wbr> <wbr></wbr> 1 ; <wbr></wbr> <wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> if <wbr></wbr> (u.Char[ 0 ] <wbr></wbr> == <wbr></wbr> <wbr></wbr> 1 ) <wbr></wbr> <wbr></wbr> <wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; Little Endian!\n &quot; );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> else <wbr></wbr> <wbr></wbr> if <wbr></wbr> (u.Char[ sizeof ( long ) <wbr></wbr> - <wbr></wbr> <wbr></wbr> 1 ] <wbr></wbr> == <wbr></wbr> <wbr></wbr> 1 )<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; Big Endian!\n &quot; );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> else<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; Unknown Addressing!\n &quot; );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; Now, Let's look at every byte in the memory!\n &quot; );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> for <wbr></wbr> ( int <wbr></wbr> i <wbr></wbr> = <wbr></wbr> <wbr></wbr> 0 ; i <wbr></wbr> &lt; <wbr></wbr> <wbr></wbr> sizeof ( long ); <wbr></wbr> ++ i)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; [%x] = %x\n &quot; , <wbr></wbr> &amp; u.Char[i], u.Char[i]);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> return <wbr></wbr> <wbr></wbr> 0 ;<br>
<wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>  <wbr></wbr>在 网络编程中,TCP/IP统一采用big endian方式传送数据,也就是说,假设现在是在一个字节顺序是little endian的机器上传送数据,要求传送的数据是0XCEFABOBO,那么你就要以0XBOBOFACE的顺序在unsigned int中存放这个数据,只有这样才能保证存放的顺序满足TCP/IP的字节顺序要求.很多时候,需要自己编写应用层的协议,字节顺序的概念在这个时候就显 得及其的重要了.<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 下面给出的是在big endian和little endian中相互转换的代码,C语言强大的位操作的能力在这里显示了出来:<br>
<wbr></wbr> <wbr></wbr> /*在little endian和big ednian之间相互转化数据的演示代码*/<br>
<wbr></wbr> #include <wbr></wbr> &lt; stdio.h &gt;<br>
<wbr></wbr> const <wbr></wbr> unsigned <wbr></wbr> char <wbr></wbr> SIZE_OF_UNSIGNEDINT <wbr></wbr> <wbr></wbr> = <wbr></wbr> <wbr></wbr> sizeof (unsigned <wbr></wbr> int );<br>
<wbr></wbr> const <wbr></wbr> unsigned <wbr></wbr> char <wbr></wbr> SIZE_OF_UNSIGNEDCHAR <wbr></wbr> = <wbr></wbr> <wbr></wbr> sizeof (unsigned <wbr></wbr> char );</p>
<p><wbr></wbr> void <wbr></wbr> put_32(unsigned <wbr></wbr> char <wbr></wbr> <wbr></wbr> * cmd, unsigned <wbr></wbr> int <wbr></wbr> data)<br>
<wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> int <wbr></wbr> i;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> for <wbr></wbr> (i <wbr></wbr> = <wbr></wbr> SIZE_OF_UNSIGNEDINT <wbr></wbr> - <wbr></wbr> <wbr></wbr> 1 ; i <wbr></wbr> &gt;= <wbr></wbr> <wbr></wbr> 0 ; <wbr></wbr> -- i)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> cmd[i] <wbr></wbr> = <wbr></wbr> data <wbr></wbr> % <wbr></wbr> <wbr></wbr> 256 ;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> // 或者可以:<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> // cmd[i] = data &amp; 0xFF;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> data <wbr></wbr> = <wbr></wbr> data <wbr></wbr> &gt;&gt; <wbr></wbr> <wbr></wbr> 8 ;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> }<br>
<wbr></wbr><br>
<wbr></wbr> unsigned <wbr></wbr> int <wbr></wbr> get_32(unsigned <wbr></wbr> char <wbr></wbr> <wbr></wbr> * cmd)<br>
<wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> unsigned <wbr></wbr> int <wbr></wbr> <wbr></wbr> ret;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> int <wbr></wbr> i;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> for <wbr></wbr> (ret <wbr></wbr> = <wbr></wbr> <wbr></wbr> 0 , i <wbr></wbr> = <wbr></wbr> SIZE_OF_UNSIGNEDINT <wbr></wbr> - <wbr></wbr> <wbr></wbr> 1 ; i <wbr></wbr> &gt;= <wbr></wbr> <wbr></wbr> 0 ; <wbr></wbr> -- i)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> ret <wbr></wbr> <wbr></wbr> = <wbr></wbr> ret <wbr></wbr> &lt;&lt; <wbr></wbr> <wbr></wbr> 8 ;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> ret <wbr></wbr> |= <wbr></wbr> cmd[i]; <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> } <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> return <wbr></wbr> ret;<br>
<wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr><br>
<wbr></wbr> int <wbr></wbr> main( void )<br>
<wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> unsigned <wbr></wbr> char <wbr></wbr> cmd[SIZE_OF_UNSIGNEDINT];<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> unsigned <wbr></wbr> int <wbr></wbr> data, ret;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> unsigned <wbr></wbr> char <wbr></wbr> <wbr></wbr> * p;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> int <wbr></wbr> i;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> data <wbr></wbr> = <wbr></wbr> <wbr></wbr> 0x12345678 ;<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; data = %x\n &quot; , data);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> // 以字节为单位打印出数据<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> p = (unsigned <wbr></wbr> char * )( &amp; data);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> for(i <wbr></wbr> = <wbr></wbr> <wbr></wbr> 0 ; i <wbr></wbr> &lt; <wbr></wbr> SIZE_OF_UNSIGNEDINT; <wbr></wbr> ++ i)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; %x &quot; , <wbr></wbr> * p ++ );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; \n &quot; );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> //以相反的顺序存放到cmd之中<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> put_32(cmd, data);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> for <wbr></wbr> (i <wbr></wbr> = <wbr></wbr> <wbr></wbr> 0 ; i <wbr></wbr> &lt; <wbr></wbr> SIZE_OF_UNSIGNEDINT; <wbr></wbr> ++ i)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; cmd[%d] = %x\n &quot; , i, cmd[i]);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> // 再以相反的顺序保存数据到ret中<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> // 保存之后的ret数值应该与data相同<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> ret <wbr></wbr> = <wbr></wbr> get_32(cmd);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; ret = %x\n &quot; , ret);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> p = (unsigned <wbr></wbr> char * )( &amp; ret);<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> for(i <wbr></wbr> = <wbr></wbr> <wbr></wbr> 0 ; i <wbr></wbr> &lt; <wbr></wbr> SIZE_OF_UNSIGNEDINT; <wbr></wbr> ++ i)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> {<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; %x &quot; , <wbr></wbr> * p ++ );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> printf( &quot; \n &quot; );<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> return <wbr></wbr> <wbr></wbr> 0 ;<br>
<wbr></wbr> <wbr></wbr> }<br>
<wbr></wbr><br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 为什么要注意字节序的问题呢？你可能这么问。当然，如果你写的程序只在单机环境下面运行，并且不和别人的程序打交道，那么你完全可以忽略字节序的存在。但 是，如果你的程序要跟别人的程序产生交互呢？在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的，而 JAVA编写的程序则唯一采用big endian方式来存储数据。试想，如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果？就拿上面的 0x12345678来说，你的程序传递给别人的一个数据，将指向0x12345678的指针传给了JAVA程序，由于JAVA采取big endian方式存储数据，很自然的它会将你的数据翻译为0x78563412。什么？竟然变成另外一个数字了？是的，就是这种后果。因此，在你的C程序 传给JAVA程序之前有必要进行字节序的转换工作。</p>
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>  <wbr></wbr>所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时，在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。</p>
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr>  <wbr></wbr>当前的存储器，多以byte为访问的最小单元，当一个逻辑上的整理必须分割为物理 上的若干单元时就存在了先放谁后放谁的问题,于是endian的问题应运而生了,对于不同的存储方法,就有Big-endian和Little- endian两个描述.(这两个术语来自于 Jonathan Swift 的《《格利佛游记》其中交战的两个派别无法就应该从哪一端－－小端还是大端－－打开一个半熟的鸡蛋达成一致。在那个时代，Swift是在讽刺英国和法国之 间的持续冲突，Danny Cohen，一位网络协议的早期开创者，第一次使用这两个术语来指代字节顺序，后来这个术语被广泛接纳了。)<br>
<wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> <wbr></wbr> 存在“如果说&quot;跟word或者说字长根本就没关系&quot;，假设有一数据文件里面有N多数顺序排布，如果想以Little-Endian format 读入内存某区域，那么应该怎么读？怎么排？”这样的问题是由于对于endian的实质理解的偏差，endian指的是当物理上的最小单元比逻辑上的最小单 元小时，逻辑到物理的单元排布关系。这里的“有一数据文件里面有N多数顺序排布”，这个“有一数据”显然不是逻辑上的最小单元，而其中的“N多数”的一个 才是逻辑最小单元，于是可应用楼主表格中的原则排列，而“N多数”之间的顺序则是由这“N多数”的宿主决定的，比如是你写的程序，这个顺序由你决定.</p>
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> 刚才谈到了，endian指的是当物理上的最小单元比逻辑上的最小单元小时，逻辑到物理的单元排布关系。咱们接触到的物理单元最小都是byte，在通信领域中，这里往往是bit，不过原理也是类似的。</p>
<p><wbr></wbr> <wbr></wbr> <wbr></wbr> 实践可以给你更多的经验，比如在一个嵌入式系统的通信协议中，从底层射频驱动到上层的协议栈全部需要实现，那么很可能遇到多个endian的问题，底层的bit序、协议层的byte序、应用层的byte序，这些都是不同的概念.</p>
</div>
</div>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/%CD%F8%C2%E7">网络</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/be10234489b4f188b3b7dc3c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-12  17:57</pubDate>
        <category><![CDATA[网络]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/be10234489b4f188b3b7dc3c.html</guid>
</item>

<item>
        <title><![CDATA[Fedora 11/linux下麦克风没有声音或者噪音和不连续问题]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/10df311b767c5b138718bf62.html]]></link>
        <description><![CDATA[
		
		参考linuxeden帖子：<br>
http://www.linuxeden.com/forum/thread-190643-1-1.html<br>
<br>
问题现象：我是AMD780G主板，听歌正常但麦克风用不了，使用gnome-sound-recorder（应用程序-&gt;影音-&gt;录音机）录用只能录1秒不到的声音(网上有些网友反应根本录不到声音)。skype，amsn之类的聊天软件全部是哑巴，vxbox/vmware虚拟机的麦克风也没有声音。<br>
开始以为是驱动的问题，去realtek官方网站下了最新版本的驱动，编译安装后问题依旧；后来在偶的大本营linuxeden偶尔看到一个帖子才发现是pulseaudio配置文件的问题，而且好像mandrive，ubuntu等发行版都有类似的问题…………<br>
<br>
设置PulseAudio<br>
修改文件 /etc/pulse/daemon.conf<br>
<br>
老规矩，在修改前先备份文件 <br>
cp daemon.conf daemon.conf_back<br>
<br>
;打开7.1声道(如果你是8声道声卡就开，不是就别动)<br>
default-sample-channels = 8<br>
<br>
;下面两个参数需要根据自己的声卡调节<br>
default-fragments = 8<br>
default-fragment-size-msec = 10　　　　<br>
<br>
<p>修改保存后，重启PulseAudio</p>
<p>pulseaudio -k</p>
<p>pulseaudio --start</p>
<br>
重启pulseaudio之后再用gnome-sound-recorder录音试试是不是发现可以正常录音了？？<br>
<br>
搜索到的另外一个类似的帖子：<br>
http://blog.csdn.net/xianfengdesign/archive/2009/07/21/4367886.aspx 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/fc%26%2347%3B%BA%EC%C3%B1%20%CF%B5%C1%D0">fc&#47;红帽 系列</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/10df311b767c5b138718bf62.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-10  21:19</pubDate>
        <category><![CDATA[fc&#47;红帽 系列]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/10df311b767c5b138718bf62.html</guid>
</item>

<item>
        <title><![CDATA[排列组合公式[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/aecc238b55d485759e2fb4bf.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://hi.baidu.com/kingmax81/blog/item/0260f5127d517e55f819b80c.html<br>
<br>
<br>
<br>
<br>
<div class="cnt" >
<p>好久没有用，都忘掉了，好不容易找回点资料，慢慢捡回来吧</p>
<p> </p>
<div forimg="1">
<p><img border="0" src="http://hiphotos.baidu.com/kingmax81/pic/item/90d0533dc1b4cd11baa167f5.jpg" small="0" class="blogimg"></p>
<p><strong>排列定义</strong>&#160;&#160;  从n个不同的元素中，取r个不重复的元素，按次序排列，称为从n个中取r个的无重排列。排列的全体组成的集合用 P(n,r)表示。排列的个数用P(n,r)表示。当r=n时称为全排列。一般不说可重即无重。可重排列的相应记号为 P(n,r),P(n,r)。</p>
<p><strong>组合定义 </strong>从n个不同元素中取r个不重复的元素组成一个子集，而不考虑其元素的顺序，称为从n个中取r个的无重组合。<br>
组合的全体组成的集合用C(n,r)表示，组合的个数用C(n,r)表示，对应于可重组合<br>
有记号C(n,r),C(n,r)。</p>
<p>例1：用1、2、3、4、5、6、7、8、9组成数字不重复的六位数 <br>
集合A为数字不重复的九位数的集合，S（A）=9！ <br>
集合B为数字不重复的六位数的集合。 <br>
把集合A分为子集的集合，规则为前6位数相同的元素构成一个子集。显然各子集没有共同元素。每个子集元素的个数，等于剩余的3个数的全排列，即3！ <br>
这时集合B的元素与A的子集存在一一对应关系，则 <br>
S（A）=S（B）*3！ <br>
S（B）=9！/3！ <br>
这就是我们用以前的方法求出的P（9，6） <br>
<br>
例2：从编号为1-9的队员中选6人组成一个队，问有多少种选法？ <br>
设不同选法构成的集合为C，集合B为数字不重复的六位数的集合。把集合B分为子集的集合，规则为全部由相同数字组成的数组成一个子集，则每个子集都是某6个数的全排列，即每个子集有6！个元素。这时集合C的元素与B的子集存在一一对应关系，则 <br>
S（B）=S（C）*6！ <br>
S（C）=9！/3！/6！ <br>
这就是我们用以前的方法求出的C（9，6） <br>
<br>
以上都是简单的例子，似乎不用弄得这么复杂。但是集合的观念才是排列组合公式的来源，也是对公式更深刻的认识。大家可能没有意识到，在我们平时数物品的数 量时，说1，2，3，4，5，一共有5个，这时我们就是在把物品的集合与集合（1，2，3，4，5）建立一一对应的关系，正是因为物品数量与集合 （1，2，3，4，5）的元素个数相等，所以我们才说物品共有5个。我写这篇文章的目的是把这些潜在的思路变得清晰，从而能用它解决更复杂的问题。 <br>
<br>
例3：9个人坐成一圈，问不同坐法有多少种？ <br>
9个人排成一排，不同排法有9！种，对应集合为前面的集合A <br>
9个人坐成一圈的不同之处在于，没有起点和终点之分。设集合D为坐成一圈的坐法的集合。以任何人为起点，把圈展开成直线，在集合A中都对应不同元素，但在集合D中相当于同一种坐法，所以集合D中每个元素对应集合A中9个元素，所以S（D）=9！/9 <br>
<br>
我在另一篇帖子中说的方法是先固定一个人，再排其他人，结果为8！。这个方法实际上是找到了一种集合A与集合D之间的对应关系。用集合的思路解决问题的关键就是寻找集合之间的对应关系，使一个集合的子集与另一个集合的元素形成一一对应的关系。 <br>
<br>
例4：用1、2、3、4、5、6、7、8、9组成数字不重复的九位数，但要求1排在2前面，求符合要求的九位数的个数。 <br>
集合A为9个数的全排列，把集合A分为两个集合B、C，集合B中1排在2前面，集合C中1排在2后面。则S（B）+S（C）=S（A） <br>
在集合B、C之间建立以下对应关系：集合B中任一元素1和2位置对调形成的数字，对应集合C中相同数字。则这个对应关系为一一对应。因此S（B）=S（C）=9！/2 <br>
<br>
以同样的思路可解出下题： <br>
从1、2、3…，9这九个数中选出3个不同的数作为函数y=ax*x+bx+c的系数，且要求a&gt;b&gt;c，问这样的函数共有多少个？ <br>
<br>
例5：M个球装入N个盒子的不同装法，盒子按顺序排列。 <br>
这题我们已经讨论过了，我再用更形象的方法说说。 <br>
假设我们把M个球用细线连成一排，再用N-1把刀去砍断细线，就可以把M个球按顺序分为N组。则M个球装入N个盒子的每一种装法都对应一种砍线的方法。而 砍线的方法等于M个球与N-1把刀的排列方式（如两把刀排在一起，就表示相应的盒子里球数为0）。所以方法总数为C（M+N-1，N-1） <br>
<br>
例6：7人坐成一排照像, 其中甲、乙、丙三人的顺序不能改变且不相邻, 则共有________排法. <br>
解：甲、乙、丙三人把其他四人分为四部分，设四部分人数分别为X1，X2，X3，X4，其中X1，X4》=0，X2，X3》0 <br>
先把其余4人看作一样，则不同排法为方程 <br>
X1+X2+X3+X4=4的解的个数，令X2=Y2+1，X3=Y3+1 <br>
化为求X1+Y2+Y3+X4=2的非负整数解的个数，这与把2个球装入4个盒子的方法一一对应，个数为C（5，3）=10</p>
</div>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/%CB%E3%B7%A8%26%2347%3B%BA%AF%CA%FD">算法&#47;函数</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/aecc238b55d485759e2fb4bf.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-10  14:51</pubDate>
        <category><![CDATA[算法&#47;函数]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/aecc238b55d485759e2fb4bf.html</guid>
</item>

<item>
        <title><![CDATA[malloc和new的区别[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/2bc5f9f4ef9efcd3f3d3854c.html]]></link>
        <description><![CDATA[
		
		<div class="cnt">转自：<br>
http://hi.baidu.com/upbertrand/blog/item/55f9172b7f17e793023bf666.html<br>
<br>
1、new 是c++中的操作符，malloc是c 中的一个函数<br>
<br>
2、new 不止是分配内存，而且会调用类的构造函数，同理delete会调用类的析构函数，而malloc则只分配内存，不会进行初始化类成员的工作，同样free也不会调用析构函数<br>
<br>
3、内存泄漏对于malloc或者new都可以检查出来的，区别在于new可以指明是那个文件的那一行，而malloc没有这些信息。<br>
<br>
4、new 和 malloc效率比较<br>
<br>
new 有三个字母, malloc有六个字母<br>
<br>
new可以认为是malloc加构造函数的执行。<br>
<br>
new出来的指针是直接带类型信息的。<br>
<br>
而malloc返回的都是void指针。<br>
<br>
一：new delete 是运算符，malloc,free是函数<br>
<br>
malloc与free是C++/C语言的标准库函数，new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。<br>
<br>
对于非内部数据类型的对象而言，光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数，对象在消亡之前要自动执行析构函 数。由于malloc/free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数的任务强加于malloc/free。<br>
<br>
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new，以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。<br>
<br>
我们先看一看malloc/free和new/delete如何实现对象的动态内存管理，见示例。<br>
<br>
class Obj<br>
{<br>
public :<br>
Obj(void){ cout &lt;&lt; “Initialization” &lt;&lt; endl; }<br>
~Obj(void){ cout &lt;&lt; “Destroy” &lt;&lt; endl; }<br>
void&#160;&#160;&#160;&#160;&#160;  Initialize(void){ cout &lt;&lt; “Initialization” &lt;&lt; endl; }<br>
void&#160;&#160;&#160;&#160;&#160;  Destroy(void){ cout &lt;&lt; “Destroy” &lt;&lt; endl; }<br>
};<br>
<br>
<br>
<br>
void UseMallocFree(void)<br>
{<br>
Obj&#160;&#160;&#160;  *a = (obj *)malloc(sizeof(obj));&#160;&#160;&#160;&#160;  // 申请动态内存<br>
a-&gt;Initialize();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  // 初始化<br>
//…<br>
a-&gt;Destroy();&#160;&#160;&#160;&#160;  // 清除工作<br>
free(a);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  // 释放内存<br>
}<br>
<br>
<br>
<br>
void UseNewDelete(void)<br>
{<br>
Obj&#160;&#160;&#160;  *a = new Obj;&#160;&#160;&#160;  // 申请动态内存并且初始化<br>
//…<br>
delete a;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;  // 清除并且释放内存<br>
}<br>
<br>
<br>
示例用malloc/free和new/delete如何实现对象的动态内存管理<br>
<br>
<br>
类Obj的函数Initialize模拟了构造函数的功能，函数Destroy模拟了析构函数的功能。函数UseMallocFree中，由于 malloc/free不能执行构造函数与析构函数，必须调用成员函数Initialize和Destroy 来完成初始化与清除工作。函数UseNewDelete则简单得多。<br>
<br>
所以我们不要企图用malloc/free来完成动态对象的内存管理，应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程，对它们而言malloc/free和new/delete是等价的。<br>
<br>
既然new/delete的功能完全覆盖了malloc/free，为什么C++不把malloc/free淘汰出局呢？这是因为C++程序经常要调用C函数，而C程序只能用malloc/free管理动态内存。<br>
<br>
如果用free释放“new创建的动态对象”，那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内 存”，理论上讲程序不会出错，但是该程序的可读性很差。所以new/delete必须配对使用，malloc/free也一样。<br>
<br>
二：new delete在实现上其实调用了malloc,free函数。<br>
<br>
三：new operator除了分配内存，还要调用构造函数。<br>
<br>
<span >
<pre>malloc 只是分配指定大小的内存；<br>free 也只是释放之前申请的内存；<br>new 在分配内存后，还会调用分配的对象的构造函数；<br>delete 在释放之前分调用对象的析构函数；</pre>
</span></div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/c%D3%EF%D1%D4%D4%D3%BC%C7">c语言杂记</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/2bc5f9f4ef9efcd3f3d3854c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-09  10:41</pubDate>
        <category><![CDATA[c语言杂记]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/2bc5f9f4ef9efcd3f3d3854c.html</guid>
</item>

<item>
        <title><![CDATA[linux 下如何通过软件模拟按键[转-修改]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/ef91923810ca85f8b311c705.html]]></link>
        <description><![CDATA[
		
		<div class="g_blog_list">
<div class="g_t_center g_c_pdin g_p_center c07 content">
<div class="ns_content">转自：<br>
http://zhgw01.blog.163.com/blog/static/10414812200992854628702/<br>
<br>
参考<a target="_blank" href="http://www.linuxdiyf.com/viewarticle.php?id=104221">http://www.linuxdiyf.com/viewarticle.php?id=104221</a><br>
<br>
名词解释：<br>
scancode: 驱动对硬件的标记<br>
keycode： 上层应用程序所见的标记，跟硬件的标记不同， 一般为KEY_F1之类的宏<br>
<br>
一般驱动将scancode绑定到keycode<br>
对未绑定的scancode, 可以通过setkeycodes将将其绑定到未使用的keycode<br>
注： 有些按键会被解释成acpi event, 可以通过acpi_listen来监听，但不一定成功，目前还没具体了解<br>
<br>
模 拟按键是上层应用程序的行为， 所以不需要编译成模块，只需要想平常的应用程序那样编译就可以了， 不过它要包含&lt;linux/input.h&gt;这个文件， 同时要明确键盘对应的/dev/input/event[0-4]到底是哪个文件， 此外还需要以root权限来运行<br>
<br>
<font color="#ff0000">赖半仙注解：<br>
运行命令 cat /proc/bus/input/devices&#160; 在输出里面查找 xxx keyboard 对应的文件是/dev/input/event几。我开始想当然的以为键盘文件是event1,结果死人都调不出来，弄了很久最后从event0开始一个一个试，才发现我的手提电脑键盘文件对应的是event4。<br>
<br>
在我的电脑上运行命令 ls /dev/input/event* 发现有好多输入设备…………<br>
/dev/input/event0&#160; /dev/input/event10&#160; /dev/input/event2&#160; /dev/input/event4&#160; /dev/input/event6&#160; /dev/input/event8<br>
/dev/input/event1&#160; /dev/input/event11&#160; /dev/input/event3&#160; /dev/input/event5&#160; /dev/input/event7&#160; /dev/input/event9<br>
<br>
<br>
下面是 cat /proc/bus/input/devices 命令对应键盘文件的一段输出<br>
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41<br>
N: Name=&quot;AT Translated Set 2 keyboard&quot;<br>
P: Phys=isa0060/serio0/input0<br>
S: Sysfs=/devices/platform/i8042/serio0/input/input4<br>
U: Uniq=<br>
H: Handlers=kbd event4 <br>
B: EV=120013<br>
B: KEY=8000 0 0 0 0 0 5007 2002000 380307c f800d001 feffffdf ffefffff ffffffff ffffffff<br>
B: MSC=10<br>
B: LED=7<br>
<br>
下面的程序是模拟按键NumLock，就是控制小键盘灯的那个按键，按下去（运行程序没有问题）后小键盘灯就会点亮或者熄灭。</font><br>
<br>
<table border="1" width="100%" cellspacing="1" cellpadding="1" style="border: 1px solid ;">
    <tbody>
        <tr>
            <td>&#160;#include &lt;linux/input.h&gt;<br>
            #include &lt;time.h&gt;<br>
            #include &lt;fcntl.h&gt;<br>
            #include &lt;string.h&gt;<br>
            #include &lt;errno.h&gt;<br>
            #include &lt;stdio.h&gt;<br>
            <br>
            void simulate_key(int fd, unsigned int keycode, int keyvalue)<br>
            {<br>
            struct input_event event;<br>
            <br>
            event.type = EV_KEY;<br>
            event.co<wbr></wbr>de = keycode;<br>
            event.value = keyvalue;<br>
            gettimeofday(&amp;event.time, 0);<br>
            <br>
            if (write(fd, &amp;event, sizeof(event)) &lt; 0) {<br>
            printf(&quot;simulate key error\n&quot;);<br>
            return;<br>
            }else<br>
            printf(&quot;simuate key %d, %d\n&quot;, keycode, keyvalue);<br>
            }<br>
            <br>
            <br>
            <br>
            int main ( int argc, char *argv[] )<br>
            {<br>
            char *path = &quot;/dev/input/event1&quot;;<br>
            unsigned int key_co<wbr></wbr>de = KEY_NUMLOCK;&#160;&#160; //键值: NumLock<br>
            //unsigned int key_code = KYE_A;&#160;&#160;&#160;&#160;&#160; &#160; //键值：a &#160; <br>
            <br>
            if (argc &gt;= 3) {<br>
            path = argv[1];<br>
            key_co<wbr></wbr>de = atoi(argv[2]);<br>
            }else if (argc &gt;= 2)<br>
            path = argv[1];<br>
            <br>
            int fd_kbd = open(path, O_RDWR);<br>
            <br>
            if(fd_kbd &lt;= 0) {<br>
            printf(&quot;error open keyboard:%s\n&quot;, strerror(errno));<br>
            return -1;<br>
            }<br>
            <br>
            simulate_key(fd_kbd, key_co<wbr></wbr>de, 1);<br>
            simulate_key(fd_kbd, key_co<wbr></wbr>de, 0);<br>
            <br>
            close(fd_kbd);<br>
            <br>
            return 0;<br>
            }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* ----------&#160; end of function main&#160; ---------- */</td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/c%D3%EF%D1%D4%D4%D3%BC%C7">c语言杂记</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/ef91923810ca85f8b311c705.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-29  11:10</pubDate>
        <category><![CDATA[c语言杂记]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/ef91923810ca85f8b311c705.html</guid>
</item>

<item>
        <title><![CDATA[linux下如何模拟按键输入和模拟鼠标?[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/fcaf07358c5d991b91ef393c.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://blog.csdn.net/chenzhixin/archive/2008/03/12/2173530.aspx<br>
<h1 class="title_txt"><cite class="fav_csdnstylebykimi">      </cite></h1>
<div class="blogstory">


转贴请注明出处: blog.csdn.net/chenzhixin<br>
<br>
<h2><span>查看/dev/input/eventX是什么类型的事件， cat /proc/bus/input/devices</span></h2>
<br>
设备有着自己特殊的按键键码，我需要将一些标准的按键，比如0－9，X－Z等模拟成标准按键，比如KEY_0,KEY-Z等，所以需要用到按键 模拟，具体方法就是操作/dev/input/event1文件，向它写入个input_event结构体就可以模拟按键的输入了。<br>
<br>
linux/input.h中有定义，这个文件还定义了标准按键的编码等<br>
<br>
struct input_event {<br>
struct timeval time;&#160; //按键时间<br>
__u16 type; //类型，在下面有定义<br>
__u16 code; //要模拟成什么按键<br>
__s32 value;//是按下还是释放<br>
};<br>
<br>
code：<br>
事 件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/<strong style="color: black; background-color: rgb(255, 153, 153);">linux</strong>/input.h文件. 如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向<a name="baidusnap0"></a><strong style="color: black; background-color: rgb(255, 255, 102);">REL_X</strong>(代码为0x00),指示鼠标的Y轴方向REL_Y(代码为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).<br>
<br>
type: <br>
EV_KEY,键盘<br>
EV_REL,相对坐标<br>
EV_ABS,绝对坐标<br>
<br>
value：<br>
事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.<br>
<br>
/*<br>
* Event types<br>
*/<br>
<br>
#define EV_SYN&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x00<br>
#define EV_KEY&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x01 //按键<br>
#define EV_REL&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x02 //相对坐标(轨迹球)<br>
#define EV_ABS&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x03 //绝对坐标<br>
#define EV_MSC&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x04 //其他<br>
#define EV_SW&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x05<br>
#define EV_LED&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x11 //LED<br>
#define EV_SND&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x12//声音<br>
#define EV_REP&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x14//repeat<br>
#define EV_FF&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x15 <br>
#define EV_PWR&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x16<br>
#define EV_FF_STATUS&#160;&#160;&#160; &#160;&#160;&#160; 0x17<br>
#define EV_MAX&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 0x1f<br>
#define EV_CNT&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; (EV_MAX+1)<br>
<br>
<span style="font-weight: bold;">1。模拟按键输入</span><br>
<span style="color: rgb(153, 51, 0);">//其中0表示释放，1按键按下，2表示一直按下</span><br>
//0 for EV_KEY for release, 1 for keypress and 2 for autorepeat.<br>
void simulate_key(int fd,int value)<br>
{<br>
struct input_event event;<br>
<br>
event.type = EV_KEY;<br>
//event.code = KEY_0;//要模拟成什么按键<br>
event.value = value;//是按下还是释放按键或者重复<br>
gettimeofday(&amp;event.time,0);<br>
<br>
if(write(fd,&amp;event,sizeof(event)) &lt; 0){<br>
dprintk(&quot;simulate key error~~~\n&quot;);<br>
return ;<br>
}<br>
}<br>
<br>
<span style="font-weight: bold;">2。模拟鼠标输入</span>（轨迹球）<br>
void simulate_mouse(int fd,char buf[4])<br>
{<br>
int rel_x,rel_y;<br>
static struct input_event event,ev;<br>
<br>
//buf[0],buf[2],小于0则为左移，大于0则为右移<br>
//buf[1],buf[3],小于0则为下移，大于0则为上移<br>
dprintk(&quot;MOUSE TOUCH: x1=%d,y1=%d,x2=%d,y2=%d\n&quot;,buf[0],buf[1],buf[2],buf[3]);<br>
<br>
rel_x = (buf[0] + buf[2]) /2;<br>
rel_y = -(buf[1] + buf[3]) /2; //和我们的鼠标是相反的方向，所以取反<br>
<br>
event.type = EV_REL;<br>
<br>
event.code = REL_X;<br>
event.value = rel_x;<br>
gettimeofday(&amp;event.time,0);<br>
if( write(fd,&amp;event,sizeof(event))!=sizeof(event))<br>
dprintk(&quot;rel_x error~~~:%s\n&quot;,strerror(errno));<br>
<br>
event.code = REL_Y;<br>
event.value = rel_y;<br>
gettimeofday(&amp;event.time,0);<br>
if( write(fd,&amp;event,sizeof(event))!=sizeof(event))<br>
dprintk(&quot;rel_y error~~~:%s\n&quot;,strerror(errno));<br>
<br>
//一定要刷新空的<br>
write(fd,&amp;ev,sizeof(ev));<br>
}<br>
<br>
<br>
鼠标和键盘文件打开方法：<br>
<br>
int fd_kbd; // /dev/input/event1<br>
int fd_mouse; //dev/input/mouse2<br>
<br>
fd_kbd = open(&quot;/dev/input/event1&quot;,O_RDWR);<br>
if(fd_kbd&lt;=0){<br>
printf(&quot;error open keyboard:%s\n&quot;,strerror(errno));<br>
return -1;<br>
}<br>
<br>
fd_mouse = open(&quot;/dev/input/event3&quot;,O_RDWR); //如果不行的话，那试试/dev/input/mice<br>
if(fd_mouse&lt;=0){<br>
printf(&quot;error open mouse:%s\n&quot;,strerror(errno));<br>
return -2;<br>
}<br>
}<br>
<br>
<br>
/dev/input/mice是鼠标的抽象，代表的是鼠标，也许是/dev/input/mouse,/dev/input/mouse1，或者空，<br>
这个文件一直会存在。<br>
<br>
这里你也许会问，我怎么知道/dev/input/eventX这些事件到底是什么事件阿，是鼠标还是键盘或者别的，<br>
eventX代表的是所有输入设备(input核心)的事件，比如按键按下，或者鼠标移动，或者游戏遥控器等等，<br>
在系统查看的方法是&#160; cat /proc/bus/input/devices 就可以看到每个eventX是什么设备的事件了。<br>
<br>
PS: 在GTK中用的话，可以参考下gtk_main_do_event这个函数<br>
<br>
static void simulate_key(GtkWidget *window,int keyval,int press)<br>
{<br>
GdkEvent *event;<br>
GdkEventType type;<br>
<br>
if(press)&#160;&#160;&#160; <br>
type = GDK_KEY_PRESS;<br>
else <br>
type = GDK_KEY_RELEASE;<br>
<br>
event = gdk_event_new(type);<br>
//event-&gt;key.send_event = TRUE;<br>
event-&gt;key.window = window-&gt;window; //一定要设置为主窗口<br>
event-&gt;key.keyval = keyval;<br>
<br>
//FIXME:一定要加上这个,要不然容易出错<br>
g_object_ref(event-&gt;key.window);<br>
<br>
gdk_threads_enter();<br>
<br>
//FIXME: 记得用这个来发送事件<br>
gtk_main_do_event(event);<br>
<br>
gdk_threads_leave();<br>
gdk_event_free(event);<br>
}<br>
<br>
<br>
参考：<br>
http://cache.baidu.comc?m=9f65cb4a8c8507ed4fece763104e953f484380146d94975439c3933fc23846000c27feed727458199487223a52f91d07b4a72b72350124b298c98849dbbb942d24892c23706bc40354c75cf28b102a8177ce4de8df0ee0cee733e3e4c5d3ae0a0896144f&amp;p=882a975685cc42a934b4c23f4b47&amp;user=baidu<br>
<br>
<strong>Linux输入子系统分析</strong><br>
http://www.linuxdriver.cn/html/20079/113.htm</div> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/c%D3%EF%D1%D4%D4%D3%BC%C7">c语言杂记</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/fcaf07358c5d991b91ef393c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-29  10:59</pubDate>
        <category><![CDATA[c语言杂记]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/fcaf07358c5d991b91ef393c.html</guid>
</item>

<item>
        <title><![CDATA[SVN commit,update用法[转]]]></title>
        <link><![CDATA[http://hi.baidu.com/mgqw/blog/item/8d0fff1e691279fe1bd57685.html]]></link>
        <description><![CDATA[
		
		转自：<br>
http://blog.csdn.net/studyvcmfc/archive/2009/09/07/4528896.aspx<br>
<br>
<br>
<p>您是否有過這樣子的經驗, 在編修檔案的過程中, 尤其是在撰寫程式檔, 突然改爛了, 而想說: 如果我有辦法知道剛才改了什麼地方有多好! 或是在一份大作業或者是專案的情況下, 須要多個人一同改一份檔案, 總須事先說好誰要改哪個檔案, 改的時候別人都不能動, 以免在存檔的時候被互相覆蓋.</p>
<p>有這麼苦嗎?!</p>
<p>事實上這些工作, 都可以交給一套完善的版本控制系統 (Version Control System) 來解決. 接下來要介紹的這套系統名做 <a href="http://subversion.tigris.org/">[subversion]</a>  , subversion透過一個集中管理的檔案庫(repository), 記錄下每一次的更動, 於是您可以取得每一次修改的紀錄, 甚至還可以多個人一起改, subversion 會負責把兩個人的修正合併起來!</p>
<h2>安裝 Subversion</h2>
<p>首先您須要在您所要工作的機器上安裝 Subversion 這套系統. 若您的機器上已經安裝好了, 您可以跳過這一步.</p>
<ol>
    <li>若您在 <a href="http://in2.wiki.ptt.cc/-FreeBSD">FreeBSD</a>  底下, 請直接 cd /usr/ports/devel/subversion; make install</li>
    <li>若您在 Microsoft Windows 底下, 請至 <a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91</a>  下載最新的 Subversion 安裝檔安裝即可, 或者是選擇跟 Explorer 整合在一起, 可以用右鍵來選擇功能的 <a href="http://in2.wiki.ptt.cc/-TortoiseSVN">TortoiseSVN</a>  <a href="http://tortoisesvn.tigris.org/download.html">http://tortoisesvn.tigris.org/download.html</a></li>
</ol>
<p>若您使用其他的系統, 請參考 <a href="http://subversion.tigris.org/project_packages.html">http://subversion.tigris.org/project_packages.html</a>  . 目前 Subversion 能在許多的作業系統上面執行.</p>
<h2>checkout</h2>
<p>對於每一個專案, 通常會有一個專屬的檔案庫. 若您不打算自行架設, 您可以至 <a href="https://opensvn.csie.org/">https://opensvn.csie.org</a>  申請一個.</p>
<p>首先您需要從檔案庫中取一份資料至目前目錄下. 您需要使用 <strong>`svn checkout 檔案庫路徑 [目的地路徑]`</strong> , 例如說:</p>
<pre>~$ svn checkout http://OpenSVN.csie.org/demo<br><br>A  demo<br><br>A  demo/Makefile<br><br>A  demo/integer.c<br><br>A  demo/button.c<br><br>~$ cd demo              # 切換到工作目錄 (demo) 下面<br><br>~/demo$</pre>
<p>這時 svn會自動建立一個目錄, 若無指定 `目的地路徑` 的話則會以檔案庫路徑最一個目路為準 (以上例來說是 demo) , svn 將會作用在這個目錄底下.</p>
<h2>一般操作</h2>
<p>有兩個重要的指令, 分別是 svn update , 用來將檔案庫中的版本和本地端同步 (例如說有別人已經修正並上傳了) ; 另一個是 svn status , 可以看到本地端更動尚未上傳的情況. 若您尚不了解這是做什麼的並沒有關係, 接下來就會看到範例.</p>
<h2>加入檔案 svn add</h2>
<p>若要增加新的檔案進來, 請透過 `svn add &lt;file name&gt;`, 例如說我現在開始撰寫 newfile.c:</p>
<pre>~/demo$ vim newfile.c           # 開始編輯 newfile.c<br><br><br><br>~/demo$ svn status              # 看本地端的情況<br><br>?       newfile.c               # 前面加 ?表示該檔案尚未加入版本控制<br><br><br><br>~/demo$ svn add newfile.c       # 將其加入版本控制<br><br>A       newfile.c<br><br><br><br>~/demo$ svn status              # 看本地端的情況<br><br>A       newfile.c               # 有新增的檔案, 尚未上傳</pre>
<p>若要在這底下開新的目錄, 請透過 `svn mkdir &lt;dir name&gt;` , 或是先開好目錄, 再透過 `svn add &lt;dir name&gt;` 亦可.</p>
<h2>修改</h2>
<p>這時, 我可以針對我手上這一份檔案進行修改, 在我進行上傳(commit)前, 別人並不會看到這個更動, 所以並不用擔心我修正錯誤時, 別人會無法使用.</p>
<pre>~/demo$ vim integer.c           # 修改 integer.c<br><br>~/demo$ svn status<br><br>A       newfile.c<br><br>M       integer.c               # M 表是 modified</pre>
<h2>commit</h2>
<p>一旦修改到一個斷落或完成時 (若是在程式開發的情況下, 通常都是在至少可以順利 compile 過時)需要下 commit 這個指令, 將我本地端的修改送回檔案庫; 而在每次 commit 的時候, 可以順便附帶一個訊息, 表示這次 commit 時修正了什麼地方, 以方便之後在找尋的時候, 除了透過時間及作者外, 還能有一些其他的資訊. 我們稱這個訊息為 commit log , 建議最好要填寫, 就算是只有一行五六個字, 也勝於什麼都沒有寫. 若您的 commit log 只有一行, 可以直接透過 -m &quot;&lt;your commit log&gt;&quot; 加在 commit 後面, 如:</p>
<pre>~/demo$ svn commit -m &quot;fix bug&quot;</pre>
<p>或是直接用 svn commit , 這時它會自動跳出一個編輯器讓您輸入. 接著會看到像是這樣的畫面:</p>
<pre>Sending newfile.c<br><br>Sending integer.c<br><br>Transmitting file data..<br><br>Committed revision 57.</pre>
<p>表示完成, 此時在別的地方進行 svn update 時, 就會含有剛才您更新的資訊.</p>
<h2>總結</h2>
<p>透過 Subversion 進行開發的流程:</p>
<p>1.只有第一次的時候須要進行 svn checkout , 之後請從 2. 起即可</p>
<pre>svn checkout &lt;repository url&gt;</pre>
<p>2.假設有其他人在之間有進行修正, 所以先 svn update 更新到最新的版本</p>
<pre>svn update</pre>
<p>3.進行修正</p>
<p>4.再同步一次</p>
<pre>svn update</pre>
<p>(這時可以再用 svn status 觀看一下目前的結果, 以及可以透過 svn diff 觀看修正內容. 這將在後文介紹)</p>
<p>5.若有問題則回 3 再進行修正. 要不然確認後, 上傳自己的修正</p>
<pre>svn commit<br><font color="#ff0000"><br><br>在文章末尾转贴cu上一大牛的一篇文章，写得更加详细也更加复杂：<br>http://blog.chinaunix.net/u2/67750/showart_1212829.html</font></pre> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/mgqw/blog/category/%C8%ED%BC%FE%B9%A4%B3%CCsvn">软件工程svn</a>&nbsp;<a href="http://hi.baidu.com/mgqw/blog/item/8d0fff1e691279fe1bd57685.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-26  15:35</pubDate>
        <category><![CDATA[软件工程svn]]></category>
        <author><![CDATA[mgqw]]></author>
		<guid>http://hi.baidu.com/mgqw/blog/item/8d0fff1e691279fe1bd57685.html</guid>
</item>


</channel>
</rss>