首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lsof命令的使用

lsof命令的使用
EN

Stack Overflow用户
提问于 2020-07-20 22:05:43
回答 1查看 65关注 0票数 0

当我在Python程序中打开文件时

代码语言:javascript
复制
sptxt = open('output.txt','w')

然后运行以下命令:

代码语言:javascript
复制
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并运行与上面相同的命令,我将得不到任何结果。

为什么?有没有办法确定它是否是由文本编辑器打开的?

EN

回答 1

Stack Overflow用户

发布于 2020-07-20 23:41:02

简而言之,文本编辑器没有保持文件处于打开状态。更长的答案是,文本编辑器通常比人们想象的更巧妙地处理事情。

让我们来看看不起眼的vim编辑器。

为了做好准备,创建一个名为demo.txt的文件并添加几行代码。

代码语言:javascript
复制
Now is the time
for all good men

现在使用strace查看vi正在做什么:

代码语言:javascript
复制
strace -frt -o myfile.txt vi demo.txt

在文件中间添加新行,保存并退出。

下面是strace输出的关键部分:

代码语言:javascript
复制
...
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~)

  • Opening文件作为文件描述符3
  1. 写入修改后的文件(FD (demo.txt~)
  2. Opening chmod等在新版本的file.
  3. Removing
    1. 上。

只有在给出"write file“命令的情况下,所有这些步骤才能非常快速地完成。您可以在vim中编辑文件并在单独的进程中修改该文件,在您尝试保存该文件之前,vim不会对其执行任何操作,此时它会向您发出警告。

其他编辑可能也在做类似的事情。您可以使用strace查看它们正在进行的系统调用类型,并将其与您在lsof中看到的内容关联起来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62997178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档