程序执行步骤
Program execution steps
我有一个运行良好的c++程序,但它需要运行很长时间。但是当它运行时,我可以继续开发它的某些部分。如果我重新编译我的程序,这将用新的二进制文件替换二进制文件。这会修改正在运行的程序的行为吗?还是程序启动后,进程和二进制文件是两个独立的东西?
更一般地说,程序执行的步骤是什么?
在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
,这表明创建了一个新文件。
在Windows上,当旧版本运行时,您甚至无法编写新的可执行文件。进程存在时,磁盘上的文件被锁定。在Linux上,您可以覆盖磁盘上的文件,但内存中的副本保持不变。
OTOH,当在IDE中运行时,可能会对运行过程进行修补,因为IDE知道相关的细节。但它很复杂,并不是所有IDE都支持这一点。
相关文章:
- 程序在执行程序的其余部分之前退出
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 从 GUI 文件资源管理器执行程序,并且不生成终端
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 重新执行C++程序会加快速度
- 如何用共享库替换可执行C++程序的功能?
- 编译并执行C#程序中的C++代码
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 在C++中,系统如何将这些对象中的每一个与执行程序的窗口相关联?
- 命令行参数执行C 程序
- 按 e 执行程序C++
- 在返回另一个函数的函数中执行程序期间出错
- 如何使用"trusty"映像在本地执行C++程序的Travis CI?
- 当我们说在执行程序时将操作系统的控制权传递给main()函数时,我们的意思是什么
- execve(..) 不执行程序,尽管传入了 PATH 变量
- 在机器异常之后重新执行程序
- 调试和发布库及其可执行程序
- 当访问者进入网站时执行C++程序