getrandom(2) - wariua/manpages-ko GitHub Wiki

NAME

getrandom - 일련의 λ‚œμˆ˜ λ°”μ΄νŠΈ μ–»κΈ°

SYNOPSIS

#include <sys/random.h>

ssize_t getrandom(void *buf, size_t buflen, unsigned int flags);

DESCRIPTION

getrandom() μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ bufκ°€ κ°€λ¦¬ν‚€λŠ” 버퍼λ₯Ό buflen κ°œκΉŒμ§€μ˜ λ‚œμˆ˜ λ°”μ΄νŠΈλ“€λ‘œ μ±„μš΄λ‹€. 이 λ°”μ΄νŠΈλ“€μ„ μ‚¬μš©μž 곡간 λ‚œμˆ˜ μƒμ„±κΈ°μ˜ μ‹œλ“œλ‘œ μ‚¬μš©ν•˜κ±°λ‚˜ μ•”ν˜Έν•™μ  μš©λ„μ— μ‚¬μš©ν•  수 μžˆλ‹€.

기본적으둜 getrandom()은 urandom μ›μ²œμœΌλ‘œλΆ€ν„° (즉 /dev/urandom μž₯μΉ˜μ™€ 같은 μ›μ²œμœΌλ‘œλΆ€ν„°) μ—”νŠΈλ‘œν”Όλ₯Ό 뽑아낸닀. flags 인자λ₯Ό 톡해 이 λ™μž‘μ„ λ°”κΏ€ 수 μžˆλ‹€.

urandom μ›μ²œμ΄ μ΄ˆκΈ°ν™” λ˜μ–΄ μžˆλŠ” κ²½μš°μ—λŠ” 256λ°”μ΄νŠΈκΉŒμ§€μ˜ μ½κΈ°λŠ” 항상 μš”μ²­ν•œ 만큼의 λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•˜λ©° μ‹œκ·Έλ„μ— μ˜ν•΄ μ€‘λ‹¨λ˜μ§€ μ•Šκ²Œ λœλ‹€. 더 큰 버퍼 크기에 λŒ€ν•΄μ„  그런 보μž₯이 μ—†λ‹€. 예λ₯Ό λ“€μ–΄ 호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜λ©΄ μΌλΆ€λ§Œ μ±„μ›Œμ§„ 버퍼λ₯Ό λ°˜ν™˜ν•  μˆ˜λ„ 있고 EINTR 였λ₯˜λ‘œ μ‹€νŒ¨ν•  μˆ˜λ„ μžˆλ‹€.

urandom μ›μ²œμ΄ 아직 μ΄ˆκΈ°ν™” λ˜μ–΄ μžˆμ§€ μ•Šμ€ κ²½μš°μ—λŠ” flags에 GRND_NONBLOCK을 μ§€μ •ν•˜μ§€ μ•Šμ•˜μœΌλ©΄ getrandom()이 블둝 ν•˜κ²Œ λœλ‹€.

flags μΈμžλŠ” λΉ„νŠΈ 마슀크이며 λ‹€μŒ 값듀을 0개 λ˜λŠ” κ·Έ 이상 OR ν•œ 값을 담을 수 μžˆλ‹€.

