我打开了一个用于读写的文件,并将该文件与文件描述符3
相关联,即exec 3<>/dev/udp/10.10.10.1/161
。当我将精心制作的UDP数据包重定向到文件描述符3
并收到回复时,如何从文件描述符3
中读取它?像cat
或read
这样的常用工具不能正常工作,因为作为回复收到的UDP数据包(基本上只是一个比特流)没有换行符或EOF,例如cat
不知道没有更多的数据可以期待。例如,你可以看到我对猫SIGINT
的看法:
$ cat <&3
0Gpublic�:�0,0+C1841.local^C
$
我想检查是否有从10.10.10.1收到的UDP数据,这意味着如果文件描述符3
包含一些数据(甚至是一位),则收到回复。
答案 0 :(得分:1)
您的问题是您无法正确识别数据包末尾。没有EOF(如你所注意到的)能指(如特殊字符或文件关闭事件或类似事件)。相反,你所能做的只是
如果可能的话,前两个由您负责。
最后一个可以使用子shell中的cat
来实现,你会在一段时间后杀掉它:
cat <&3 & pid=$!
sleep 0.1
kill "$pid" 2>/dev/null
将它放在一个函数中,每个调用将持续0.1秒并输出当时可以读取的内容。