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

时间:2015-09-13 09:28:45

标签: c linux bash shell expect

我想为进程设置超时,这是我的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

0 个答案:

没有答案