从脚本创建类似于 /dev/random 的设备

从脚本创建类似于 /dev/random 的设备

我正在编写一个程序,我将为其创建一个脚本来生成特定格式的测试数据。

  1. 我如何创建一个/dev/myprogram工作方式类似于的设备/dev/random(最好在 的子目录中/dev/,例如/dev/test/myprogram:)?
  2. 我可以将任何脚本附加到此类设备,还是必须使用一些(哪些?)低级 API 来编写 C 程序?
  3. 我是否必须一次返回一个字节,或者我可以将设备设置为始终返回指定数量的字节(大于 1)吗?

我正在使用 Ubuntu 14.04,尽管我正在寻找一个适用于任何 *nix 系统的通用答案。

答案1

如果没有内核的帮助(通过编写自己的内核驱动程序模块),实际上不可能制造一个设备;尽管有 FUSE,以及鲜为人知且不普遍支持的 CUSE 用于用户空间中的字符设备,而 NBD 可用于块设备。

如果相似就足够了,您可以使用命名管道mkfifo,然后使用一些进程将“随机”数据写入该设备,从而允许其他进程从中读回相同的数据。您可以用这样的命名管道替换/dev/randomand ,大多数程序都会很乐意从中读取“随机”数据,因为很少有程序会考虑检查它们是否真的在与真正的随机设备通信。 /dev/urandom(直到随机ioctl得到更广泛的使用)

# mkfifo /dev/foobar
# while true; do dd if=/dev/urandom of=/dev/foobar; done &
# hexdump -C -n 16 /dev/foobar
00000000  ec ec 91 4b 9a 62 95 b0  95 7f 44 16 21 8d cd de  |...K.b....D.!...|

答案2

(这不完全是你问的,但是......)有时 bash $RANDOM 可以完成这项工作......

例如:生成 20 个骰子

for a in {1..20}; do echo "$(($RANDOM % 6 + 1))"; done

或者如果你愿意的话

declare -a A=(⚀  ⚁  ⚂  ⚃  ⚄  ⚅ )
for a in {1..20}; do echo ${A[$(($RANDOM % 6))]}; done

相关内容