浅谈Linux下mv和cp命令的区别--转载
2015-03-20 21:03
429 查看
我之前在项目中遇到一个很奇怪的问题,对于inotify监视一个文件的时候,发现有些时候inotify有些时候会
“失效”。后来我就没办法,去监视文件所在的目录。看下面的,
奇怪的现象就是如果我 mv test.txt /tmp/test/test.txt 的时候,发现 inotify 竟然没有除非,但是我无意中
发现 cp test.txt /tmp/test/test.txt 的时候,强制覆盖了,发现 inotity 就触发了。我这两天上OS的时候,突
然间想到了原因。可能是 inode 节点的问题,看下面
上面注意 inode 节点的变化,cp 的时候是真正意义上的内容copy,对于 inode 节点却是不会变化的
mv 的时候是把目标文件直接删除了(inode 删除了),新的文件其实已经不是以前的文件了,只是名字
一样而已。这样就可以解释 inotify 的“异常”了,mv 之后原文件的 inode 节点都已经删除了,inotify是跑
在内存里面的,它依然在读取之前的 inode 节点,但是已经删除了,这导致了inotify挂了。
inode 是OS在磁盘上寻找文件一个必不可少的,下面可以再来看个例子.
上面的程序就是向1.txt写文件,前提是 1.txt 是存在的,真正的原因就是没有 inode 节点,也就没有了对应
的磁盘文件.现在假设有了 1.txt 这时候程序 1s 钟写一次文件,我们 mv 1.txt 2.txt ,这时候会发现程序竟
然向 2.txt 里面写数据了,原因就是程序是在内存里面,对于1.txt 的抽象就是文件描述符号,write只认识它
,write 通过写描述符,描述符去找相应的 inode 节点,然后写磁盘.mv 了之后 inode 节点还是存在的,也
就是写 2.txt 了.
“失效”。后来我就没办法,去监视文件所在的目录。看下面的,
[python] view plaincopyprint? #!/bin/bash src=/tmp/test/test.txt # directory to monitor /usr/local/bin/inotifywait -rmq -e modify $src | while read event do echo "hello" done
奇怪的现象就是如果我 mv test.txt /tmp/test/test.txt 的时候,发现 inotify 竟然没有除非,但是我无意中
发现 cp test.txt /tmp/test/test.txt 的时候,强制覆盖了,发现 inotity 就触发了。我这两天上OS的时候,突
然间想到了原因。可能是 inode 节点的问题,看下面
上面注意 inode 节点的变化,cp 的时候是真正意义上的内容copy,对于 inode 节点却是不会变化的
mv 的时候是把目标文件直接删除了(inode 删除了),新的文件其实已经不是以前的文件了,只是名字
一样而已。这样就可以解释 inotify 的“异常”了,mv 之后原文件的 inode 节点都已经删除了,inotify是跑
在内存里面的,它依然在读取之前的 inode 节点,但是已经删除了,这导致了inotify挂了。
inode 是OS在磁盘上寻找文件一个必不可少的,下面可以再来看个例子.
[python] view plaincopyprint? #include <stdio.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> int main(int argc, char const *argv[]) { /* code */ int fd = open("./1.txt",O_RDWR); char buff[256] = {'\0'}; if (fd < 0) { printf("error open file\n"); exit(1); } int i = 0; while(1) { sprintf(buff,"%d %s\n",i,"hello"); write(fd,buff,strlen(buff)+1); printf("%s\n",buff ); ++i; sleep(1); } close(fd); return 0; }
上面的程序就是向1.txt写文件,前提是 1.txt 是存在的,真正的原因就是没有 inode 节点,也就没有了对应
的磁盘文件.现在假设有了 1.txt 这时候程序 1s 钟写一次文件,我们 mv 1.txt 2.txt ,这时候会发现程序竟
然向 2.txt 里面写数据了,原因就是程序是在内存里面,对于1.txt 的抽象就是文件描述符号,write只认识它
,write 通过写描述符,描述符去找相应的 inode 节点,然后写磁盘.mv 了之后 inode 节点还是存在的,也
就是写 2.txt 了.
相关文章推荐
- 浅谈Linux下mv和cp命令的区别
- [转]linux下的scp cp mv rm命令及常用的命令
- linux命令之文件的复制(CP) [转载]
- *Linux常用命令学习1---(安装、文件系统、目录操作命令cd ls mv cp rm mkdir、链接命令ln……)
- linux常用命令mkdir,cd,pwd,rmdir,cp,mv,rm,
- 玩转linux第三天之cp,mv ,rm, wc ,cut ,sort,uniq命令详解(三)
- [linux]cp和mv对文件和链接影响的区别
- Linux命令之目录切换、创建/删除/复制/移动文件 - cd,mkdir,cp,mv,rmdir,rm
- Linux自学第一天(文件处理命令ls,cd,pwd,mkdir,mkdir,touch,cp,mv,rm,cat,more,head,tail,ln)
- Linux命令:cp 命令--创建文件和目录的副本 mv命令--移动或重命名文件/目录
- linux笔记:目录处理命令ls,mkdir,cd,pwd,rmdir,cp,mv,rm
- Linux常用命令:cp,mv,rm
- 在linux中install命令和cp命令的区别
- 几个Linux命令:cp mv -T参数
- linux命令,文件与目录(cp,pwd,mkdir,rmdir;ls,cp,rm,mv,basename,dirname;cat,tac,more,less,head,tail,touch,umask,chattr,file,which,locate,find)
- linux下的拷贝(cp)、删除(rm)、剪切(mv)命令
- Linux命令学习(一):复制(cp),删除(rm)和移动(mv)文件的命令
- linux里install命令和cp命令的区别
- Linux 命令[7]:cp,mv
- 在linux中install命令和cp命令的区别