GRND_RANDOM
이 λΉ„νŠΈκ°€ μ„€μ •λ˜μ–΄ 있으면 urandom μ›μ²œ λŒ€μ‹  random μ›μ²œμœΌλ‘œλΆ€ν„° (즉 /dev/random μž₯μΉ˜μ™€ 같은 μ›μ²œμœΌλ‘œλΆ€ν„°) λ‚œμˆ˜ λ°”μ΄νŠΈλ₯Ό 뽑아낸닀. random μ›μ²œμ€ ν™˜κ²½ μž‘μŒμ—μ„œ 얻은 μ—”νŠΈλ‘œν”Όλ₯Ό 기반으둜 ν•˜λ„λ‘ μ œν•œλ˜μ–΄ μžˆλ‹€. random μ›μ²œ 내에 μ‚¬μš© κ°€λŠ₯ν•œ λ°”μ΄νŠΈ μˆ˜κ°€ buflen에 μš”μ²­ν•œ 값보닀 μž‘μœΌλ©΄ μ‚¬μš© κ°€λŠ₯ν•œ λ‚œμˆ˜ λ°”μ΄νŠΈλ“€λ§Œ λ°˜ν™˜ν•œλ‹€. μ‚¬μš© κ°€λŠ₯ν•œ λ‚œμˆ˜ λ°”μ΄νŠΈκ°€ μ—†λŠ” 경우의 λ™μž‘ 방식은 flags μΈμžμ— GRND_NONBLOCK이 μžˆλŠ”μ§€ 여뢀에 따라 λ‹€λ₯΄λ‹€.
GRND_NONBLOCK
기본적으둜 getrandom()이 random μ›μ²œμœΌλ‘œλΆ€ν„° 읽어듀일 λ•Œ μ‚¬μš© κ°€λŠ₯ν•œ λ‚œμˆ˜ λ°”μ΄νŠΈκ°€ μ—†μœΌλ©΄ 블둝 ν•˜λ©°, urandom μ›μ²œμœΌλ‘œλΆ€ν„° 읽어듀일 λ•Œ μ—”νŠΈλ‘œν”Ό 풀이 아직 μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜μœΌλ©΄ 블둝 ν•œλ‹€. GRND_NONBLOCK ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•˜λ©΄ 이런 κ²½μš°μ— getrandom()이 블둝 ν•˜μ§€ μ•Šκ³  μ¦‰μ‹œ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό EAGAIN으둜 μ„€μ •ν•œλ‹€.

RETURN VALUE

성곡 μ‹œ getrandom()은 버퍼 buf둜 λ³΅μ‚¬λœ λ°”μ΄νŠΈ 수λ₯Ό λ°˜ν™˜ν•œλ‹€. flags에 GRND_RANDOM을 μ§€μ •ν–ˆλŠ”λ° random μ›μ²œμ— μΆ©λΆ„ν•œ μ—”νŠΈλ‘œν”Όκ°€ μžˆμ§€ μ•Šμ•˜κ±°λ‚˜ μ‹œμŠ€ν…œ 호좜이 μ‹œκ·Έλ„μ— μ˜ν•΄ μ€‘λ‹¨λ˜μ—ˆλ‹€λ©΄ 이 값이 buflen을 톡해 μš”μ²­ν•œ λ°”μ΄νŠΈ μˆ˜λ³΄λ‹€ μž‘μ„ μˆ˜λ„ μžˆλ‹€.

였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° errnoλ₯Ό 적절히 μ„€μ •ν•œλ‹€.

ERRORS

EAGAIN
μš”μ²­ν•œ 만큼의 μ—”νŠΈλ‘œν”Όκ°€ μ‚¬μš© κ°€λŠ₯ν•˜μ§€ μ•Šμ•˜μœΌλ©° GRND_NONBLOCK을 μ„€μ •ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ getrandom()이 블둝 ν–ˆμ„ 것이닀.
EFAULT
bufκ°€ κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œκ°€ μ ‘κ·Ό κ°€λŠ₯ν•œ μ£Όμ†Œ 곡간 밖에 μžˆλ‹€.
EINTR
호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜μ—ˆλ‹€. signal(7) 맨 νŽ˜μ΄μ§€μ—μ„œ SA_RESTART ν”Œλž˜κ·Έκ°€ μžˆκ±°λ‚˜ 없을 λ•Œ "느린" μž₯μΉ˜μ— λŒ€ν•œ read(2) 호좜 쀑단을 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€μ— λŒ€ν•œ μ„€λͺ…을 보라.
EINVAL
flags에 μœ νš¨ν•˜μ§€ μ•Šμ€ ν”Œλž˜κ·Έλ₯Ό μ§€μ •ν–ˆλ‹€.
ENOSYS
getrandom()의 glibc 래퍼 ν•¨μˆ˜μ—μ„œ 기반 컀널이 이 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ κ΅¬ν˜„ν•˜κ³  μžˆμ§€ μ•Šλ‹€κ³  νŒλ‹¨ν–ˆλ‹€.

VERSIONS

λ¦¬λˆ…μŠ€ 컀널 버전 3.17μ—μ„œ getrandom()이 λ„μž…λ˜μ—ˆλ‹€. glibc 버전 2.25μ—μ„œ 지원이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

