没有EOF的“cat”比特流

时间:2014-06-19 12:32:26

标签: bash

我打开了一个用于读写的文件,并将该文件与文件描述符3相关联,即exec 3<>/dev/udp/10.10.10.1/161。当我将精心制作的UDP数据包重定向到文件描述符3并收到回复时,如何从文件描述符3中读取它?像catread这样的常用工具不能正常工作,因为作为回复收到的UDP数据包(基本上只是一个比特流)没有换行符或EOF,例如cat不知道没有更多的数据可以期待。例如,你可以看到我对猫SIGINT的看法:

$ cat <&3 
0Gpublic�:�0,0+C1841.local^C
$ 

我想检查是否有从10.10.10.1收到的UDP数据,这意味着如果文件描述符3包含一些数据(甚至是一位),则收到回复。

1 个答案:

答案 0 :(得分:1)

您的问题是您无法正确识别数据包末尾。没有EOF(如你所注意到的)能指(如特殊字符或文件关闭事件或类似事件)。相反,你所能做的只是

  • 读取固定大小的字符(如果您的数据包大小固定)或
  • 读取单个令牌(可能是字节),直到您的数据包的语法声明它已完成或
  • 读取直到发生超时。

如果可能的话,前两个由您负责。

最后一个可以使用子shell中的cat来实现,你会在一段时间后杀掉它:

cat <&3 & pid=$!
sleep 0.1
kill "$pid" 2>/dev/null

将它放在一个函数中,每个调用将持续0.1秒并输出当时可以读取的内容。