zl程序教程

您现在的位置是:首页 >  其他

当前栏目

DuplexPipe二三事(一)——有趣的起因:算24

2023-03-14 10:20:29 时间

DuplexPipe 是因为“无聊”!真的,那天很无聊,想起小时候用扑克牌和姐姐比赛算24,就随手写了一个 Shell 脚本重温一下:

#!/bin/sh for ((i=0;i<4;i++)) do ((n=$RANDOM%10+1)) echo -n "$n " done echo i=0 while read exp do ((i++)) ((value=$exp)) if [[ $value -ne 24 ]] then echo -n "Wrong! " echo "$exp=$value" echo "try again!" else echo "OK!" echo "Total use ${i}s" break fi done

最近好像养成一个习惯:能让计算机做则尽量不自己做。才玩了几盘,就开始动歪脑筋要写一个求24的程序来自动计算。方法就是最简单的穷举,下面是一个最初的简陋版本(有兴趣的朋友可以在此再添加五种括号):

#!/bin/sh s[0]='+' s[1]='-' s[2]='*' s[3]='/' read a b c d for ((i=0;i<64;i++)) do ((k=i%4)) x=${s[$k]} ((k=i/4%4)) y=${s[$k]} ((k=i/16)) z=${s[$k]} e="$a$x$b$y$c$z$d" r=`echo $e | bc -l | sed -e 's//.0/+$//'` if [[ "$r" == "24" ]] then echo "$e=$r" fi done

既然能让计算机自动计算结果,那我先运行程序1,显示4个随机数;运行程序2,输入程序1生成的4个数字,获得结果后再反馈给程序1。但转念一想:我这样手工进行输入输出的工作,不是比算24本身更枯燥、单调?而且是重复的劳动!理所当然应该由计算机自动完成。

为完成这个任务,计算机要做的就是让“程序1”和“程序2”进行聊天:“程序1”的输出作为“程序2”的输入、“程序2”的输出作为“程序1”的输入。这一定义会让人立刻联想到“管道”(exe1 | exe2),但遗憾的是“管道”是单向的——只能满足“程序1”的输出作为“程序2”的输入。

其实这就是一个“进程通信”(IPC)的问题,如果你熟悉 UNIX 的历史,也会和我一样联想到 Socket 。我随即想起了网络瑞士军刀——nc(netcat),并用它顺利解决了这个问题!我会在《DuplexPipe二三事(二)》中介绍这个方法。


版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“redraiment”和主站点地址,方便其他朋友提问和指正。

联系方式

我的邮箱,欢迎来信(redraiment@gmail.com
我的Blogger(子清行):http://redraiment.blogspot.com/
我的Google Sites(子清行):https://sites.google.com/site/redraiment
我的CSDN博客(梦婷轩):http://blog.csdn.net/redraiment
我的百度空间(梦婷轩):http://hi.baidu.com/redraiment