如果某些程序正在从一个文件中读取数据时删除输入文件,将会发生什么情况?

哈克西姆

如果有python脚本这样做:

with open('large_input_file.log', 'rb') as f :
    for each_line in f :
        do something .....

我们称这个脚本 a.py

large_input_file.log约为16GB。a.py将需要几个小时来处理此文件。

如果我这样做(在Linux下),将会发生什么:

  1. 继续a.py

  2. 删除 large_input_file.log

  3. large_input_file.log用不同的内容替换但名称相同

是否a.py能得到正确的数据large_input_file.log之前,我删除了吗?(我想这将会发生。)

或将以a.py新的偏移量开始的新数据获取新数据large_input_file.log

您可以在内核级别还是文件系统级别解释它?(Linux如何做到这一点)?

-----------------在一些答案之后添加以下内容----------

如果我的磁盘大小为16Gb怎么办,那么只能存储一个large_input_file.log

如果我删除large_input_file.log并创建另一个16Gblarge_input_file.log文件会怎样?

埃米尔·H

让我们创建一个文件:

# echo foo > test.txt

现在,我们将使用tail它来监视更改:

# tail -f test.txt
foo

让我们在终端上打开另一个选项卡,然后检查tail过程的pid

# ps aux | grep -i tail
root      5458  0.0  0.0   7484   724 ?        S    Sep15   0:13 tail -f -n 0 /var/log/syslog
root      5919  0.0  0.0   7484   784 ?        S    Sep15   0:13 tail -f -n 0 /var/log/syslog
root      6381  0.0  0.0   7484   840 ?        S    Sep15   0:14 tail -f -n 0 /var/log/syslog
emil     27789  0.0  0.0   8852   784 pts/8    S+   12:26   0:00 tail -f test.txt
emil     27826  0.0  0.0  15752  1016 pts/9    S+   12:26   0:00 grep -i tail

因此,在我的情况下,pid为27789。我们可以通过检查/proc/27789/fd目录来查看进程的打开文件

# ls -lah /proc/27789/fd/
total 0
dr-x------ 2 emil emil  0 Sep 20 12:26 .
dr-xr-xr-x 9 emil emil  0 Sep 20 12:26 ..
lrwx------ 1 emil emil 64 Sep 20 12:26 0 -> /dev/pts/8
lrwx------ 1 emil emil 64 Sep 20 12:26 1 -> /dev/pts/8
lrwx------ 1 emil emil 64 Sep 20 12:26 2 -> /dev/pts/8
lr-x------ 1 emil emil 64 Sep 20 12:26 3 -> /home/emil/test.txt
lr-x------ 1 emil emil 64 Sep 20 12:26 4 -> anon_inode:inotify

在这里,我们看到tail有一个名为3至的文件描述符test.txt如果我们删除文件怎么办?

# rm test.txt
# ls -lah /proc/27789/fd
total 0
dr-x------ 2 emil emil  0 Sep 20 12:26 .
dr-xr-xr-x 9 emil emil  0 Sep 20 12:26 ..
lrwx------ 1 emil emil 64 Sep 20 12:26 0 -> /dev/pts/8
lrwx------ 1 emil emil 64 Sep 20 12:26 1 -> /dev/pts/8
lrwx------ 1 emil emil 64 Sep 20 12:26 2 -> /dev/pts/8
lr-x------ 1 emil emil 64 Sep 20 12:26 3 -> /home/emil/test.txt (deleted)
lr-x------ 1 emil emil 64 Sep 20 12:26 4 -> anon_inode:inotify

文件描述符仍然存在,但ls可以帮助我们知道该文件已被删除。

正如Igor所说,每个文件在磁盘上都有原始数据所在的物理位置。为了查找文件,系统维护一个将文件名映射到实际数据的索引节点表。删除文件不会擦除磁盘上的数据,而只会修改索引节点。数据将仍然存在,直到被其他内容显式覆盖为止。但是,在这种特定情况下,内核包含额外的代码,以确保文件继续存在-并且不会被覆盖-直到不再由任何进程打开文件为止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果在文件从一个文件系统(ext4)移至另一个(NTFS)时删除文件,会发生什么情况?

来自分类Dev

如果同一文件中有2个Appdelegate类,将会发生什么情况

来自分类Dev

如果在ThreadPool线程正在写入文件时关闭应用程序会发生什么情况?

来自分类Dev

是Java中的垃圾回收专用于JVM吗,如果一个JVM中的应用程序正在泄漏内存,其他JVM会发生什么情况?

来自分类Dev

如果fseek中给定的偏移量超出最后一个字符,将会发生什么情况

来自分类Dev

如果您在两次部署在tomcat的战争中两次拥有同一个班级,将会发生什么情况?

来自分类Dev

如果从类文件中删除超级构造函数调用,会发生什么情况?

来自分类Dev

如果我以较大的块(即大于1024字节)上载大文件,将会发生什么情况?

来自分类Dev

如果多个 azure 函数应用程序绑定到同一个存储队列以进行输入,会发生什么情况

来自分类Dev

