6

鉴于这个 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 信号。

我在这里想念什么?

4

1 回答 1

10

您可以尝试以下方法:

#!/bin/bash
./hack &
pid=$!
trap "kill $pid" TERM
wait $pid

这样做可能更简单(和等效):

#!/bin/bash
./hack &
trap "kill $!" TERM
wait

陷阱上的双引号应该在定义陷阱时发生单词扩展,因此 $! 不应该有影响;但我更喜欢第一个版本。

于 2009-10-06T17:05:25.877 回答