2014-04-24 197 views
1

我有一個可以正常工作的C++程序,但是它需要運行很長時間。但是,當它運行時,我可以繼續開發它的一些部分。如果我重新編譯我的程序,這將取代新的二進制文件。這是否會修改正在運行的程序的行爲?或者程序啓動後,進程和二進制文件是兩個獨立的東西嗎?程序執行步驟

更一般地說,程序執行的步驟是什麼?

+1

這取決於操作系統。 – Barmar

+0

在Linux上,例如Linux上的 –

+1

,通常可以覆蓋程序二進制文件,而不影響運行過程 –

回答

4

在Linux上,該進程使用內存映射將可執行文件的文本部分和共享庫直接映射到正在運行的進程內存中。所以如果你可以覆蓋可執行文件,它會影響正在運行的進程。但是,禁止寫入映射爲執行的文件 - 您會收到「文本文件忙」錯誤。

但是,您仍然可以重新編譯該程序。如果編譯器(實際上是鏈接器)出現此錯誤,它將刪除舊的可執行文件並創建一個新文件。在Unix上,如果刪除正在使用的文件,則文件內容實際上並未從磁盤中刪除,只刪除目錄條目中的引用;在所有對它的引用(目錄項,文件描述符和內存映射)消失之前,該文件並未完全刪除。因此,正在運行的進程將繼續映射到舊的無名文件。你可以用下面的演示看到:

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

inode編號從229774改爲229779當我重新編譯程序它運行時,指示新文件被創建。

2

在Windows上,您甚至無法在舊版本運行時編寫新的可執行文件。當進程存在時,磁盤上的文件被鎖定。在Linux上,您可以覆蓋磁盤上的文件,但內存中的副本保持不變。

OTOH在IDE中運行時,可能會在IDE知道相關詳細信息時修補正在運行的進程。但這很複雜,並不是所有的IDE都支持這一點。

+0

所以在Linux上,當你啓動一個它完全複製到內存的程序? –

+0

在Linux上,當我嘗試覆蓋正在運行的可執行文件時,出現「文本文件繁忙」錯誤。 – Barmar