关于作者

用户名:colding
笔名:colding
地区: 中国-北京
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



shadow

shadow的blog

Center of STL Study

最优秀的STL使用学习网站

C++之dozb的程序人生

BOOSTt学习网站

msdn library

访问统计:
文章个数:181
评论个数:2
留言条数:19




Powered by BlogDriver 2.1

colding forever

 

welcome to my blog

文章

浅谈C中的malloc和free
摘要:malloc和free 查看全文

- 作者: colding 2007年08月31日, 星期五 18:09  回复(0) |  引用(0) 加入博采

C和C++中如何互相调用(#ifdef __cplusplus)
摘要:C和C++中如何互相调用(#ifdef __cplusplus) 查看全文

- 作者: colding 2007年08月16日, 星期四 11:24  回复(0) |  引用(0) 加入博采

#ifdef的用法
摘要:灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。 查看全文

- 作者: colding 2007年08月14日, 星期二 10:26  回复(0) |  引用(0) 加入博采

shell精华集锦【转】
01) shell编程入门及脚本测试
02) shell脚本欣赏区
03) TCSH shell编程入门
04) Bash命令行处理[详解]
05) shell命令基础
06) Linux命令大集合
07) sed/awk与unix命令等价代码欣赏
08) 如何将数字转换为大写数字?
09) 出道算术题考考你?
10) 考考你?[关于数组]
11) 如何横排变竖排?
12) 关于屏幕定位显示
13) 如果确定某个特定字符在一个字串中的位置
14) 如何用shell产生随机数组
15) 如何处理键盘输入超时
16) 1到999999999的阵列,如何用shell实现?
17) 用dd命令去备份文件指定的部分
18) 一个自动解压缩rar的脚本
19) UNIXshell/LINUXshell--实例精解源代码
20) 常用的关机和重新启动命令
21) GNU 文本实用程序教程
22) 关于array中的变量替换? [分享]
23) 在bash下实现双窗口或多窗口的方法
24) awk引用变量的问题
25) awk命令实用详解
26) RPM常用命令及RPM中文手册
27) [精彩讨论]sed/awk的新问题
28) 优先级[nice/renice实例]
29) 制作像 nvidia驱动包 那样的可执行安装包
30) Shell的命令行编辑[vi&emacs命令行技巧征集]
31) 如何把一个命令的输出放进多个管道里去,并让那些管道命令并行化
32) 有什么好办法在解压缩过程中同时获取压缩包的内容目录结构的顶层目录呢?
33) Linux Shell简介(入门)
34) BASH最常见的激活模式
35) 论坛是否有expect的技术介绍[附:Expect中文教程]
36) 变态vi问答
37) 如何产生一个随机的字母和一个一位的数字?[已解决]
38) shell编程中${ }的用法[转]
39) 适用于ADSL的连接脚本。
40) 文本模式下手动画表格的脚本
41) grep,sed,awk命令实例大练习[大力推荐]
42) 一个小脚本,帮助你清除无用的rpm包(zt)
43) 关于网络流量统计
44) bash_profile和.bashrc有什么区别?[附:几个bash配置文件的说明]
45) 一个连网的实用脚本
46) ADSL上网脚本
47) slackware添加用户adduser脚本欣赏
48) Gawk手册
49) latex2pdf的脚本
50) BASH中字符串的处理[转]
51) 这个脚本怎么写?[about find&xargs]
52) ulimit使用方法
53) 几个shell自动化脚本
54) 判断XDSL上网方式的用户的网络工作情况的脚本
55) 自动ftp脚本[附录ftp命令大全]
56) 关于zero及NULL设备的讨论
57) 硬连接和软连接的区别的讨论[附:ln中文文档]
58) 将某一目录下以main开头的100个文件的文件名分别改为main1到main100
59) 搜索一首歌并调用XMMS播放的脚本
60) 关于如何设定控制台的彩色显示?
61) 我用DF命令后看到这样的信息是咋回事[附:各种文件系统介绍]
62) Linux [系统管理命令中文详解][转]
63) bash脚本调试器
64) 使用 /proc 文件系统来控制系统[转贴]
65) 如何在shell中将unix时间戳转换为系统时间
66) "2>&1" 是什么意思?[重定向问题合并]
67) 拿到一个好的五笔98码表+awk一例[合并]
68) rh9自动运行X程序的方法
69) MOUNT命令中各个参数的含义
70) 如何从HTML文件中提取charset
71) BASH shell set命令详解
72) VI高级命令集锦及VIM应用实例
73) Linux/UNIX命令dd简介
74) 怎么让cp显示拷贝的进度或者速度?
75) 如何将一个输出中的若干行分别赋值给变量?
76) 修改了一下startx,用于窗口管理器的选择
77) 我想把下面的人名改成第一个字母大字,其它小写
78) 系统备份用的脚本
79) [转贴]编译APACHE+PHP+MYSQL的一个脚本
80) shell脚本是否可编译成二进制文件????<讨论>
81) 如何阻止非root用户再shell下用Ctrl+Alt+Delete重启电脑
82) tr的使用方法[转贴]
83) 设置终端--stty使用方法[转贴]
84) BASH-HOWTO文档
85) 解读startx
86) 写了一个显示目录树的脚本,可输出不对
87) 如何開一term ?K在里头顯某個文件的內容??
88) 如何在脚本中应用dialog命令<欢迎讨论>
89)
90) find和xargs使用详解[转自《shell编程和unix命令》]
91) Redhat8 下脚本的一些问题
92) 删除文件跟恢复文件系列。
93) 防止误删文件的脚本
94) 熟练运用命令所必须的<正则表达式语法>
95) linux shell trap信号表
96) shell入门基础必备
97) 如何快速把带有大写字母的文件名改为全部小写?
98) Unix Shell 介绍 (author:S. R. Bourne)
99) 技巧:提示行魔术
100) 禁止用户登录脚本
101) 一个自动挂载dos分区的脚本
101) bash快捷键盘使用心得,非转载~~~
102) 几个可以加在SHELL配置脚本里面的小函数
103) 如何用bash提取网卡ip地址?
104) shell技巧交流区
105) 适合初学练习的一组小脚本
106) Linux 终端的彩色显示
107) 一个自动解压缩rar的脚本
108) 一道算术题
109) 如何把一个文件倒着读出来?
110) source命令的一个妙用
111) 压缩-分段-备份的实现
112) 设置命令提示符下的热键[转]
113) BASH教学实例
114) 用sed/awk合并两行
115) stty中文手册
116) VIM速查手册
117) VIMset选项详解
118) 自动mount各类分区的脚本
119) shell十三问(简体版PDF)
120) dialog中文man手册
121) 怎样得到终端的参数如长宽行数?
122) 判断一个数是否2的幂[讨论awk的扩展用途]
123) tr:超级工具:为数据做外科手术(dd, head, tail...)
124) 服务器诊所: Expect 超出预期
125) 再来一个tree脚本(原创)
126) 几种shell里的小括号,大括号结构和有括号的变量,命令的用法
127) bash中字符串的处理(参阅CU一贴后重整理)
128) Linux与unix shell编程学习体会(根据书和其他帖子整理)
129) 管理脚本语言
130)***sed新手使用进阶全功略!***
131) Linux解释器原理
132) RE,grep,sed,awk论坛题目总结!(不断整理中......)
待续...

