Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Shell 父进程在从子进程接收并捕获信号后停止等待?_Shell_Sh - Fatal编程技术网

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

我在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
  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
的工作原理)