没有FIFO的进程间通信 [英] Inter-process communication without FIFOs
问题描述
在bash脚本,我们可以在后台运行多个进程使用命名管道该互通,在文件系统中注册的FIFO。这样的一个示例可以是:
Inside a BASH script we can have multiple processes running in background which intercommunicate using named pipes, FIFOs registered on the filesystem. An example of this could be:
#!/bin/bash
mkfifo FIFO
# BG process 1
while :; do echo x; done & >FIFO
# BG process 2
while :; do read; done & <FIFO
exit
我不知道是否有可能做一个脚本的后台进程之间的互通一样不使用文件系统上的一个FIFO,可能与某种文件描述符的重定向。
I wonder if it's possible to do the same intercommunication between background processes of a script without using a FIFO on filesystem, maybe with some kind of file-descriptor redirection.
推荐答案
下面的运行一样shell脚本的功能,实现了两个子过程的例子...一个子生成数字1 ... 5(睡在印刷之间),第二个从固定文件描述符(5读取,向其中第一的FD STDOUT重定向到),通过再次2和打印乘法。主处理重定向STDOUT该第二过程的另一个固定文件描述符(6),并稍后从一个在循环读取
Here's an example that runs two subprocesses implemented as functions of the same shell-script... One subprocess generates numbers 1...5 (sleeps in between prints), the second one reads from a fixed filedescriptor (5, to which STDOUT of the first FD is redirected to), multiplies by 2 and prints again. The main process redirects STDOUT of that second process to another fixed filedescriptor (6) and later on reads from that one in the loop.
它的工作原理基本相同,你会在C- code与管道(2)系统调用创建的FD对做的。要了解发生了什么下使用strace -f运行脚本!
It works basically the same as you'd do in C-code with fd pairs created by the pipe(2) system call. To understand what's happening run the script under strace -f!
Bash的版本是4.2.24(1)在Ubuntu / x86上运行。
Bash Version is 4.2.24(1) running on Ubuntu/x86.
[ubuntu /home/chris]
$ bash --version
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
脚本的输出:
[ubuntu /home/chris]
$ ./read_from_fd.sh
Got number 2.
Got number 4.
Got number 6.
Got number 8.
Got number 10.
来源$ C $ C:
Source code:
#!/bin/bash
# Generate data, output to STDOUT.
generate_five_numbers() {
for n in `seq 5` ; do
echo $n
sleep 2
done
}
# Read data from FD#5, multiply by two, output to STDOUT.
multiply_number_from_fd5_by_two() {
while read n <&5 ; do
echo "$(( $n * 2 ))"
done
}
# choose your FD number wisely ;-)
# run generator with its output dup'ed to FD #5
exec 5< <( generate_five_numbers )
# run multiplyier (reading from fd 5) with output dup'ed to FD #6
exec 6< <( multiply_number_from_fd5_by_two )
# read numbers from fd 6
while read n <&6 ; do
echo "Got number $n."
done
进程树,同时运行:
Process tree while running:
──read_from_fd.sh(8118)─┬─read_from_fd.sh(8119)───sleep(8123)
└─read_from_fd.sh(8120)
这篇关于没有FIFO的进程间通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!