当我在Python程序中打开文件时
sptxt = open('output.txt','w')然后运行以下命令:
i@raspberrypi:~/Watson $ lsof /home/pi/Watson/output.txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3.7 16665 pi 6w REG 179,2 0 645827 /home/pi/Watson/output.txt如果我只是通过文本编辑器打开output.txt并运行与上面相同的命令,我将得不到任何结果。
为什么?有没有办法确定它是否是由文本编辑器打开的?
发布于 2020-07-20 23:41:02
简而言之,文本编辑器没有保持文件处于打开状态。更长的答案是,文本编辑器通常比人们想象的更巧妙地处理事情。
让我们来看看不起眼的vim编辑器。
为了做好准备,创建一个名为demo.txt的文件并添加几行代码。
Now is the time
for all good men现在使用strace查看vi正在做什么:
strace -frt -o myfile.txt vi demo.txt在文件中间添加新行,保存并退出。
下面是strace输出的关键部分:
...
15850 0.000037 unlink("demo.txt~") = -1 ENOENT (No such file or directory)
15850 (1) 0.000034 rename("demo.txt", "demo.txt~") = 0
15850 (2) 0.000055 open("demo.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
15850 (3) 0.000044 write(3, "Now is the time\nadding a new lin"..., 51) = 51
15850 0.000042 fsync(3) = 0
15850 0.003511 stat("demo.txt", {st_mode=S_IFREG|0644, st_size=51, ...}) = 0
15850 0.000039 stat("demo.txt", {st_mode=S_IFREG|0644, st_size=51, ...}) = 0
15850 (4) 0.000033 close(3) = 0
15850 (5) 0.000029 chmod("demo.txt", 0100644) = 0
15850 0.000037 setxattr("demo.txt", "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0
15850 0.000091 write(1, " 3L, 51C written", 16) = 16
15850 0.000040 lseek(4, 0, SEEK_SET) = 0
15850 0.000029 write(4, "b0VIM 7.4\0\0\0\0\20\0\0\274\267\25_\324\35\6\0\352=\0\0myuser"..., 4096) = 4096
15850 0.000040 stat("/home/myuser/demo.txt", {st_mode=S_IFREG|0644, st_size=51, ...}) = 0
15850 (6) 0.000046 unlink("demo.txt~") = 0
...看看vim在这里做了什么,在保存时非常快速地连续进行:
将文件重命名为备份文件,并在写入模式下使用尾随代字号(demo.txt~)
demo.txt~)chmod等在新版本的file.只有在给出"write file“命令的情况下,所有这些步骤才能非常快速地完成。您可以在vim中编辑文件并在单独的进程中修改该文件,在您尝试保存该文件之前,vim不会对其执行任何操作,此时它会向您发出警告。
其他编辑可能也在做类似的事情。您可以使用strace查看它们正在进行的系统调用类型,并将其与您在lsof中看到的内容关联起来。
https://stackoverflow.com/questions/62997178
复制相似问题