为什么终端可以自行卸载?


25

屏幕截图

如何apt-get remove xterm进行?并且在卸载后,xterm它不会关闭并继续正常运行。

xterm进程运行时是否将其缓存在RAM中?


6
确切地说,它并不是真正在卸载自身- apt-get正在卸载xterm,并且不知道它在某种程度上取决于xterm进程-因此它涉及“为什么在运行时可以卸载xterm?”。好问题。
Volker Siegel

2
这类似于在运行OS时删除硬盘的方式。
jkd

Answers:


53

不完全的。该文件已被程序打开。删除文件(然后将其替换为另一个版本)不会影响正在运行的程序,因为原始文件将保持打开状态(尽管磁盘上没有名称可以再次打开它),直到程序完成该文件为止。仅当关闭所有文件句柄时,才会释放磁盘上的数据块。在此之前,可以像平常一样读取和写入打开的文件-唯一的变化是,由于删除了文件名,因此没有其他人可以打开该文件。

尽管程序的某些部分在删除时可能已经被读入ram,但它们仍可能被丢弃并在以后重新读取,或者仍然可以从已删除的文件中加载以前未执行过的程序的新部分。


4
这是实际原因....这也是工作的原因rm -rf /.....
heemayl 2015年

6
如果您想使用“工程”一词来描述成功地将所有事情完全搞砸了。;)有趣的是,rm -rf /如果您尝试之后立即再次运行它,将无法正常工作;)
thomasrutter15年

1
我经常在lsof输出中看到“ / some / file / name(已删除)” ,我知道这就是“僵尸”文件的样子……但是有什么方法可以保存这种文件的内容而不会消失最后一个文件句柄何时消失?
Kilian Foth,2015年

1
@KilianFoth,如果您找到一个仍在打开文件的进程,则可以将其从/ proc / $ PID / fd / $ ID复制到另一个文件,但是我似乎找不到恢复该文件的方法硬链接文件的所有尝试都将失败。
psusi

3
@KilianFoth如果有文件句柄,则root可以使用linkat系统调用为其创建名称(从而防止删除)。但是可执行文件和库是内存映射的,不需要文件句柄。我不知道有什么方法可以获取仅存在于文件中的文件的句柄,因为该文件是内存映射的。尽管可执行文件/proc在运行时可以通过它们进行访问,所以可能只有库和其他内存映射文件无法恢复。如果您想要更多有关此的详细信息,应将其作为一个单独的问题提出。
kasperd

8

xterm进程运行时是否将其缓存在RAM中?

究竟。这类似于允许您在事物运行时安装更新而不会崩溃的过程。以及为什么在更新服务后必须重新启动服务。一旦有东西在运行,它的二进制文件就在内存中。

如果它依赖于已删除或替换的其他文件(不是处于“打开”状态的其他文件),则可能会引起问题,但对于离散xterm的问题,则不成问题。


6
程序的部分不完全是仅在需要时才读入内存,并且可能随时被丢弃以释放内存以用于其他用途,因此以后需要再次读入(当程序尝试访问那些部分时)再次)。
psusi 2015年

17
它不一定在RAM中。但是文件只有在打开之前才真正删除,包括xterm可执行文件。
user253751

@immibis,因此,我的回答;)
psusi

2

实际上,这是计算机工作方式的一个特征:调用程序时,确实会将其加载到内存中并从那里开始工作。

文件实际上以相同的方式工作。为了避免出现问题,UNIX ish系统中的许多文件都会创建锁。

真正的谜语是为什么您不能在Windows中执行此类操作。

实际上,此功能使您可以更新整个系统,包括系统中处于活动状态的程序。;)


+1代表“实际的中位数就是为什么您无法在Windows中执行此类操作”
arielf 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.