Shell 父进程在从子进程接收并捕获信号后停止等待?
我在shell中编写了一个脚本,遇到了一个我不完全理解的行为。即此脚本:Shell 父进程在从子进程接收并捕获信号后停止等待?,shell,sh,Shell,Sh,我在shell中编写了一个脚本,遇到了一个我不完全理解的行为。即此脚本: #!/bin/sh # traps SIGINT and only echoes trap 'trapINT' INT trapINT() { echo "Child calling." } # sleeps for i seconds, then prints i and # sends a SIGINT to parent sleep_and_echo() { sleep $1 echo $1 ki
#!/bin/sh
# traps SIGINT and only echoes
trap 'trapINT' INT
trapINT() {
echo "Child calling."
}
# sleeps for i seconds, then prints i and
# sends a SIGINT to parent
sleep_and_echo() {
sleep $1
echo $1
kill -INT $2
}
# Main loop, spawn three children
for i in $(seq 1 3); do
sleep_and_echo $i $$ &
echo "Process no. $i with PID $! executed."
done
# wait for all the children to finish?
wait
echo "Waiting done."
exit
起初我认为,对于每个孩子,父母都会收到一个SIGINT,不会中断,然后会等待孩子们结束,然后会回应他的孩子结束了,也会结束他自己
然而,这个过程有点奇怪,在收到第一个孩子的第一个信号(i=1)后,他似乎放弃了等待。下面是脚本的终端执行:
ashen@SummerParadise:~/School/UNIX/8-DU$ ./examp.sh
Process no. 1 with PID 3904 executed.
Process no. 2 with PID 3905 executed.
Process no. 3 with PID 3906 executed.
1
child calling
Waiting done.
ashen@SummerParadise:~/School/UNIX/8-DU$ 2
./examp.sh: 11: kill: No such process
3
./examp.sh: 11: kill: No such process
^C
有人能解释这种行为吗?我想做一个脚本,等待他的孩子,只允许高达1美元的运行在同一时间,收到一个信号,如果一个结束,并启动另一个,但事实上,他停止等待后,陷阱例程破坏了这个想法
谢谢我在posix文档中找不到很好的描述,但是bash主页上说: 当bash正在等待异步命令时 通过等待内置,接收已设置陷阱的信号将导致等待内置 立即返回,退出状态大于128,紧接着执行陷阱 因此,您可以通过执行以下操作重试等待:
(exit 129)
while $? -gt 128; do wait; done
我相信
等待
是先获取信号,然后停止,然后将信号传递给脚本(脚本捕获它并从现在停止的等待继续)。我认为您需要在处理程序中重新等待。另外,INT
可能不是这里使用的最佳信号。有关详细信息,请参阅。谢谢,已解决问题!:)同样,这个解释也有意义,因为你已经指出了等待先得到信号。非常感谢。您是在处理程序中等待还是其他什么?不需要孩子向家长发出信号。当子进程退出时,父进程将收到SIGCHLD(这就是wait
的工作原理)