我有一個我寫的鏈接到Linux可執行文件(比如遊戲)的共享對象。現在,當程序結束時(遊戲結束!),爲了執行一些清理活動,我應該在我創建的共享對象中使用哪種信號處理程序?當我的程序正常退出時,我應該期待什麼信號?
請記住,我不能控制Linux可執行文件,這是一款遊戲,我只需從Internet上下載並通過將其鏈接到我的共享對象來運行它。遊戲結束後,我希望能夠抓住該事件並進行一些清理活動。
我是否清楚我的問題?有任何想法嗎?
感謝, 克里希納
我有一個我寫的鏈接到Linux可執行文件(比如遊戲)的共享對象。現在,當程序結束時(遊戲結束!),爲了執行一些清理活動,我應該在我創建的共享對象中使用哪種信號處理程序?當我的程序正常退出時,我應該期待什麼信號?
請記住,我不能控制Linux可執行文件,這是一款遊戲,我只需從Internet上下載並通過將其鏈接到我的共享對象來運行它。遊戲結束後,我希望能夠抓住該事件並進行一些清理活動。
我是否清楚我的問題?有任何想法嗎?
感謝, 克里希納
一般情況下,你不能從內過程中做到這一點。 (軟件不能有死亡的願望。)
但是,你可以運行一個包裝腳本什麼的,比賽結束後運行另一個程序中現有的遊戲過程:
#!/bin/sh
run_game
perform_cleanup_activity
嗨,您的回覆很有趣。但是需要使用我的共享對象來「蹦牀」遊戲(我稱之爲可執行文件)所做的OpenGL API調用。當遊戲結束時,我想爲每個函數調用寫入磁盤上文件的時間。如果我在「遊戲運行時」執行此操作,則可能會得到不正確的值,因爲執行文件IO操作需要時間。 – Krishna 2010-12-16 00:59:20
@Kris復古病毒:或許你可以打開一個共享內存區域,你的'.so'在運行時寫入性能信息。然後,擁有一個完全獨立的應用程序,它可以打開相同的共享內存區域,讀取數據並格式化並將其寫入磁盤。這也會減少'.so'依賴的依賴關係(因爲它不需要格式化或文件I/O本身)。此外,您可以在遊戲運行時獲得實時性能數據。 – 2010-12-16 03:19:56
嗨格雷格,這似乎也是一個不錯的主意。我一定會試一試。我認爲這與我的想法類似,即使用管道...... – Krishna 2010-12-16 05:48:42
,如果你運行遊戲作爲一個子進程,當另一個進程結束時,你會得到SIGCHLD(17)。
嗨,不,我不會將遊戲作爲子進程運行,而是如前所述,使用LD_PRELOAD將我的共享對象鏈接到可執行文件。 – Krishna 2010-12-16 00:56:31
如果主應用程序使用標準C庫,則可以使用atexit(3)
函數來註冊在應用程序退出時要調用的函數。
有很多情況下函數不會被調用(通過信號異常終止,調用_exit(2)
等),因此請檢查手冊頁以查看是否涵蓋了所有用例。
嗨,非常感謝您花時間回覆此問題。你的建議似乎非常相關。是的,我的可執行文件(或主要應用程序或遊戲 - 無論你想調用)是使用C開發的程序。所以我應該很好地使用atexit(3)我猜。再次感謝。 – Krishna 2010-12-16 01:54:56
你究竟如何運用「鏈接到你的共享對象」來運行它? – paxdiablo 2010-12-16 00:37:36
命令提示符>(LD_PRELOAD =「./ my_shared_object.so」./my_game) – Krishna 2010-12-16 01:56:09