0

我希望我能清楚地解释这一点。我想以编程方式从外部以“礼貌”的方式停止一个小程序,该方式仍返回状态代码 0。

更多细节:我正在开发一个测试/基准测试框架,该框架执行()s“appletviewer embed.html”并获取由此启动的进程的pid。我一直在做的是等待五秒钟,然后打开 X 显示并搜索其_NET_WM_PID属性等于 pid 的窗口,并将WM_DELETE_MESSAGE发送到该窗口。但是,这只适用于 Java 1.5 及更高版本,因为 1.4 及更低版本不设置_NET_WM_PID所以我找不到刚刚打开的窗口。

需要明确的是:使用signal()不是我想要的,因为小程序的关闭应该是“正常的”,即不应该让 appletviewer 返回非零。

再次明确:这是一个测试/基准测试框架;停止必须由框架而不是通过修改小程序来启动。我们有很多小程序要测试/运行,框架必须一个一个地运行它们,而不需要用户交互。

我考虑过的方法是:

  1. 在exec()之前和之后列出WM_CLASS属性包括sun-applet-main的窗口,然后对列表进行比较以计算出在exec()之后打开了哪些窗口。

  2. 编写我自己的appletviewer 并使其接受SIGUSR1并关闭applet,例如通过调用 destroy()方法。

有什么更好的建议吗?

4

1 回答 1

0

appletviewer的-debug选项提供了答案:

 (echo run;sleep 5;echo exit) | appletviewer -debug embed.html

我将在基准测试框架中这样做,但上面的 shell 命令形式更清楚地显示了这个想法。

对原始问题的更正:_NET_WM_PID 属性由 Java 1.7 及更高版本中的 appletviewer 设置。它不是由 1.6 及更早版本设置的。

于 2013-10-08T00:47:38.547 回答