我有两个进程,我需要这样连接:
proc1 – 将输出发送到proc2
proc2 – 将输出发送到proc1
到目前为止,所有的管道示例都是这样的:
proc1 | PROC2
这很好,但是如何使proc2的输出转到proc1?
bash的例子会很好Windows外壳的例子会很棒:)
提前致谢,
阿德里安。
添加更多详细信息:
系统预计将作为客户端 – 服务器系统,客户端 – 服务器系统中的客户端在请求 – 响应交互模型中与服务器协同工作。当客户端没有更多请求时,交互结束。
互动范例:
客户:request1;
server:response1;
客户:request2;
server:response2;
。
。
。
。
client:closeRequest;
server:closeApproved;
似乎像(假设管道可用)
客户端管道|服务器>管
因为在这种安排中客户端会产生一个大的请求,所以shell将这个大的请求管理到服务器,那么服务器会产生一个很大的响应,最后shell会把这个很大的响应传给客户端。
看起来像一个bash协处理可能是你想要的。在bash手册中查找coproc保留字。
(编辑:添加简单的使用方案)
它的工作原理如下:
# start first process as a coprocess to the current shell coproc proc1 # now ${COPROC[0]} contains the number of an open (input) file descriptor # connected to the output of proc1,and ${COPROC[1]} the number of an # open (output) file descriptor connected to the input of proc1. # start second process,connecting its input- and outputstreams # to the output- and inputstreams of the first process proc2 <&${COPROC[0]} >&${COPROC[1]} # wait on the first process to finish. wait $COPROC_PID
如果你可能有多个协处理器,请给你的进程一个这样的名字:
coproc NAME { proc1 }
然后可以使用以前使用COPROC的NAME。
这是一个使用ping函数作为proc1和proc2的完整示例程序:
#!/bin/bash # # Example program using a bash coprocess to run two processes # with their input/output streams # # # A function which reads lines of input and # writes them back to standard output with the # first char cut off,waiting 5s inbetween. # # It finishes whenever an empty line is read or written,# or at end-of-file. # # The parameter $1 is used in debugging output on stderr. # function ping () { while read do local sending echo "ping $1: received '$REPLY'" >&2 [[ -n $REPLY ]] || break sleep 5s sending=${REPLY:1} echo "ping $1: sending '$sending'" >&2 echo $sending [[ -n $sending ]] || break done echo "ping $1: end" >&2 } # # Start first ping process as a coprocess with name 'p1'. # coproc p1 { ping 1 } # send some initial data to p1. (Not needed if one of the processes # starts writing before first reading.) echo "Hello World" >&${p1[1]} sleep 2.5s # # Run second ping process,connecting its default input/output # to the default output/input of p1. # ping 2 <&${p1[0]} >&${p1[1]} # wait for the coprocess to finish too. wait $p1_PID
它使用两个调用shell函数而不是外部程序,但它也可以与这些程序一起使用。这是输出(在stderr上):
ping 1: received 'Hello World' ping 1: sending 'ello World' ping 2: received 'ello World' ping 2: sending 'llo World' ping 1: received 'llo World' ping 1: sending 'lo World' ping 2: received 'lo World' ping 2: sending 'o World' ping 1: received 'o World' ping 1: sending ' World' ping 2: received 'World' ping 2: sending 'orld' ping 1: received 'orld' ping 1: sending 'rld' ping 2: received 'rld' ping 2: sending 'ld' ping 1: received 'ld' ping 1: sending 'd' ping 2: received 'd' ping 2: sending '' ping 2: end ping 1: received '' ping 1: end