이 μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€.

NOTES

λ‚œμˆ˜λ₯Ό μ–»λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ μΈν„°νŽ˜μ΄μŠ€λ“€μ˜ μ†Œκ°œμ™€ λΉ„κ΅λŠ” random(7)을 보라.

/dev/random 및 /dev/urandomκ³Ό 달리 getrandom()μ—λŠ” 경둜λͺ…μ΄λ‚˜ 파일 λ””μŠ€ν¬λ¦½ν„° μ‚¬μš©μ΄ μˆ˜λ°˜λ˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ chroot(2) λ•Œλ¬Έμ— /dev 경둜λͺ…이 보이지 μ•Šκ²Œ λ˜λŠ” κ²½μš°λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 이 νŒŒμΌλ“€ 쀑 ν•˜λ‚˜λ₯Ό μ—° 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ‘μš©μ΄ (κ°€λ Ή 데λͺ¬μ΄ κ°œμ‹œ κ³Όμ • 쀑에) λ‹«λŠ” κ²½μš°μ— getrandom()이 μœ μš©ν•  수 μžˆλ‹€.

λ°˜ν™˜ν•˜λŠ” μ΅œλŒ€ λ°”μ΄νŠΈ 수

λ¦¬λˆ…μŠ€ 3.19 ν˜„μž¬ λ‹€μŒ μ œν•œμ΄ μ μš©λœλ‹€.

  • urandom μ›μ²œμœΌλ‘œλΆ€ν„° 읽어듀일 λ•Œ int의 크기가 32λΉ„νŠΈμΈ μ‹œμŠ€ν…œμ—μ„œ getrandom() 호좜 ν•œ 번이 μ΅œλŒ€ 33554431λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•œλ‹€.

  • random μ›μ²œμœΌλ‘œλΆ€ν„° 읽어듀일 λ•Œ μ΅œλŒ€ 512λ°”μ΄νŠΈλ₯Ό λ°˜ν™˜ν•œλ‹€.

μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•œ 쀑단

urandom μ›μ²œμœΌλ‘œλΆ€ν„° 읽어듀일 λ•Œ (GRND_RANDOM이 μ„€μ •λ˜μ–΄ μžˆμ§€ μ•Šμ„ λ•Œ) getrandom()은 (GRND_NONBLOCK ν”Œλž˜κ·Έλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄) μ—”νŠΈλ‘œν”Ό 풀이 μ΄ˆκΈ°ν™” 될 λ•ŒκΉŒμ§€ 블둝 ν•˜κ²Œ λœλ‹€. λ§Žμ€ 수의 (256 λ„˜λŠ”) λ°”μ΄νŠΈλ₯Ό 읽도둝 μš”μ²­ν•˜λ©΄ κ·Έ λ°”μ΄νŠΈλ“€μ„ μƒμ„±ν•˜μ—¬ 컀널 λ©”λͺ¨λ¦¬μ—μ„œ buf둜 볡사할 λ•ŒκΉŒμ§€ getrandom()이 블둝 ν•˜κ²Œ λœλ‹€. random μ›μ²œμœΌλ‘œλΆ€ν„° 읽어듀일 λ•Œ (GRND_RANDOM이 μ„€μ •λ˜μ–΄ μžˆμ„ λ•Œ) getrandom()은 (GRND_NONBLOCK ν”Œλž˜κ·Έλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄) μ‚¬μš© κ°€λŠ₯ν•œ λ‚œμˆ˜ λ°”μ΄νŠΈκ°€ 있게 될 λ•ŒκΉŒμ§€ 블둝 ν•˜κ²Œ λœλ‹€.