在Linux中,如果将目录中的1000个文件移到另一个位置,而又将300个文件添加到源目录,会发生什么情况呢?

来自分类Dev

如果我删除了 C++ 程序正在向其写入数据的文件,会发生什么?

来自分类Dev

将巨大的文件加载到hadoop集群中时,如果客户端在将数据传输到datanode时失败,会发生什么情况?

来自分类Dev

如果我为一个中断创建多个ISR,会发生什么情况?

来自分类Dev

如果我为一个中断创建多个ISR,会发生什么情况?

来自分类Dev

如果我忽略“很好地编码”,而将css(使用样式标签)和js(使用脚本标签)代码放在一个html文件中,会发生什么情况

来自分类Dev

当我在shell中执行文件时,会发生什么情况?

来自分类Dev

当我在shell中执行文件时,会发生什么情况?

来自分类Dev

如果WebSphere MQ FTE代理正在传输文件并且激活了另一种传输,会发生什么情况?

来自分类Dev

如果 Spark-streaming 应用程序遇到一个巨大的文件会发生什么?

来自分类Dev

如果将多个PCIe卡放在一个PCIe插槽中会发生什么情况?

来自分类Dev

如果我为当前不使用的字符串位置分配一个值,会发生什么情况?

来自分类Dev

如果在ext4分区中超过40亿个文件限制,会发生什么情况?

来自分类Dev

如果您在不重新启动的情况下安装 2 个更新相同文件的更新,会发生什么情况,如果您不按顺序安装更新会发生什么情况?

来自分类Dev

如果在推送过程中忽略./.git/objects/pack/下的.pack文件,会发生什么情况?

来自分类Dev

如果我在Git中假定未更改的早期文件集上进行更改,会发生什么情况?

来自分类Dev

如果应用程序处于睡眠状态时执行PerformSelector会发生什么情况?

来自分类Dev

如果将EXT4文件系统中的一组特定块清零,会发生什么情况?

来自分类Dev

从C中main返回时正在运行的线程会发生什么情况?

来自分类Dev

从C中main返回时,正在运行的线程会发生什么情况?

Related 相关文章

  1. 1

    如果在文件从一个文件系统(ext4)移至另一个(NTFS)时删除文件,会发生什么情况?

  2. 2

    如果同一文件中有2个Appdelegate类,将会发生什么情况

  3. 3

    如果在ThreadPool线程正在写入文件时关闭应用程序会发生什么情况?

  4. 4

    是Java中的垃圾回收专用于JVM吗,如果一个JVM中的应用程序正在泄漏内存,其他JVM会发生什么情况?

  5. 5

    如果fseek中给定的偏移量超出最后一个字符,将会发生什么情况

  6. 6

    如果您在两次部署在tomcat的战争中两次拥有同一个班级,将会发生什么情况?

  7. 7

    如果从类文件中删除超级构造函数调用,会发生什么情况?

  8. 8

    如果我以较大的块(即大于1024字节)上载大文件,将会发生什么情况?

  9. 9

    如果多个 azure 函数应用程序绑定到同一个存储队列以进行输入,会发生什么情况

  10. 10

    在Linux中,如果将目录中的1000个文件移到另一个位置,而又将300个文件添加到源目录,会发生什么情况呢?

  11. 11

    如果我删除了 C++ 程序正在向其写入数据的文件,会发生什么?

  12. 12

    将巨大的文件加载到hadoop集群中时,如果客户端在将数据传输到datanode时失败,会发生什么情况?

  13. 13

    如果我为一个中断创建多个ISR,会发生什么情况?

  14. 14

    如果我为一个中断创建多个ISR,会发生什么情况?

  15. 15

    如果我忽略“很好地编码”,而将css(使用样式标签)和js(使用脚本标签)代码放在一个html文件中,会发生什么情况

  16. 16

    当我在shell中执行文件时,会发生什么情况?

  17. 17

    当我在shell中执行文件时,会发生什么情况?

  18. 18

    如果WebSphere MQ FTE代理正在传输文件并且激活了另一种传输,会发生什么情况?

  19. 19

    如果 Spark-streaming 应用程序遇到一个巨大的文件会发生什么?

  20. 20

    如果将多个PCIe卡放在一个PCIe插槽中会发生什么情况?

  21. 21

    如果我为当前不使用的字符串位置分配一个值,会发生什么情况?

  22. 22

    如果在ext4分区中超过40亿个文件限制,会发生什么情况?

  23. 23

    如果您在不重新启动的情况下安装 2 个更新相同文件的更新,会发生什么情况,如果您不按顺序安装更新会发生什么情况?

  24. 24

    如果在推送过程中忽略./.git/objects/pack/下的.pack文件,会发生什么情况?

  25. 25

    如果我在Git中假定未更改的早期文件集上进行更改,会发生什么情况?

  26. 26

    如果应用程序处于睡眠状态时执行PerformSelector会发生什么情况?

  27. 27

    如果将EXT4文件系统中的一组特定块清零,会发生什么情况?

  28. 28

    从C中main返回时正在运行的线程会发生什么情况?

  29. 29

    从C中main返回时,正在运行的线程会发生什么情况?

热门标签

归档