스크립트에서 /dev/random과 유사한 장치를 생성합니다.

스크립트에서 /dev/random과 유사한 장치를 생성합니다.

나는 특정 형식의 테스트 데이터를 생성하는 스크립트를 생성할 프로그램을 작성 중입니다.

  1. /dev/myprogram유사하게 작동하는 장치를 어떻게 만들 수 있습니까 ( 예: : /dev/random하위 디렉터리에 있는 것이 좋습니다 )?/dev//dev/test/myprogram
  2. 그러한 장치에 스크립트를 첨부할 수 있습니까? 아니면 C 프로그램을 작성하기 위해 일부 (어느?) 하위 수준 API를 사용해야 합니까?
  3. 한 번에 1바이트를 반환해야 합니까, 아니면 항상 지정된 바이트 수(1보다 큼)를 반환하도록 장치를 설정할 수 있습니까?

나는 Ubuntu 14.04를 사용하고 있지만 모든 *nix 시스템에서 작동하는 일반적인 답변을 찾고 있습니다.

답변1

커널의 도움 없이(자신의 커널 드라이버 모듈을 작성하여) 장치를 만드는 것은 사실상 불가능합니다. FUSE가 있고 사용자 공간의 문자 장치에 대해 잘 알려지지 않고 보편적으로 지원되지 않는 CUSE와 블록에서 사용할 수 있는 NBD가 있습니다. 장치.

유사성이 충분하다면 명명된 파이프를 사용한 mkfifo다음 일부 프로세스에서 해당 장치에 "임의" 데이터를 쓰도록 하여 다른 프로세스가 해당 장치에서 동일한 데이터를 다시 읽을 수 있도록 할 수 있습니다. 이와 같은 명명된 파이프로 및 를 대체할 수 있으며 /dev/random, 대부분의 프로그램은 "임의의" 데이터를 기꺼이 읽을 것입니다. 실제로 실제로 임의의 장치와 통신하고 있는지 확인하는 것에 대해 생각하는 프로그램은 거의 없기 때문입니다. /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

관련 정보