如何知道进程是否正在等待标准输入?

时间:2018-10-08 19:06:51

标签: linux bash expect

这是带有注释的shell命令序列

#cd `mktemp -d`
mkfifo i
exec 3<>i                   # keep pipe open
bash <i &                   # run bash interpreter in background, use -x option to see what and when is executed 
echo 'echo X' >i            # writes X immediately
echo 'if echo -n A; then' >i   # waits for input till end of if-statement
echo 'echo B; fi' >i        # writes AB
echo 'echo C; sleep 7; echo D' >i   # does not wait on stdin while sleep
echo 'exit' >i              # also kill $(jobs -p)

需要确定子进程是在等待输入还是在处理某些东西。

except会有所帮助吗?

1 个答案:

答案 0 :(得分:1)

其行为与交互式终端中的行为相同。只需尝试:

you@yourpc ~ sleep 3<enter>
ls<enter>
wait...
you@yourpc ~ ls<inserted by bash>
file1 file2 file3 ...

man 7 pipe

中描述了Linux中管道的行为。
  

管道和FIFO上的I / O

     

...

     

如果进程尝试从空管道读取,则read(2)将阻塞,直到有可用数据为止。如果过程尝试          写入一个完整的管道(请参见下文),然后执行write(2)块,直到从管道中读取了足够的数据以允许写入完成。

     

...

     

管道容量

     

管道的容量有限。如果管道已满,则write(2)将阻塞或失败,具体取决于O_NON-          设置了BLOCK标志(见下文)。不同的实现对管道容量有不同的限制。申请应          不依赖于特定容量:应设计一个应用程序,以便读取过程尽快消耗数据          可用,因此不会阻止写入过程。

这意味着fifo的写入端没有有关读取器何时读取或处理输入的信息。