首先,我想問一下,應用程序是否可以在運行時在同一地址空間更新自身? 如果是,那麼實現邏輯的最好方法是什麼? 用例:我的應用程序正在連接到網絡的主板上運行。在運行時,如果它檢測到同一個應用程序的新版本,那麼如何在同一個內存地址上更新應用程序,在那裏存儲以前的地址。 根據我的理解,首先我們應該採取更新的備份,並在啓動加載時,主應用程序應該更新備份,然後正常啓動應用程序。我對嗎?C應用程序如何在運行時在Linux環境中自行更新
0
A
回答
1
通常,您可以在運行時更換包含可執行文件的文件,而不會出現問題。
您更新文件後,您可以像往常一樣啓動應用程序,並關閉正在運行的實例。
不過,若你想在運行時做到這一點(即不分叉或啓動新的進程),我不認爲這是可能的,而不怪異無比黑客:
- 如果您計劃「變基」程序內存與新的可執行代碼,你需要爲每個線程計算堆棧,內存和指令指針。你需要成爲一名反彙編人員。
- 如果你計劃加載到內存若干輔助後段調用程序中的一個存根,這很好,但你要到哪目標函數是,如果它在你的下一次更新的消失,會發生什麼。另外它完全是平臺特定的。
- 如果您計劃通過使用動態加載和卸載共享庫,以規範上述辦法,我看不出有任何問題 - 這是非常相似的地方重新啓動整個過程的方法。
我會去替換隻是可執行文件,或第三個選項,如果我有一個很好的理由。最後一個選項是好的,因爲它可以讓你單獨更新您的應用程序的組件(但在同一時間,這可能以後會導致你的維護問題。)
0
你需要的是一個類似於引導程序。在這種情況下:您將在設備上擁有兩個程序,以下稱爲加載程序和應用程序。
您的初始安裝系統:寫的應用程序的內存開始和Loader某處進一步下跌給空間,如果該應用程序的大小增長的未來。 (請注意裝載機的開始存儲器地址)
應用程序將正常運行,如果它是唯一的方案,定期檢查更新自己。如果在網絡上發現更新,請使用GOTO轉到Loader的第一個內存位置,然後該Loader將開始運行,並可以使用網絡上找到的新應用程序覆蓋原始應用程序。在加載程序結束時,GOTO返回(新的)應用程序。
看到這個堆棧溢出問題的想法如何轉到特定的內存地址。 Goto a specific Address in C
相關問題
- 1. 如何在Linux環境下運行.net應用程序?
- 2. 在內存中運行時自行更新應用程序
- 3. 在後臺運行時,應用程序不會自行更新
- 4. 在VM環境中運行應用程序時檢測
- 5. 如何在運行我的Rails應用程序時在Heroku中設置環境?
- 6. 如何在測試環境下運行web應用程序
- 7. 非靈活環境應用程序的自定義運行時?
- 8. 如何編寫可在運行時自行更新的Java應用程序?
- 9. 在Linux中運行Android應用程序
- 10. 如何在應用程序未運行時更新applicationbadge號碼?
- 11. 如何在運行時更新應用程序?
- 12. 在linux中的中斷環境中運行用戶線程
- 13. 如何運行c#應用程序在Linux上的dll文件
- 14. 運行C程序的Unix環境
- 15. 在運行時更改語言環境?
- 16. 需要在本地環境中運行Web應用程序
- 17. Facebook應用程序無法在本地環境中運行
- 18. 空氣應用程序僅在構建器環境中運行
- 19. 僅在PROD環境中運行的Symfony 2.6.1應用程序
- 20. 在桌面環境中運行PHP應用程序
- 21. Android:在dev/prod環境中運行應用程序?
- 22. 如何在啓動Ubuntu Linux時運行Java應用程序
- 23. 在Linux/MacOSX中運行C程序
- 24. 在Linux中運行C程序
- 25. 在Linux環境下運行.bat
- 26. 在運行應用程序環境中運行grails集成測試
- 27. 如何在後臺進程中運行linux應用程序?
- 28. 如何在運行XNA時爲應用程序創建自動更新
- 29. 在Linux中開發的在Linux中運行RoR應用程序
- 30. Bottle python程序在開發環境中運行,但不在實時環境中運行
你能更好的解釋一下嗎?也許用一個例子用例 –