免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: guochunning
打印 上一主题 下一主题

更改文件一个字段,但又不想产生新文件 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-10-08 09:57 |只看该作者

回复 19楼 r2007 的帖子

具体说来, 是这样的.
对于一个文件来说, 要使文件所占的磁盘成为空闲, 需要两个条件
1, 指向该块的inode为0(符号链接不算)
2, 当前已经没有打开该文件的进程


exec 8 < file, shell在当前的shell进程里面打开文件描述符8, 通过该描述符, 可以读取文件file.
注意, file已经被shell进程占用了.
接着 rm file. inode 变成了0, 但是注意条件2
接着
sed < &8, 注意, sed是shell进程fork, 然后exec 来执行的, 而且没有设置exec关闭打开文件描述符位, 这样,
shell打开的8号描述符被sed继承了. 8号描述符被父子(shell/sed) 共享. sed 仍然可以通过8号描述符读取文件的内容. unix都是这么设计的. 可以放心的使用.

不知道我说明白了没有 ...

论坛徽章:
0
22 [报告]
发表于 2006-10-08 10:00 |只看该作者
原帖由 寂寞烈火 于 2006-9-30 14:03 发表

不会吧~,我测试过! 要是真是这样的话awk也太弱了! 同意waker的,应该跟awk有关! 块的大小跟fs有关!


也许你是对的, 我主要从一个unix程序员的角度看待了这个问题. 同事参考了awk的limitations, 发现没有关于多行缓冲的限制, 于是猜测的awk使用的stdio的限制.
我也没有具体的根据

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
23 [报告]
发表于 2006-10-08 10:14 |只看该作者

回复 21楼 ivhb 的帖子

谢谢回复。
--------------------------------------------------------------------
对于一个文件来说, 要使文件所占的磁盘成为空闲, 需要两个条件
1, 指向该块的inode为0(符号链接不算)
2, 当前已经没有打开该文件的进程
---------------------------------------------------------------------
对于这个说法,我认为是和具体的FS相关的,超出了shell的范畴。
我是这么分析的:假设,挂载的分区是一个fat32文件系统,或者nfs,能保证该脚本的通用性吗?
以上是我的观点,欢迎探讨。

论坛徽章:
0
24 [报告]
发表于 2006-10-08 10:41 |只看该作者
8C!

论坛徽章:
0
25 [报告]
发表于 2006-10-08 11:39 |只看该作者
从网上摘下来的一段

  1. 从使用者的观点来看,我们可以用档案的绝对路径来代表某个档案而不会出错。在VFS里,它并不是用路径来代表档案的。它是用一个叫Inode的东西来代表的。基本上,档案系统里的每一个档案,系统都会给它一个Inode,只要Inode不一样,就表示这二个档案不是同一个,如果两个的Inode一样,就表示它们是同一个档案。
  2. ///////////////////////////////////////////
  3. 其实,Inode是VFS所定义的,而我们知道VFS里包含了好几种的档案系统,并不是每一个档案系统都会有Inode的这种概念。就像FAT,事实上它跟本没有所的Inode概念。但是当VFS要求FAT去读取某个档案时,事实上它是把那个档案的Inode传给FAT去读。所以,在 VFS来讲,每一个档案都有其对应的Inode,但是在底层的档案系统不见得是这种情形。因此,VFS跟底层的档案系统沟通也是经过一层的接口。比方说, VFS要open一个位于FAT的档案时,VFS会配置一个Inode,并把这个Inode传给FAT,FAT要负责填入一些资料到Inode里,必要时,也可以在Inode里加入自己所需要的资料。再打个比方,VFS要读取FAT里档案的内容,反正VFS就是把Inode给FAT,并且告诉它从那里开始读,读多少个byte。其余的就是FAT的事,它就要想办法读出来。
  4. ////////////////////////////////////////////
  5. 用""上有政策,下有对策""这句话来描述VFS跟底层的档案系统的互动可能还蛮适合的。VFS的政策就是要以Inode为单位,但是底层的档案系统还是照自己的方式去存放档案,只要表面上将Inode填好,VFS要的东西给他就行了。
复制代码

上面这段话已经很好的说明在LINUX上读写文件系统根本没什么实质上区别它们都提供了统一的接口由系统进行管理我们只要调用系统调用和标准库函数就行了其它的都交给VFS来做底层是怎么实现的在我们shell编程人员并不去用关心

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
26 [报告]
发表于 2006-10-08 12:08 |只看该作者

回复 25楼 lovesaka 的帖子

这段文章能说明,各种文件系统对释放块的操作都是同一个逻辑吗?
我没看出来,还请明示。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
27 [报告]
发表于 2006-10-08 13:34 |只看该作者
原帖由 r2007 于 2006-10-8 12:08 发表
这段文章能说明,各种文件系统对释放块的操作都是同一个逻辑吗?
我没看出来,还请明示。


文件节点里存有文件数据占用块的信息。
文件的节点没有被释放之前,文件数据占用的块不会被释放: 这个逻辑是一定的。

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
28 [报告]
发表于 2006-10-08 15:08 |只看该作者
原帖由 yjh777 于 2006-10-8 13:34 发表


文件节点里存有文件数据占用块的信息。
文件的节点没有被释放之前,文件数据占用的块不会被释放: 这个逻辑是一定的。

用loop device作了一下测试

dd if=/dev/zero of=test.img bs=1024 count=1440
mkfs -t msdos test.img
mount test.img /mnt/floppy -t msdos -o loop
cd /mnt/floppy/
echo 1 > a
df
exec 9<>a
rm -f a
df
cat <&9
exec 9>&-
df

发现在文件关闭之前磁盘空间没有释放。
有收获!谢谢楼上各位。
BTW:里外里其实就是mv+rm的方法。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
29 [报告]
发表于 2006-10-08 17:05 |只看该作者
原帖由 r2007 于 2006-10-8 15:08 发表

用loop device作了一下测试

dd if=/dev/zero of=test.img bs=1024 count=1440
mkfs -t msdos test.img
mount test.img /mnt/floppy -t msdos -o loop
cd /mnt/floppy/
echo 1 > a
df
exec 9<> ...
发现在文件关闭之前磁盘空间没有释放。
有收获!谢谢楼上各位。
BTW:里外里其实就是mv+rm的方法。

没错,在某一时刻还是用了两个文件大小的空间。
要从根本上解决还是用ed ex vi这些交互式编辑器的脚本编辑功能比较好。其实为了保持数据一致/安全性vim默认
也是先打开一个临时文件进行编辑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP