【发布时间】:2009-10-06 16:42:04
【问题描述】:
鉴于这个 hack.c 程序:
#include <stdio.h>
main()
{
int i=0;
for(i=0; i<100; i++) {
printf("%d\n", i);
sleep(5);
}
}
还有这个 hack.sh bash 脚本:
#!/bin/bash
./hack
如果我运行 hack.sh,会创建两个进程 - 一个用于 bash,一个用于 C 任务。如果 TERM 信号被发送到 bash 进程,C 进程不会受到伤害。
现在,假设原始 bash 是使用 Runtime.exec() 从 Java 程序启动的,那么我对它的唯一控制是 Process.destroy()(它将 TERM 发送到 bash 进程)?假设我希望 C 进程与启动它的 bash 一起死掉?
我一直在 bash 中尝试这样的事情:
#!/bin/bash
trap "kill -TERM -$$; exit" TERM
./hack
即捕获 TERM 信号并将其重新广播到整个进程组的陷阱子句。这对我不起作用 - 一个带有陷阱子句的 bash 进程忽略 TERM 信号。
我在这里错过了什么?
【问题讨论】:
-
bash 的手册页说:如果 bash 正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前不会执行陷阱。
-
您是否尝试过使用
exec而不是保持shell 进程处于活动状态? -
你说得对,唐根斯。我唯一的借口是文本在信号部分,在陷阱文档的上方。谢谢!