- 作者: colding 2006年09月8日, 星期五 11:22  回复(2) |  引用(0) 加入博采

正则表达式基础
我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说:
1.1 句点符号
假 设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜 索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、 “tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:
1.2 方括号符号
为 了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说, 正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:
1.3 “或”符号
如 果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”, 使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分 组,具体请参见后面介绍。
1.4 表示匹配次数的符号
表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

假 设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符 (“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。


图一:匹配所有123-12-1234形式的社会安全号码
假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:


图二:匹配所有123-12-1234和123121234形式的社会安全号码
下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图三显示了完整的正则表达式。


图三:匹配典型的美国汽车牌照号码,如8836KV
1.5 “否”符号
“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。


图四:匹配所有单词,但“X”开头的除外
1.6 圆括号和空白符号
假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:


图五:匹配所有Moth DD,YYYY格式的日期
新出现的“\s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API(本文后面详细讨论)提取出它的值。修改后的正则表达式如图六所示:


图六:匹配所有Month DD,YYYY格式的日期,定义月份值为第一个组
1.7 其它符号
为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如表二所示:
表二:常用符号

例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“\d”。修改后的正则表达式如图七所示:


图七:匹配所有123-12-1234格式的社会安全号码

- 作者: colding 2006年09月5日, 星期二 18:26  回复(0) |  引用(0) 加入博采

三个UNIX文件时间ctime,mtime,atime(转)
当你同熟练的UNIX用户进行交谈时,你经常会听到他们傲慢地讲出术语“改变时间(change time)”和“修改时间(modification time)”。对于许多人(和许多字典而言),改变和修改是相同的。这里会有什么不同那?

改变和修改之间的区别在于是改某个组件的标签还是更改它的内容。如果有人说chmod a-w myfile,那么这是一个改变;如果有人说echo foo >;>;myfile。则这是一个修改。改变是文件的索引节点发生了改变;修改是文本本身的内容发生了变化。[文件的修改时间也叫时间标志 (timestamp).]

只要讨论改变时间和修改时间,就不可能不提到“访问时间(access time)”.访问时间是文件最后一次被读取的时间。因此阅读一个文件会更新它的访问时间,当它的改变时间并没有变化(有关文件的信息没有被改变),它的修改时间也同样如此(文件本身没有被改变)

有时,在许多地方改变时间或者“ctime”被错误地写成“创建时间”,包括某些UNIX参考手册。不要相信他们

- 作者: colding 2006年08月31日, 星期四 16:09  回复(0) |  引用(0) 加入博采

Linux中文件查找技术大全
shell基础二:查找技巧,find及xargs的使用
http://bbs.chinaunix.net/forum/v ... p;highlight=wingger

通过文件名查找法:
这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls"命令就能方便的查找出来, 那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文件放 到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道,则这 是可以使用如下命令:
find / -name httpd.conf

这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算机屏幕上显示出查找结果列表:
etc/httpd/conf/httpd.conf

这就是httpd.conf这个文件在Linux系统中的完整路径。查找成功。
如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。

无错误查找技巧:
在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇 到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目 录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现"ermissiondenied."(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入
find / -name access_log 2>;/dev/null

这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。

在Linux系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大型Linux系统和 容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用 find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find/ ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find/etc”就是只在 etc目录下查找文件。因为“find/etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。

根据部分文件名查找方法:
这个方法和在WINDOWS中查找已知的文件名方法是一样的。不过在Linux中根据部分文件名查找文件的方法要比在WINDOWS中的同类查找方法要强 大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入:
find /etc -name '*srm*'

这个命令表明了Linux系统将在/etc整个目录中查找所有的包含有srm这3个字母的文件,比如 absrmyz, tibc.srm等等符合条件的文件都能显示出来。如果你还知道这个文件是由srm 这3个字母打头的,那么我们还可以省略最前面的星号,命令如下:
find/etc -name 'srm*'  

这是只有像srmyz 这样的文件才被查找出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。

根据文件的特征查询方法:
如果只知道某个文件的大小,修改日期等特征也可以使用“find”命令查找出来,这和WINDOWS系统中的"搜索"功能是基本相同的。在微软的"搜索" 中WINDOWS中的"搜索助理"使得搜索文件和文件夹、打印机、用户以及网络中的其他计算机更加容易。它甚至使在Internet 上搜索更加容易。"搜索助理"还包括一个索引服务,该服务维护了计算机中所有文件的索引,使得搜索速度更快。使用"搜索助理"时,用户可以指定多个搜索标 准。例如,用户可以按名称、类型及大小搜索文件和文件夹。用户甚至可以搜索包含特定文本的文件。如果用户正使用 Active Directory,这时还可以搜索带有特定名称或位置的打印机。

例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询find / -size 1500c,字符 c 表明这个要查找的文件的大小是以bytes为单位。如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查找方式来解决。例如我们输 入find/ -size +10000000c 这个命令,则标明我们指定系统在根目录中查找出大于10000000字节的文件并显示出来。命令中的“+”是表示要求系统只列出大于指定大小的文件,而使 用“-”则表示要求系统列出小于指定大小的文件。下面的列表就是在Linux使用不同“ find"命令后系统所要作出的查找动作,从中我们很容易看出在Linux中使用“find"命令的方式是很多的,“ find"命令查找文件只要灵活应用,丝毫不必在WINDOWS中查找能力差。

find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件


下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变状态的文件
-ctime n
查找系统中最后n*24小时被改变状态的文件
-empty
查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
-false
查找系统中总是错误的文件
-fstype type
查找系统中存在于指定文件系统的文件,例如:ext2 .
-gid n
查找系统中文件数字组 ID 为 n的文件
-group gname
查找系统中文件属于gnam文件组,并且指定组和ID的文件


Find命令的控制选项说明:
Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。
选项
用途描述
-daystart
.测试系统从今天开始24小时以内的文件,用法类似-amin
-depth
使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-follow
遵循通配符链接方式查找&#59; 另外,也可忽略通配符链接方式查询
-help
显示命令摘要
-maxdepth levels
在某个层次的目录中按照递减方法查找
-mount
不在文件系统目录中查找, 用法类似 -xdev.
-noleaf
禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-version
打印版本数字


使用-follow选项后,find命令则遵循通配符链接方式进行查找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。

-maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令
find . -maxdepth 2 -name fred

假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在. /sub1/sub2/fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文 件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。

使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如我们想在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件,我们可以使用-and 来把两个查找选项链接起来组合成一个混合的查找方式。
find /tmp -size +10000000c -and -mtime +2

学习过计算机语言的朋友都知道,在计算机语言里,使用and ,or 分别表示“与”和“或”的关系。在Linux系统的查找命令中一样通用。
还有这样的例子,
find / -user fred -or -user george

我们可以解释为在/tmp目录中查找属于fred或者george这两个用户的文件。
在find命令中还可以使用“非”的关系来查找文件,如果我们要在/tmp目录中查找所有不属于panda的文件,使用一个简单的
find /tmp ! -user panda  
命令就可以解决了。很简单。

查找并显示文件的方法
查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用。
find / -name "httpd.conf" -ls

系统查找到httpd.conf文件后立即在屏幕上显示httpd.conf文件信息。
12063 34 -rw-r--r-- 1 root root 33545 Dec 30 15:36 /etc/httpd/conf/httpd.conf

下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法
选项
用途描述
-exec command&#59;
查找并执行命令
-fprint file
打印文件完整文件名
-fprint0 file
打印文件完整文件名包括空的文件
-fprintf file format
打印文件格式
-ok command&#59;
给用户命令执行操作,根据用户的Y 确认输入执行
-printf format
打印文件格式
-ls
打印同种文件格式的文件.

xargs

      在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。但有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是x a rg s命令的用处所在,特别是与f i n d命令一起使用。

       F i n d命令把匹配到的文件传递给x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

      在有些系统中,使用- e x e c选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
       而使用x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

      来看看x a rg s命令是如何同f i n d命令一起使用的,并给出一些例子。

      下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类文件

CODE:

#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
......
在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

CODE:

$ find / -name "core" -print | xargs echo "" >/tmp/core.log
上面这个执行太慢,我改成在当前目录下查找

CODE:

#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6
在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:

CODE:


# ls -l
drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
用g r e p命令在所有的普通文件中搜索hostname这个词:

CODE:

# find . -type f -print | xargs grep "hostname"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
用g r e p命令在当前目录下的所有普通文件中搜索hostnames这个词:

CODE:

# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

- 作者: colding 2006年08月31日, 星期四 16:00  回复(0) |  引用(0) 加入博采

用FUSE开发自己的文件系统二 [转]

定义 RX RPC

在更进一步之前, 你需要定一个你的RX RPC . 为了做到这个, 要为rxgen创建一个.xg 文件, 来描述你的将用afsfuse_client.c afsfuse_server.c被连接起来的代理和桩代码. Listing 2 描述了怎么创建含有以下内容的afsfuse.xg 文件:


Listing 2. 创建一个afsfuse.xg 文件

#define MYMAXPATH 512

#include <rx/rx.h>

#include </rx_null.h >

#define SAMPLE_SERVER_PORT 5000

#define SAMPLE_SERVICE_PORT 0

/* i.e. user server's port */

#define SAMPLE_SERVICE_ID 4 /* Maximum number of requests that will be handled by this

                                service simultaneously */

/* This number will also be guaranteed to execute in parallel if no services' requests

   are being processed */

#define SAMPLE_MAX 2 /* Minimum number of requests that are guaranteed to be handled

                         immediately */

#define SAMPLE_MIN 1 /* Index of the "null" security class in the sample service. This

                         must be 0 (there are N classes, numbered from 0. In this case,

                         N is 1) */

#define SAMPLE_NULL 0 /********************** fuse4_file_info taken from fuse.h the

                        rxgen does not understands fuse.h  mystat taken from man 2

                        mystat these are required again rxgen does not understand the

                        struct paras and will bump.. **********************/

struct my_file_info { /** Open flags. Available in open() and release() */

                     int flags; /** File handle. May be filled in by filesystem in

                                    open(). Available in all other file operations */

                     unsigned int fh; /** In case of a write operation indicates if

                                          this was caused by a writepage */

                     int writepage;

                    };

struct mystatfs {

                    afs_uint32 f_type; /* type of filesystem (see below) */

                    afs_uint32 f_bsize; /* optimal transfer block size */

                    afs_uint32 f_blocks; /* total data blocks in file system */

                    afs_uint32 f_bfree; /* free blocks in fs */

                    afs_uint32 f_bavail; /* free blocks avail to non-superuser */

                    afs_uint32 f_files; /* total file nodes in file system */

                    afs_uint32 f_ffree; /* free file nodes in fs */

                    afs_uint32 f_fsid1; /* file system id */

                    afs_uint32 f_fsid2; /* file system id */

                    afs_uint32 f_namelen; /* maximum length of filenames */

                    afs_uint32 f_spare[6]; /* spare for later */

                };

struct mystat {

                    afs_uint32 st_dev; /* device */

                    afs_uint32 st_ino; /* inode */

                    afs_uint32 st_mode; /* protection */

                    afs_uint32 st_nlink; /* number of hard links */

                    afs_uint32 st_uid; /* user ID of owner */

                    afs_uint32 st_gid;/* group ID of owner */

                    afs_uint32 st_rdev; /* device type (if inode device) */

                    afs_uint32 st_size; /* total size, in bytes */

                    afs_uint32 st_blksize; /* blocksize for filesystem I/O */

                    afs_uint32 st_blocks; /* number of blocks allocated */

                    afs_uint32 st_atim; /* time of last access */

                    afs_uint32 st_mtim; /* time of last modification */

                    afs_uint32 st_ctim; /* time of last change */

                };

struct my_dirhandle{

                    afs_uint32 type;

                    afs_uint32 inode;

                    char name[MYMAXPATH];

                };

typedef my_dirhandle bulkmydirhandles<>;

 /*********************phase 1 functions *********************************************/

rxc_getattr(IN string mypath<MYMAXPATH>, IN int dummy) split = 1;

rxc_getdirWrapper(IN string path<MYMAXPATH>, OUT bulkmydirhandles *handles) = 2;

rxc_read(IN string path<MYMAXPATH>;, IN afs_uint32 size, IN afs_uint32 offset,

         IN struct my_file_info *fi) split = 3;

rxc_open(IN string path<MYMAXPATH>, IN int flags, OUT u_int *hd) = 4;

rxc_write(IN string path<MYMAXPATH>,IN afs_uint32 size, IN afs_uint32 offset,

          IN struct my_file_info *fi) split = 5;

rxc_chmod(IN string path<MYMAXPATH>, IN afs_uint32 mode) = 6;

rxc_chown(IN string path<MYMAXPATH>, IN afs_uint32 uid, IN afs_uint32 gid) = 7;

rxc_utime(IN string path<MYMAXPATH>, IN afs_uint32 at,IN afs_uint32 mt) = 8;

rxc_mknod(IN string path<MYMAXPATH>, afs_uint32 mode, afs_uint32 rdev) = 9 ;

rxc_mkdir(IN string path<MYMAXPATH>, IN afs_uint32 mode) = 10;

rxc_unlink(IN string path<MYMAXPATH>) = 11 ;

rxc_rmdir(IN string path<MYMAXPATH>) = 12;

rxc_rename(IN string from<MYMAXPATH>, IN string to<MYMAXPATH>) = 13;

rxc_truncate(IN string path<MYMAXPATH>, IN afs_uint32 size) = 14;

rxc_release(IN string path<MYMAXPATH>, IN struct my_file_info *fi) = 15;

rxc_readlink(IN string path<MYMAXPATH>, IN afs_uint32 size,OUT string

             data<MYMAXPATH>) = 16;

rxc_symlink(IN string from<MYMAXPATH>, IN string to<MYMAXPATH>) = 17;

rxc_link(IN string from<MYMAXPATH>, IN string to<MYMAXPATH>) = 18;

rxc_statfs(IN string path<MYMAXPATH>, OUT struct mystatfs *stbuf) = 19;

rxc_fsync(IN string path <MYMAXPAT>, IN int isdatasync, IN struct my_file_info

          *fi) = 20 ;

rxc_flush(IN string path <MYMAXPATH>, IN struct my_file_info *fi) = 21 ;

 

当要定义这个RX RPC 层的时候, 请注意下面的几点:

  • 你已经定义的 mystatfs, mystat, my_file_info 作为一个在 statfs, stat, fuse_file_info 机构体之上的包装器. 这些将是用生成的XDR 代码在网络上传输. (XDR, External Data Representation, 允许数据用一个构架-独立的风格被包装以便数据能在不同种类的计算机系统上传输.)
  • 你几乎已经为结构体fuse_operations 中的每一个成员定义了一个参数几乎相同的函数since the job of the 因为afsfuse_client 的工作只是从 FUSE 文件系统中取出调用并把他们传递到afsfuse_server.
  • 你已经采用了类似于MYMAXPATH的一些来自于系统的硬编码 在这里采用硬编码只是出于简单的理由.

 

 

创建客户端和桩文件

下一步是编译rxgen afsfuse.xg 文件去生成客户端和桩文件. 从包含afsfuse_server afsfuse_client的源代码的目录里, 运行命令 openafs-1.2.13/i386_linux24/dest/bin/rxgen afsfuse.xg. 这将生成下面的文件:

  • afsfuse.cs.c 是要和afsfuse_client.c被连接的客户端桩代码.
  • afsfuse.h 是包含你的FUSE RX代码的大量定义的头文件.
  • afsfuse.ss.c 是要和你的afsfuse_server代码进行连接的服务器桩代码(代理代码).
  • afsfuse.xdr.c 包含你在你的afsfuse.xg文件里定义的三个结构体的代码.

现在增加一些做实际工作的代码到afsfuse_client.c afsfuse_server.c 文件里. 几乎这些调用看起来都像下面那样:

  • Our_call_in_afs_fuse_client(). 包装(Marshall)参数并为RPC做准备. 调用RX [RPC] 之上的afsfuse_server 应用程序. 解包(Demarshall)参数. 拷贝值到这些函数里的正式的参数.
  • Our_call_in_afs_fuse_server().解包(Demarshall)参数. 调用本地文件系统或者AFS的特定函数. 包装参数并为RPC做准备. 做一个 RX RPC 调用.

afsfuse_client.c 调用看起来像下面那样:

int afsfuse_readlink(const char *path, char *buf, size_t size){

    rx_connection *local& int ret& char *buffer = malloc (512)&

    memset(buffer,0,512)& memset(buf,0,size)& local = getconnection()&

    ret = rxc_rxc_readlink(local,path,512,&buffer) // rpc call

         relconnection(local)&

         strncpy(buf,buffer,512-1)&

        //<- demarshall the parametrs

        return ret&

    }

 

afsfuse_server.c 的调用看起来像下面那样:

Listing 3. afsfuse_server.c 的调用

int rxc_rxc_readlink( struct rx_call *call, char * path, afs_uint32 size, char**data)

    { int ret& char lbuff[512] ={0}&

    translatePath(path,lbuff)& //<- make filesystem call

     *data = malloc(512)&

     res = readlink(lbuff, *data, 512-1)&

     if(res == -1) return -errno& (*data)[res] = '\0'& return 0&

    }

 

同样的, 你可以最佳一个代码到其他的函数里去加强你的文件系统.

你将需要创建一个makefile文件去编译你的代码. 记住当编译afsfuse_client的代码时要包含下面的选项: -D_FILE_OFFSET_BITS=64 and -DFUSE_USE_VERSION=22.


Listing 4.
生成makefile文件去编译客户端代码

SRCDIR=./ LIBRX=${SRCDIR}lib/librx.a

LIBS=${LIBRX} ${SRCDIR}lib/liblwp.a

#CC = g++

CFLAGS=-g -I. -I${SRCDIR}include -I${SRCDIR}include/fuse/ -DDEBUG ${XCFLAGS}

    -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=22

afsfuse_client: afsfuse_client.o afsfuse.xdr.o ${LIBS} bulk_io.o afsfuse.cs.o

    ${CC} ${CFLAGS} -o afsfuse_client afsfuse_client.o ${SRCDIR}lib/fuse/fuse.o

    ${SRCDIR}lib/fuse/mount.o ${SRCDIR}lib/fuse/helper.o

    ${SRCDIR}lib/fuse/fuse_mt.o bulk_io.o afsfuse.cs.o afsfuse.xdr.o ${LIBS}

afsfuse_server: afsfuse_server.o afsfuse.xdr.o afsfuse.ss.o bulk_io.o ${LIBS}

    ${CC} ${CFLAGS} -o afsfuse_server afsfuse_server.o bulk_io.o afsfuse.ss.o

    afsfuse.xdr.o ${LIBS}

#afsfuse_client.o: afsfuse.h

#afsfuse_server.o: afsfuse.h

bulk_io.o: ${CC} -c -g -I${SRCDIR}include bulk_io.c afsfuse.cs.c afsfuse.ss.c

    afsfuse.er.c afsfuse.h afsfuse.xdr.c: afsfuse.xg rxgen afsfuse.xg

afsfuse.xdr.o: afsfuse.xdr.c ${CC} -c -g -I{SRCDIR}include afsfuse.xdr.c

all: afsfuse_server afsfuse_client

clean: rm *.o rm afsfuse_client rm afsfuse_server

 

记住, 你将需要使用librx.a liblwp.a 去连接RX LWP 代码. 并且fuse/fuse.o, fuse/helper.o, fuse/mount.o 你需要连接的FUSE .

 

 

结论

本文里, 你已经学到了怎么去安装FUSE OpenAFS 并且怎么去使用它们去创建和定制你自己的用户空间文件系统, 一个在Linux里完全功能的, 稳定的文件系统而且不要求你去给你当前的内核去打补丁或者重新编译它-- 你甚至不用去了解内核的模块编程. 你已经看见了在使能一个FUSE文件系统里的两个关键概念的细节: 怎么去安装和配置FUSE内核模块,以及怎么去撬动FUSE 库和 APIs的能量.

 

 

下载

Description

Name

Size

Download method

AFSFuse filesystem sample code

l-fuse.zip

9KB

HTTP

http://www-128.ibm.com/developerworks/linux/library/l-fuse/?ca=dgr-lnxw09FUSE

- 作者: colding 2006年08月24日, 星期四 17:52  回复(0) |  引用(0) 加入博采

用FUSE开发自己的文件系统一 [转]

FUSE开发自己的文件系统

不需要内核编程知识



Level: Introductory

Sumit Singh (sumising@in.ibm.com), Software Engineer, IBM

28 Feb 2006

Filesystem in Userspace (FUSE), 你能开发一个用户空间的文件系统框架,而不需要了解文件系统地内部或者学习内核模块编程的相关知识. 按照本文的例子, 一步一步的指导你去安装, 定制, 和使能FUSE AFS文件系统, 因此你能在Linux®的用户空间创建一个你自己的拥有完全机能的文件系统.

一个文件系统是一种存储和管理计算机文件和目录以及他们包含的数据的有效方法, 而且还能让你很容易得去找道河访问它们.如果你使用过计算机, 你应该用过不止一种文件系统. 一个文件系统能提供一些扩展能力. 它能在一个基本的文件系统上写一个包装器去管理它的数据,并且还能够体统一个加强的,功能丰富的文件系统 (例如cvsfs-fuse, 就是一个给CVS提供了一个文件系统接口, 还有Wayback 文件系统, 就是为了保存老的拷贝数据提供了一个备份机制).

在用户空间文件系统没有出现之前, 文件系统开发是内核开发者的一个工作. 创建一个文件系统则需要了解内核编程和内核技术的相关知识 (就像 vfs). 并且调试的时候还需要C C++ 专门技术. 然而其他的开发者需要操控一个文件系统 —— 只是加入一些个人的特征(例如增加历史纪录或者正向缓存forward-caching) 和改进.

FUSE简介

FUSE让你开发一个拥有简单API库的全功能文件系统, 并能让非特权用户访问, 而且提供了一个安全实现. 另外, 更妙的是, FUSE有一个经过验证的可跟踪的稳定版.

使用 FUSE, 你能开发一个连接到FUSE 库的文件系统就像一个可执行的二进制程序一样 -- 也就是说, 这个文件系统框架不要求你去学习额外的文件系统内部和内核模块的编程知识.

FUSE真正成为一个文件系统之前, 用户空间的文件系统并不是一个新的设计. 下面有些关于商业和学术上实现的用户空间的文件系统的例子:

  • LUFS是一个混血的用户空间文件系统构架,它为所有应用程序提供了数量不定的文件系统. 它分成内核模块和用户空间的后台程序两部分. 基本上它把大多数VFS层的调用委派给专门来处理这些的后台进程.
  • UserFS 允许用户进程作为一个正常的文件系统被挂载. 以这个proof-of-concept为原型开发了ftpfs, 一个允许匿名FTP的文件系统.
  • Ufo 工程是一个Solaris的全局文件系统,它允许用户把远程文件当作本地文件来使用.
  • OpenAFS是一个Andrew FileSystem的开源版本.
  • CIFS一个普通的网际文件系统.

不像这些商业和学术例子, FUSE把文件系统设计的功能带到Linux. 因为FUSE 一个可执行的程序(而不是说, 作为LUFS 使用的一个共享对象), 它让调试和开发变得容易起来. FUSE能工作在内核(2.4.x