这里简单的脚本:
a)不断从套接字读取数据并将其存储在关联数组中
b)不断从标准input读取值,如果它们已经存在于关联数组中,则响应t / f
a&b是随机事件,不以任何方式关联。
诀窍是从两个subprocess访问数组(因为在后台放置一个进程会产生一个subprocess)
我正在考虑通过最好的策略,并且发生了一些想法,但是我想知道有没有人有更好的想法:
1)将input从套接字redirect到stdin作为subprocess,并在一个while循环中处理两个input(数据大小很小,<30个字符,所以我猜他们将保持primefaces?)。
2)读取套接字,然后读取具有小(0.1?)超时值的STDIN,以模仿非阻塞I / O。
3)更新:将套接字数据写入一个文件(实际上有另一个进程直接写入一个文件),然后每次请求进来检查值是否存在,处理文件中的条目,将它们添加到数组(使用文件locking)。
Bash不是正确的工具。 这个问题通常使用select(2)
或poll(2)
系统调用来解决,它允许您在不旋转的情况下同时等待多个文件描述符。 Bash没有任何一个接口。
我建议使用脚本语言,比如Python或者Perl(真正适用的),它提供了一个select
或poll
(如Python的select
模块)的接口。
不知道这在描述的上下文中是否足够实用和足够原子,但是使用客户机/服务器模型和命名管道,可以创建一个while循环来区分来自fifo或stdin
。
服务器不断从套接字( /tmp/to
)读取行,以及从stdin
(通过/tmp/to
重定向到服务器)的行。
但是, stdin
行会被del
字节( \177
)标记为该行的第一个字节。
然后(后台)客户端while循环使用这个第一个字节的行来区分不同来源的行。
# terminal window 1 # server ( rm -f /tmp/to /tmp/from mkfifo /tmp/to /tmp/from while true; do while IFS="" read -r -d $'\n' line; do printf '%s\n' "${line}" done </tmp/to >/tmp/from & bgpid=$! exec 3>/tmp/to exec 4</tmp/from trap "kill -TERM $bgpid; exit" 0 1 2 3 13 15 wait "$bgpid" echo "restarting..." done ) & serverpid=$! # client ( exec 3>/tmp/to; exec 4</tmp/from; while IFS="" read -r -d $'\n' <&4 line; do if [[ "${line:0:1}" == $'\177' ]]; then printf 'line from stdin: %s\n' "${line:1}" else printf 'line from fifo: %s\n' "$line" fi done & trap "kill -TERM $"'!; exit' 1 2 3 13 15 while IFS="" read -r -d $'\n' line; do # can we make it atomic? # sleep 0.5 # dd if=/tmp/to iflag=nonblock of=/dev/null # flush fifo printf '\177%s\n' "${line}" done >&3 ) #kill -TERM $serverpid # terminal window 2 echo hello > /tmp/to