2010-12-16 65 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

相关问题