我有一个问题。
我在LINUX机器上运行程序。此程序将输出写入父文件夹'PARENT'的子文件夹'SUB'中的文件'output.txt'
PARENT
|________SUB
|_________ output.txt
我在输出写入时意外地重命名了PARENT ...即,我执行了以下命令
mv PARENT PARENT_NEW
到目前为止,我的程序还没有崩溃或任何事情。有谁知道我刚才所做的影响?
答案 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的引用。