2010-12-16 66 views
0

我有一個我寫的鏈接到Linux可執行文件(比如遊戲)的共享對象。現在,當程序結束時(遊戲結束!),爲了執行一些清理活動,我應該在我創建的共享對象中使用哪種信號處理程序?當我的程序正常退出時,我應該期待什麼信號?

請記住,我不能控制Linux可執行文件,這是一款遊戲,我只需從Internet上下載並通過將其鏈接到我的共享對象來運行它。遊戲結束後,我希望能夠抓住該事件並進行一些清理活動。

我是否清楚我的問題?有任何想法嗎?

感謝, 克里希納

+0

你究竟如何運用「鏈接到你的共享對象」來運行它? – paxdiablo 2010-12-16 00:37:36

+0

命令提示符>(LD_PRELOAD =「./ my_shared_object.so」./my_game) – Krishna 2010-12-16 01:56:09

回答

0

一般情況下,你不能從過程中做到這一點。 (軟件不能有死亡的願望。)

但是,你可以運行一個包裝腳本什麼的,比賽結束後運行另一個程序中現有的遊戲過程:

#!/bin/sh 

run_game 
perform_cleanup_activity 
+0

嗨,您的回覆很有趣。但是需要使用我的共享對象來「蹦牀」遊戲(我稱之爲可執行文件)所做的OpenGL API調用。當遊戲結束時,我想爲每個函數調用寫入磁盤上文件的時間。如果我在「遊戲運行時」執行此操作,則可能會得到不正確的值,因爲執行文件IO操作需要時間。 – Krishna 2010-12-16 00:59:20

+0

@Kris復古病毒:或許你可以打開一個共享內存區域,你的'.so'在運行時寫入性能信息。然後,擁有一個完全獨立的應用程序,它可以打開相同的共享內存區域,讀取數據並格式化並將其寫入磁盤。這也會減少'.so'依賴的依賴關係(因爲它不需要格式化或文件I/O本身)。此外,您可以在遊戲運行時獲得實時性能數據。 – 2010-12-16 03:19:56

+0

嗨格雷格,這似乎也是一個不錯的主意。我一定會試一試。我認爲這與我的想法類似,即使用管道...... – Krishna 2010-12-16 05:48:42

1

,如果你運行遊戲作爲一個子進程,當另一個進程結束時,你會得到SIGCHLD(17)。

+0

嗨,不,我不會將遊戲作爲子進程運行,而是如前所述,使用LD_PRELOAD將我的共享對象鏈接到可執行文件。 – Krishna 2010-12-16 00:56:31

1

如果主應用程序使用標準C庫,則可以使用atexit(3)函數來註冊在應用程序退出時要調用的函數。

有很多情況下函數不會被調用(通過信號異常終止,調用_exit(2)等),因此請檢查手冊頁以查看是否涵蓋了所有用例。

+0

嗨,非常感謝您花時間回覆此問題。你的建議似乎非常相關。是的,我的可執行文件(或主要應用程序或遊戲 - 無論你想調用)是使用C開發的程序。所以我應該很好地使用atexit(3)我猜。再次感謝。 – Krishna 2010-12-16 01:54:56

相關問題