2013-07-05 283 views
1

我有一個可以在服務器或客戶端模式下運行的二進制文件。它可以這樣使用:運行相同二進制文件的不同版本,相同的文件

$ ./a.out --server & 
$ ./a.out --client & 

他們互相交談,這是行之有效的。我的問題是什麼是預期的行爲,當我啓動服務器:

$ ./a.out --server & 

但後來我忘了要殺死它,去了解我的開發工作,編輯,建設,運行客戶端:

$ edit client.c 
$ make 
$ ./a.out --client 
^C 
<repeat> 

現在沒有設置粘滯位,是我的操作系統(Ubuntu)運行我的二進制文件的兩個不同版本?還是它採取了快捷方式並使用內存中的實例,因此忽略了我的最新版本?這個錯誤還有其他副作用嗎?

回答

2

make通過刪除原始文件來替換可執行文件。但是,由於它在後臺執行,因此有一個參考。在清除引用之前,文件不會被完全刪除(儘管清除目錄條目以爲新的可執行文件生成路徑)。

因此,在您的示例中有兩個版本的程序正在運行。一個副作用是如果您進行的更改會導致您的服務器客戶端代碼出現嚴重不兼容問題 - 例如數據包結構發生變化。你可能會看到奇怪的,無法解釋的行爲,崩潰等。殺死後臺服務器並重新運行整個測試總是一個好主意。

+0

謝謝,這正是我所擔心的,事實上也是這樣。 –

1

如果您不更改服務器代碼,只需將您的a.out複製到'my_server'然後運行它作爲my_server - 服務器。 make會替換a.out,但不是my_server。

另一種方法 - 告訴make在重新編譯之前終止所有正在運行的a.out -s:add target'all'(它必須是makefile中的第一個),依賴於a.out並執行'killall a.out' 。

相關問題