免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4726 | 回复: 18
打印 上一主题 下一主题

写操作前,文件被删除会产生什么后果? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-07 14:14 |只看该作者 |倒序浏览
16可用积分
删除文件后,写操作仍然能成功,
1。write/fprintf把buffer写到缓冲区,不知道底层的文件系统,可是fflush/fsync怎么也能成功,fsync是等待缓冲区写到磁盘才返回,那么那些东西写到哪里去了?

2。写文件前怎么检测文件已经被删除?
用access/stat检查?有效率高一点的办法吗?

论坛徽章:
0
2 [报告]
发表于 2007-09-07 14:31 |只看该作者
原帖由 dexo 于 2007-9-7 14:14 发表
删除文件后,写操作仍然能成功,
1。write/fprintf把buffer写到缓冲区,不知道底层的文件系统,可是fflush/fsync怎么也能成功,fsync是等待缓冲区写到磁盘才返回,那么那些东西写到哪里去了?

2。写文件前怎 ...

你已经打开文件了,只有等你关闭文件了,文件才会真正被删除,所以你写时,这个文件是存在的

man 3 remove for details

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
3 [报告]
发表于 2007-09-07 15:34 |只看该作者
没什么后果。只要current -> files_struct->file -> dentry -> inode 这条连接存在,文件就一定可以读写。

我想你说的是sys_unlink。sys_unlink会根据dentry -> count 是否为0来决定如何处理。

count == 0,dentry没有进程引用dentry,则可以将dentry变negative,既取消dentry与inode的连接

count > 0,有进程正在引用dentry,则不能改变dentry是positive还是nagetive,只能将dentry从hash中删除,使其对其他所有进程不可见。但是对于已经引用了dentry的进程而言,他们可以通过current -> files_struct->fd [ x ]-> f_dentry来找到这个dentry,进而读写inode。



access/stat是什么?

论坛徽章:
0
4 [报告]
发表于 2007-09-07 16:45 |只看该作者
3楼朋友的分析很到位

论坛徽章:
0
5 [报告]
发表于 2007-09-07 16:47 |只看该作者
不好意思,没说清楚,
如下代码:
int fd = creat("t.txt",O_CREAT|O_WRONLY|O_TRUNC);
  char buf[20];
  for (int i=0; i<50; ++i)
    {
      snprintf(buf,20,"%d\n",i);
    write(fd,buf,strlen(buf))
    fsync(fd)
      sleep(1);
    }

循环过程中把t.txt删除掉(在命令行rm -rf t.txt),write、fsync调用都会返回0。
那write写的buf写到哪里去了?

我希望t.txt文件被删除后,重新创建文件,不至于把删除后写的东西都丢失。
怎么检测t.txt是否被删除了呢?

int access ( PathName, Mode)
int stat ( Path, Buffer)
write前调用access or stat检查文件是否存在,这个是不是效率低了点啊?

论坛徽章:
0
6 [报告]
发表于 2007-09-07 16:55 |只看该作者

回复 #3 塑料袋 的帖子

其他进程(rm -rf)删除t.txt,write函数还是把内容写到t.txt文件去了?这是这个文件不是有效的,除了他本身外,谁都读不到了?????

但是我希望如果这个文件“不是有效的”后,重新创建,不能把之后write写的东西丢失。

[ 本帖最后由 dexo 于 2007-9-7 16:58 编辑 ]

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
7 [报告]
发表于 2007-09-07 17:44 |只看该作者
原帖由 dexo 于 2007-9-7 16:55 发表
其他进程(rm -rf)删除t.txt,write函数还是把内容写到t.txt文件去了?这是这个文件不是有效的,除了他本身外,谁都读不到了?????

但是我希望如果这个文件“不是有效的”后,重新创建,不能把之后wri ...



1)是这样的

2)想重新创建的话,可以用sys_fcntl,租借锁锁上这个文件,这样在删除前,会给你个信号。

论坛徽章:
0
8 [报告]
发表于 2007-09-07 20:21 |只看该作者
这是一个非常好的功能。

如果你用文件不是为了将内容永久保留在磁盘,而是为了通过文件传递数据,那么creat(open)后就立即unlink. 打开的文件fd则继续用来做你想要做的事情read, write。文件关闭后,磁盘上则不留痕迹。

论坛徽章:
0
9 [报告]
发表于 2007-09-07 21:05 |只看该作者
原帖由 塑料袋 于 2007-9-7 17:44 发表



1)是这样的

2)想重新创建的话,可以用sys_fcntl,租借锁锁上这个文件,这样在删除前,会给你个信号。


sys_fcntl是什么?
google不到

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
10 [报告]
发表于 2007-09-07 21:10 |只看该作者
是个系统调用

加强制锁,租借锁.............
还有一个inode -> i_notify链也是由这个系统调用来设置,notify的作用也是在删除,连接,,重命名文件等操作时,给你个信号,同样能知道文件是否已被删除.

不过闹不清这个系统调用对应哪个库函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP