为什么期望让过程打开它的STDERR?

我想为一个进程设置超时,这是我的shell。 我使用期望来做到这一点,以避免其他软件包的依赖。

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&exec shell,并使用pipe来捕获shell的输出。

但是我发现了事实:

我发现shell的dup父pipe道STDOUTSTDERR ,这工作正常。

 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 

这是期望的 ,它inheritance父(我的shell)pipe道,并打开14070167pipe捕捉睡眠程序test.c(我想它pipe子的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并没有将pipe道1复制到pipe道[140167]。 到现在为止它工作正常。 (而这不是造成问题的观点)

但是我有一个BUG,如果test.c是一个守护程序,它会得到fd 5,这是pipe 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] 

我的问题是如何工作? 我可以让它不给pipe [14070158] test.c,以便我可以修复我的BUG?

我期望的版本是5.43

Solutions Collecting From Web of "为什么期望让过程打开它的STDERR?"