程序执行步骤

时间:2014-04-24 09:04:05

标签: c++ c executable execution

我有一个运行良好的c ++程序,但它需要运行很长时间。但是在它运行的时候我可以继续开发它的一些部分。如果我重新编译我的程序,这将用新的二进制文件替换二进制文件。这是否会修改正在运行的程序的行为?或者,一旦程序启动,进程和二进制文件是两个独立的东西吗?

更一般地说,程序执行的步骤是什么?

2 个答案:

答案 0 :(得分:4)

在Linux上,该进程使用内存映射将可执行文件和共享库的文本部分直接映射到正在运行的进程内存中。因此,如果您可以覆盖可执行文件,则会影响正在运行的进程。但是,禁止写入映射执行的文件 - 您会收到“文本文件繁忙”错误。

但是,您仍然可以重新编译该程序。如果编译器(实际上是链接器)收到此错误,它将删除旧的可执行文件并创建一个新文件。在Unix上,如果删除正在使用的文件,则实际上不会从磁盘中删除文件内容,只会删除目录条目中的引用;在所有对它的引用(目录条目,文件描述符和内存映射)消失之前,文件不会被完全删除。因此,正在运行的进程继续映射到旧的无名文件。您可以通过以下演示看到这一点:

barmar@dev:~$ ls -li testsleep
229774 -rwxr-xr-x 1 barmar adm 4584 Apr 24 04:30 testsleep
barmar@dev:~$ ./testsleep &
[1] 17538
barmar@dev:~$ touch testsleep.c
barmar@dev:~$ make testsleep
cc     testsleep.c   -o testsleep
barmar@dev:~$ ls -li testsleep
229779 -rwxr-xr-x 1 barmar adm 4584 Apr 24 04:32 testsleep

当我在程序运行时重新编译程序时,inode编号从229774更改为229779,表示已创建新文件。

答案 1 :(得分:2)

在Windows上,在旧版本运行时甚至无法编写新的可执行文件。进程存在时,磁盘上的文件被锁定。在Linux上,您可以覆盖磁盘上的文件,但内存中的副本保持不变。

OTOH,在IDE中运行时,可以修改正在运行的进程,因为IDE知道相关的详细信息。但它很复杂,并非所有IDE都支持这一点。