覆盖可执行文件是否会影响正在运行原始可执行文件的进程?

覆盖可执行文件是否会影响正在运行原始可执行文件的进程?

当某个进程中运行某个可执行文件时,如果该可执行文件被覆盖,或者被删除,然后重新安装重新创建,那么该进程会重新运行新的可执行文件吗?

这个问题的答案是否取决于

  • 该可执行文件是否作为进程中的服务/守护进程运行?

  • 操作系统,例如 Ubuntu、Windows、......?

  • 重新安装是从安装程序文件(例如debUbuntu、msiWindows 上的文件)还是从构建其源代码?

这里有些例子:

  • 在 Ubuntu 中,当某个进程运行一个可执行文件时,当我通过 、 和 手动重新安装其源代码来覆盖该可执行文件时configuremakemake install进程仍会继续运行原始可执行文件,而不是新的可执行文件。

  • 我听说在Windwos 10中,当一个进程以服务的形式运行一个可执行文件时,如果我们通过其msi安装程序文件重新安装该可执行文件,那么服务进程将重新启动以运行新的可执行文件。

谢谢。

答案1

我不知道您所有(子)问题的答案,尤其是有关 Windows 服务的问题。但我可以解释 Windows 和 Linux 行为之间的一般差异。

我理解“覆盖”是指写入已经存在的文件。另一种方法是删除旧文件并创建一个新的具有相同名称的文件。我希望所有安装程序都采用后一种方式,因为覆盖正在运行的代码会带来麻烦(并且会给防病毒软件等敲响警钟)。

所以从技术上来说,这几乎从来都不是“覆盖”。那么删除并重新创建又如何呢?

基于 Inode 的文件系统(如 Linux 中的 ext 系列)允许删除正在使用的文件。使用 NTFS 或 FAT 的 Windows 则不会这样做。在此处阅读更多信息:Linux 做了什么不同的事情,允许我删除/替换文件,而 Windows 会抱怨该文件当前正在使用中?

如果 Windows 中的安装程序知道某些文件,则可能会尝试正常(或不正常)停止使用某些文件的进程。否则,它无法完成其工作,因为文件系统会拒绝删除文件。Linux 安装程序通常不需要关心它。

Linux 中的这种行为非常有用,我们倾向于为本身不支持它的文件系统模拟它。阅读我对另一个问题的回答(“上下文”部分)以获得一些见解。


该过程会重新运行新的可执行文件吗?

一般情况下不会。但由于在 Windows 中必须终止进程,安装程序(或某种监视程序)可能“觉得有义务”恢复它 - 当然是使用新的可执行文件,因为旧的可执行文件已被删除。在 Linux 中,进程可以运行原始可执行文件,就像什么都没发生一样。不过,Linux 中的某些安装程序可能会重新启动进程(例如守护程序)以强制运行新的可执行文件。

最后,让我们看看当安装程序很懒惰并且只执行用新可执行文件替换可执行文件所需的任务时会发生什么。在 Windows 中,它必须终止进程,然后替换文件;进程不再存在。在 Linux 中,安装程序只是替换文件,进程仍然存在。

相关内容