如果我在程序写入文件时重命名父目录会发生什么

时间:2014-01-17 17:45:15

标签: linux

我有一个问题。

我在LINUX机器上运行程序。此程序将输出写入父文件夹'PARENT'的子文件夹'SUB'中的文件'output.txt'

PARENT
   |________SUB
             |_________ output.txt

我在输出写入时意外地重命名了PARENT ...即,我执行了以下命令

mv PARENT PARENT_NEW

到目前为止,我的程序还没有崩溃或任何事情。有谁知道我刚才所做的影响?

3 个答案:

答案 0 :(得分:4)

在Linux上,从Unix继承,一旦本地磁盘上的文件打开,该进程就会有一个句柄。您可以重命名父目录,甚至可以删除该文件。只要不关闭并重新打开文件,这些操作就不会对写入文件的过程造成麻烦。

答案 1 :(得分:3)

程序通过文件描述符保持文件打开,文件描述符是内核用来访问文件的无符号整数。你的行动应该没有效果。

答案 2 :(得分:0)

根据UNIX,填充将出现在新位置。这是一个简单的实验:

$ mkdir /tmp/test
$ cat > /tmp/test/abc.txt
hello
world

and again!

所以当cat仍在等待输入时,打开一个新终端并重命名该文件夹:

$ mv /tmp/test/ /tmp/test2

现在回到早期的终端:(按Ctrl+D完成对cat的输入)

$ ls /tmp/test/
ls: cannot access /tmp/test1/abc.txt: No such file or directory
$ ls /tmp/test2/
abc.txt
$ cat /tmp/test2/abc.txt 
hello
world

and again!

基本上,除非完全删除文件或目录,否则在写完成后它将出现在新位置。

但是,如果进程B删除文件f而其他进程A仍在写入该文件,则文件f将可用于处理A 1}}因为它包含一个inode引用。但对于包括B在内的其他流程,它将无法访问。任何其他进程仍然可以访问文件f,前提是它可以通过/proc/<PID-of-A>/fd中的文件描述符获取对inode的引用。