我想为进程设置超时,这是我的shell。 我使用expect来做,以避免其他包依赖。
test.sh
#!/bin/bash
# $1 timeout in seconds
# $2 command
timeout() {
time=$1
shift
# start the command in a subshell to avoid problem with pipes
# (spawn accepts one command) -noecho
command="/bin/sh -c \"$*\""
expect -c "set echo \"-noecho\";set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 }"
if [ $? = 1 ] ; then
echo "timeout after ${time} seconds"
exit 1
fi
}
timeout 120 ./test
test.c的
#include <stdlib.h>
int main() {
sleep(120);
}
我运行一个程序到 fork&amp; exec shell,我使用管道来捕获shell输出。
但我发现了事实:
我发现shell dup父管到 STDOUT , STDERR ,这很好。
lrwx------ 1 root root 64 Sep 13 17:07 0 -> /dev/pts/1
l-wx------ 1 root root 64 Sep 13 17:07 1 -> pipe:[14070157]
l-wx------ 1 root root 64 Sep 13 17:07 2 -> pipe:[14070158]
lr-x------ 1 root root 64 Sep 13 17:07 255 -> /path/to/my/shell
这是期待,它继承了父(我的shell)管道,并打开14070167管道以捕获睡眠程序test.c(我猜它管道孩子的STDOUT)。
lrwx------ 1 root root 64 Sep 13 17:08 0 -> /dev/pts/1
l-wx------ 1 root root 64 Sep 13 17:08 1 -> pipe:[14070157]
l-wx------ 1 root root 64 Sep 13 17:07 2 -> pipe:[14070158]
lr-x------ 1 root root 64 Sep 13 17:08 3 -> pipe:[14070167]
l-wx------ 1 root root 64 Sep 13 17:08 4 -> pipe:[14070167]
lrwx------ 1 root root 64 Sep 13 17:08 5 -> /dev/tty
lrwx------ 1 root root 64 Sep 13 17:08 6 -> /dev/ptmx
但让我感到困惑的是test.c没有将1复制到管道[140167]。到现在为止它工作正常。 (虽然这不是导致问题的重点)
但我有一个BUG,如果test.c是一个守护程序,它得到fd 5,这是管道14070158,(这是之前重复的test.sh STDERR)。并期待退出。如果我为test.sh轮询STDERR,它将阻塞,因为发送端口是一个守护程序。 (假设test.c是守护程序)。
lrwx------ 1 root root 64 Sep 13 17:07 0 -> /dev/pts/2
lrwx------ 1 root root 64 Sep 13 17:07 1 -> /dev/pts/2
lrwx------ 1 root root 64 Sep 13 17:07 2 -> /dev/pts/2
lr-x------ 1 root root 64 Sep 13 17:07 3 -> pipe:[14070167]
l-wx------ 1 root root 64 Sep 13 17:07 4 -> pipe:[14070167]
l-wx------ 1 root root 64 Sep 13 17:07 5 -> pipe:[14070158]
我的问题是如何期待工作?我可以让它不给管道[14070158] test.c,以便我可以修复我的BUG吗?
我期待的版本是5.43