Answers:
不完全的。该文件已被程序打开。删除文件(然后将其替换为另一个版本)不会影响正在运行的程序,因为原始文件将保持打开状态(尽管磁盘上没有名称可以再次打开它),直到程序完成该文件为止。仅当关闭所有文件句柄时,才会释放磁盘上的数据块。在此之前,可以像平常一样读取和写入打开的文件-唯一的变化是,由于删除了文件名,因此没有其他人可以打开该文件。
尽管程序的某些部分在删除时可能已经被读入ram,但它们仍可能被丢弃并在以后重新读取,或者仍然可以从已删除的文件中加载以前未执行过的程序的新部分。
rm -rf /
.....
rm -rf /
如果您尝试之后立即再次运行它,将无法正常工作;)
lsof
输出中看到“ / some / file / name(已删除)” ,我知道这就是“僵尸”文件的样子……但是有什么方法可以保存这种文件的内容而不会消失最后一个文件句柄何时消失?
root
可以使用linkat
系统调用为其创建名称(从而防止删除)。但是可执行文件和库是内存映射的,不需要文件句柄。我不知道有什么方法可以获取仅存在于文件中的文件的句柄,因为该文件是内存映射的。尽管可执行文件/proc
在运行时可以通过它们进行访问,所以可能只有库和其他内存映射文件无法恢复。如果您想要更多有关此的详细信息,应将其作为一个单独的问题提出。
xterm
进程运行时是否将其缓存在RAM中?
究竟。这类似于允许您在事物运行时安装更新而不会崩溃的过程。以及为什么在更新服务后必须重新启动服务。一旦有东西在运行,它的二进制文件就在内存中。
如果它依赖于已删除或替换的其他文件(不是处于“打开”状态的其他文件),则可能会引起问题,但对于离散xterm
的问题,则不成问题。
实际上,这是计算机工作方式的一个特征:调用程序时,确实会将其加载到内存中并从那里开始工作。
文件实际上以相同的方式工作。为了避免出现问题,UNIX ish系统中的许多文件都会创建锁。
真正的谜语是为什么您不能在Windows中执行此类操作。
实际上,此功能使您可以更新整个系统,包括系统中处于活动状态的程序。;)
apt-get
正在卸载xterm
,并且不知道它在某种程度上取决于xterm
进程-因此它涉及“为什么在运行时可以卸载xterm?”。好问题。