程序可以判断我是否在编辑器中打开了文件吗?

程序可以判断我是否在编辑器中打开了文件吗?

我有一个手动编辑的文件(在终端窗口中使用 emacs)。我有一个脚本,然后读取文件,检查文件是否有错误,并通过按字母顺序对列表进行排序等操作来修改文件。在运行脚本之前,我总是想保存文件并退出编辑器,否则编辑器中未保存的更改与脚本所做的更改之间可能会发生冲突。

在Linux上,一个程序是否可以判断另一个程序是否以读写模式打开了一个文件?在这种情况下,我希望脚本抛出错误并退出。

如果没有,那么我可以考虑更复杂的解决方案,例如编写一个脚本作为 emacs 的包装器,当 emacs 看到它正在编辑这个特殊文件时,它会创建一个信号量文件。 (无论如何,我通常通过别名调用 emacs。)

[编辑] 我找到了一个适合我的解决方案,即利用 emacs 自动创建不可见信号量文件的事实。我本想删除这个问题,但 SE 界面似乎不允许我这样做。人们还可以从命令行显式使用flock(例如,flock a.a /bin/emacs -nw a.a)来获取咨询锁。

答案1

在Linux上,一个程序是否可以判断另一个程序是否以读写模式打开了一个文件?在这种情况下,我希望脚本抛出错误并退出。

您可以检查进程拥有的文件句柄。然而,“打开”是一个有点模糊的术语:要显示文件并编辑它,您只需打开文件,读取其内容,然后再次关闭文件句柄。所以,不,另一个程序不能合理地假设另一个面向用户的程序已打开的内容,因为这不是一个固定的概念。

你的用例听起来像是你要么

  • 希望您的编辑器在保存后自动启动外部程序,然后重新读取文件
  • 确保您的编辑器自动注意到文件更改(emacs 在许多情况下都会这样做)
  • 或者相反,使您的外部程序能够监视正在更改的文件

最后一种是可能的——您可以fanotify在现代 Linux 和inotify任何 Linux 上使用(基本上永远是 Linux 2.6.13)。但是:仅靠 Shell 脚本无法做到这一点。您需要使用一种可以从内核获取这些通知的语言。例如,您可以使用该pyinotify程序(我不喜欢这样,它不能很好地处理名称中带有空格的文件),或者pyinotify在 python 程序中用作库。对于 C++、C 和所有系统语言,有直接调用fanotifyinotify通过 C API 调用。

相关内容