我考虑过并发问题(Solaris中的 ),如果在阅读某人时尝试删除同一文件会发生什么。我在 Solaris / Linux 中有关于文件存在的查询。假设我有一个文件test.txt,我在vi编辑器中打开,然后我打开了一个重复的会话并删除该文件,但即使在删除该文件后也是如此我能够读取该文件。所以这是我的问题:
在阅读时是否需要考虑任何锁定机制,因此在阅读时无法删除相同的文件。
从窗口显示不同行为的原因是什么(如在某些编辑器中打开文件而不是删除该文件时,在窗口中显示)
我一般都在询问文件,但是特定于平台,即 unix 。如果我使用java程序(缓冲读取器)读取文件并在读取时删除文件会发生什么情况,缓冲区读取器是否仍能读取下一个块的文件?
答案 0 :(得分:7)
你基本上有两到三个不相关的问题。文本编辑器喜欢在编辑会话开始时将整个文件读入内存。想象一下,您键入的每个字符都会立即保存到磁盘,文件中的所有字符都会被重写一个位置,以便腾出空间。那太糟糕了。更实际的是你正在编辑的东西是文件的内存表示(指向行的指针数组,可能附加了一些元数据),只有在你明确保存时才会转换回线性流。
任何相对较新版本的vim都会通知您,如果您正在编辑的文件已从其原始位置删除并带有消息
E211: File "filename" no longer available
此警告不仅适用于unix。如果删除正在编辑的文件,Windows上的gvim将为您提供。它提醒您,如果您不希望文件消失,则需要在退出之前保存正在处理的版本。
(注意:警告不会立即出现 - vim只会检查原始文件是否存在,当您将文件切换回前台后将其恢复到前台。)
这就是问题1,文本编辑器的行为 - 他们没有理由为整个会话保持文件打开,因为除了在启动和保存操作期间它们实际上并没有使用它。
问题2,为什么有些Windows编辑器会保持文件打开和锁定 - 我不知道,Windows用户是疯子。
问题3,实际上是关于unix的问题,为什么打开文件在删除后仍然可以访问 - 这是最有趣的一个。答案肯定会在直接呈现时让您震惊:
没有命令,函数,系统调用或任何其他方法实际请求删除文件。
基础rm
以及可能看似删除文件的任何其他命令都有系统调用unlink
。它被称为unlink
,而不是remove
或deletefile
或类似的东西,因为它不会删除文件。它删除链接(a.k.a。目录条目),它是文件和目录中名称之间的关联。 (注意:ANSI C添加remove
作为更通用的函数来安抚那些无意实现unix文件系统语义的非unix人,但是在unix上,remove
只是rmdir
如果目标是一个目录,其他一切都是unlink
。)
文件可以有多个链接(请参阅ln
命令了解它们的创建方式),这意味着多个名称可以识别同一个文件。如果你rm
其中一个,其他人就会留下来并且文件不会被删除。删除最后一个链接会发生什么?好吧,现在你有一个没有名字的文件。但名称只是对文件的一种引用。至少还有2个:文件描述符和mmap区域。当文件的最后一个引用消失时,就是文件被删除的时候。
由于引用有多种形式,因此有很多种事件可以导致文件被删除。以下是一些例子:
我不会称之为完整清单。我不鼓励任何人试图建立一个完整的清单。只需知道rm
是“删除名称”,而不是“删除文件”,文件一旦不使用就会消失。
如果要立即销毁文件内容,请将其截断。已经使用它的所有进程都会发现它的大小突然变为0.(就普通文件访问方法而言,这是破坏性的。要彻底销毁它,以便即使有原始磁盘访问权限的人也无法读取以前的内容在那里,你需要覆盖它。有一个名为shred
的工具。)
答案 1 :(得分:1)
我认为您的问题与Windows / Linux之间的区别无关。这是关于VI如何运作的。
使用VI编辑文件时。 VI将创建一个.swp文件。而.swp文件就是你实际编辑的内容。同时,如果其他用户删除原始文件将不会影响您的编辑。 当你在VI中键入:w时,VI将使用.swp文件覆盖原始文件。