我正在编写一个程序,我将为其创建一个脚本来生成特定格式的测试数据。
- 我如何创建一个
/dev/myprogram
工作方式类似于的设备/dev/random
(最好在 的子目录中/dev/
,例如/dev/test/myprogram
:)? - 我可以将任何脚本附加到此类设备,还是必须使用一些(哪些?)低级 API 来编写 C 程序?
- 我是否必须一次返回一个字节,或者我可以将设备设置为始终返回指定数量的字节(大于 1)吗?
我正在使用 Ubuntu 14.04,尽管我正在寻找一个适用于任何 *nix 系统的通用答案。
答案1
如果没有内核的帮助(通过编写自己的内核驱动程序模块),实际上不可能制造一个设备;尽管有 FUSE,以及鲜为人知且不普遍支持的 CUSE 用于用户空间中的字符设备,而 NBD 可用于块设备。
如果相似就足够了,您可以使用命名管道mkfifo
,然后使用一些进程将“随机”数据写入该设备,从而允许其他进程从中读回相同的数据。您可以用这样的命名管道替换/dev/random
and ,大多数程序都会很乐意从中读取“随机”数据,因为很少有程序会考虑检查它们是否真的在与真正的随机设备通信。 /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