urandom μ›μ²œμœΌλ‘œλΆ€ν„° 읽고 μžˆλŠ” λ™μ•ˆ 블둝 된 getrandom() 호좜이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ μ€‘λ‹¨λ˜μ—ˆμ„ λ•Œμ˜ λ™μž‘ 방식은 μ—”νŠΈλ‘œν”Ό λ²„νΌμ˜ 졜초 μƒνƒœμ™€ μš”μ²­ 크기인 buflen에 따라 달라진닀. 아직 μ—”νŠΈλ‘œν”Όκ°€ μ΄ˆκΈ°ν™” λ˜μ§€ μ•Šμ•˜μœΌλ©΄ EINTR 였λ₯˜λ‘œ 호좜이 μ‹€νŒ¨ν•œλ‹€. μ—”νŠΈλ‘œν”Ό 풀이 μ΄ˆκΈ°ν™” λ˜μ—ˆμœΌλ©° μš”μ²­ 크기가 크면 (buflen > 256) 호좜이 μΌλΆ€λ§Œ μ±„μ›Œμ§„ 버퍼λ₯Ό λ°˜ν™˜ν•˜λ©° μ„±κ³΅ν•˜κ±°λ‚˜ EINTR 였λ₯˜λ‘œ μ‹€νŒ¨ν•œλ‹€. μ—”νŠΈλ‘œν”Ό 풀이 μ΄ˆκΈ°ν™” λ˜μ—ˆμœΌλ©° μš”μ²­ 크기가 μž‘μœΌλ©΄ (buflen <= 256) getrandom()이 EINTR둜 μ‹€νŒ¨ν•˜μ§€ μ•Šκ²Œ λœλ‹€. μš”μ²­ 받은 만큼의 λ°”μ΄νŠΈλ₯Ό λͺ¨λ‘ λ°˜ν™˜ν•˜κ²Œ λœλ‹€.

random μ›μ²œμœΌλ‘œλΆ€ν„° 읽고 μžˆλŠ” 쀑에 μž„μ˜ 크기의 λΈ”λ‘œν‚Ή μš”μ²­μ΄ μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ 쀑단될 수 μžˆλ‹€. (호좜이 EINTR 였λ₯˜λ‘œ μ‹€νŒ¨ν•œλ‹€.)

urandom μ›μ²œμœΌλ‘œλΆ€ν„° μž‘μ€ (<= 256λ°”μ΄νŠΈ) 버퍼λ₯Ό μ½μ–΄λ“€μ΄λŠ” 것이 getrandom()의 μ„ ν˜Έ μ‚¬μš© 방식이닀.

μž‘μ€ buflen 값에 λŒ€ν•œ νŠΉλ³„ν•œ μ²˜λ¦¬λŠ” μš”μ¦˜ glibcμ—μ„œλ„ μ§€μ›ν•˜λŠ” OpenBSD의 getentropy(3)μ™€μ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ μ„€κ³„λœ 것이닀.

getrandom() μ‚¬μš©μžλŠ” μ–Έμ œλ‚˜ λ°˜ν™˜ 값을 ν™•μΈν•˜μ—¬ 였λ₯˜κ°€ λ°œμƒν–ˆκ±°λ‚˜ μš”μ²­λ³΄λ‹€ 적은 λ°”μ΄νŠΈκ°€ λ°˜ν™˜λ˜μ—ˆλŠ”μ§€ νŒλ‹¨ν•΄μ•Ό ν•œλ‹€. GRND_RANDOM을 μ§€μ •ν•˜μ§€ μ•Šμ•˜κ³  buflenκ°€ 256 μ΄ν•˜μΈ κ²½μš°μ—λŠ” μš”μ²­λ³΄λ‹€ 적은 λ°”μ΄νŠΈκ°€ λ°˜ν™˜λ˜λŠ” κ²½μš°κ°€ μ ˆλŒ€ 없을 ν…Œμ§€λ§Œ μ„Έμ‹¬ν•œ ν”„λ‘œκ·Έλž˜λ¨ΈλΌλ©΄ κ·Έλž˜λ„ 확인할 것이닀!

BUGS

λ¦¬λˆ…μŠ€ 3.19 ν˜„μž¬ λ‹€μŒ 버그가 μ‘΄μž¬ν•œλ‹€.

  • CPU λΆ€ν•˜μ— 따라 getrandom()이 μš”μ²­ν•œ λ°”μ΄νŠΈ λͺ¨λ‘λ₯Ό 읽기 μ „κΉŒμ§€ μ‹œκ·Έλ„μ— λ°˜μ‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

SEE ALSO

getentropy(3), random(4), urandom(4), random(7), signal(7)


2017-09-15

⚠️ **GitHub.com Fallback** ⚠️