Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 猛击术语陷阱-我做错了什么?_Bash_Signals_Term_Bash Trap - Fatal编程技术网

Bash 猛击术语陷阱-我做错了什么?

Bash 猛击术语陷阱-我做错了什么?,bash,signals,term,bash-trap,Bash,Signals,Term,Bash Trap,鉴于此hack.c程序: #include <stdio.h> main() { int i=0; for(i=0; i<100; i++) { printf("%d\n", i); sleep(5); } } 如果我运行hack.sh,将创建两个进程——一个用于bash,一个用于C任务。如果一个术语信号被发送到bash进程,那么C进程就不会受到损害 现在,假设最初的bash是使用Runtime.exec()从Java程序启动的,那么我对它的唯一控制就是Pr

鉴于此hack.c程序:

#include <stdio.h>
main()
{
 int i=0;
 for(i=0; i<100; i++) {
   printf("%d\n", i);
   sleep(5);
 }
}
如果我运行hack.sh,将创建两个进程——一个用于bash,一个用于C任务。如果一个术语信号被发送到bash进程,那么C进程就不会受到损害

现在,假设最初的bash是使用Runtime.exec()从Java程序启动的,那么我对它的唯一控制就是Process.destroy()(它向bash进程发送术语)?假设我想让C进程与启动它的bash一起消亡

我在bash中尝试过这样的事情:

#!/bin/bash
trap "kill -TERM -$$; exit" TERM
./hack
i、 捕捉术语信号并将其重新广播给整个过程组的陷阱条款。这对我来说不起作用-一个包含trap子句的bash进程忽略了术语信号


我在这里遗漏了什么?

您可以尝试以下几点:

#!/bin/bash
./hack &
pid=$!
trap "kill $pid" TERM
wait $pid
这样做可能更简单(和等效):

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

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

bash的手册页上说:如果bash正在等待命令完成并收到一个设置了陷阱的信号,那么陷阱将在命令完成之前不会执行。您是否尝试过使用
exec
而不是保持shell进程的活动状态?没错,tangens。我唯一的借口是,文本在信号部分,远远高于陷阱文档。谢谢这是可行的,尽管你可能认为它不可行,因为tangens在对这个问题的评论中说了些什么。但tangens部分引用的完整段落说:如果bash正在等待命令完成并接收到已设置陷阱的信号,则在命令完成之前陷阱不会执行。当bash通过wait builtin等待异步命令时,接收到已设置陷阱的信号将导致wait builtin立即返回,退出状态大于128,紧接着执行陷阱。还想补充一点,您可以终止整个进程组(过程本身和它的孩子)通过做:杀死期限-$$
#!/bin/bash
./hack &
trap "kill $!" TERM
wait