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

NAME

eventfd - ์ด๋ฒคํŠธ ์•Œ๋ฆผ์„ ์œ„ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋งŒ๋“ค๊ธฐ

SYNOPSIS

#include <sys/eventfd.h>

int eventfd(unsigned int initval, int flags);

DESCRIPTION

eventfd()๋Š” "eventfd ๊ฐ์ฒด"๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์‘์šฉ์—์„œ ์ด๋ฒคํŠธ ๋Œ€๊ธฐ/์•Œ๋ฆผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ปค๋„์—์„œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์‘์šฉ์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋ฆฌ๋Š” ๋ฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๊ฐ์ฒด์—๋Š” ์ปค๋„์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€ํ˜ธ ์—†๋Š” 64๋น„ํŠธ ์ •์ˆ˜ (uint64_t) ์นด์šดํ„ฐ๊ฐ€ ์žˆ๋‹ค. ์ธ์ž initval์— ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ๊ทธ ์นด์šดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ eventfd()๋Š” ์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด eventfd ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

flags์— ๋‹ค์Œ ๊ฐ’๋“ค์„ ๋น„ํŠธ OR ํ•ด์„œ eventfd()์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

EFD_CLOEXEC (๋ฆฌ๋ˆ…์Šค 2.6.27๋ถ€ํ„ฐ)
์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— 'exec์—์„œ ๋‹ซ๊ธฐ'(FD_CLOEXEC) ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ด๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„  open(2)์˜ O_CLOEXEC ํ”Œ๋ž˜๊ทธ ์„ค๋ช…์„ ๋ณด๋ผ.
EFD_NONBLOCK (๋ฆฌ๋ˆ…์Šค 2.6.27๋ถ€ํ„ฐ)
์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ(open(2) ์ฐธ๊ณ )์— O_NONBLOCK ํŒŒ์ผ ์ƒํƒœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด fcntl(2)์„ ์ถ”๊ฐ€๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
EFD_SEMAPHORE (๋ฆฌ๋ˆ…์Šค 2.6.30๋ถ€ํ„ฐ)
์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ฝ๊ธฐ์— ์„ธ๋งˆํฌ์–ด ๊ฐ™์€ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. ์•„๋ž˜ ์ฐธ๊ณ .

๋ฆฌ๋ˆ…์Šค ๋ฒ„์ „ 2.6.26๊นŒ์ง€๋Š” flags ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ 0์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

eventfd()๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

read(2)

read(2)๊ฐ€ ์„ฑ๊ณตํ•  ๋•Œ๋งˆ๋‹ค 8๋ฐ”์ดํŠธ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ œ๊ณต๋ฐ›์€ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ 8๋ฐ”์ดํŠธ๋ณด๋‹ค ์ž‘์œผ๋ฉด read(2)๊ฐ€ EINVAL ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

read(2)๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ, ์ฆ‰ ํ˜ธ์ŠคํŠธ ๋จธ์‹  ์›๋ž˜์˜ ์ •์ˆ˜ ๋ฐ”์ดํŠธ ์ˆœ์„œ์ด๋‹ค.

read(2)์˜ ๋™์ž‘ ๋ฐฉ์‹์€ eventfd ์นด์šดํ„ฐ๊ฐ€ ํ˜„์žฌ 0 ์•„๋‹Œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒ์„ฑ ์‹œ EFD_SEMAPHORE ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

  • EFD_SEMAPHORE๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ณ  eventfd ์นด์šดํ„ฐ์˜ ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ฉด read(2)๊ฐ€ ๊ทธ ๊ฐ’์„ ๋‹ด์€ 8๋ฐ”์ดํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์นด์šดํ„ฐ ๊ฐ’์ด 0์œผ๋กœ ์žฌ์„ค์ •๋œ๋‹ค.

  • EFD_SEMAPHORE๋ฅผ ์ง€์ •ํ–ˆ์œผ๋ฉฐ eventfd ์นด์šดํ„ฐ์˜ ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ฉด read(2)๊ฐ€ ๊ฐ’ 1์„ ๋‹ด์€ 8๋ฐ”์ดํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์นด์šดํ„ฐ ๊ฐ’์ด 1๋งŒํผ ์ค„์–ด๋“ ๋‹ค.

  • read(2) ํ˜ธ์ถœ ์‹œ์ ์— eventfd ์นด์šดํ„ฐ๊ฐ€ 0์ด๋ฉด ์นด์šดํ„ฐ๊ฐ€ 0์ด ์•„๋‹ˆ๊ฒŒ ๋  ๋•Œ๊นŒ์ง€ ๋ธ”๋ก ํ•œ๋‹ค. (๊ทธ๋•Œ read(2)๊ฐ€ ์œ„ ์„ค๋ช…์ฒ˜๋Ÿผ ์ง„ํ–‰ํ•œ๋‹ค.) ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋…ผ๋ธ”๋ก์œผ๋กœ ๋งŒ๋“ค์—ˆ์œผ๋ฉด EAGAIN ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

write(2)

write(2) ํ˜ธ์ถœ์€ ๋ฒ„ํผ์— ์ค€ 8๋ฐ”์ดํŠธ ์ •์ˆ˜ ๊ฐ’์„ ์นด์šดํ„ฐ์— ๋”ํ•œ๋‹ค. ์นด์šดํ„ฐ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์€ ๊ฐ€์žฅ ํฐ ๋ถ€ํ˜ธ ์—†๋Š” 64๋น„ํŠธ ์ •์ˆ˜์—์„œ 1์„ ๋บ€ ๊ฒƒ(์ฆ‰ 0xfffffffffffffffe)์ด๋‹ค. ๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ทธ ์ตœ๋Œ“๊ฐ’์„ ์ดˆ๊ณผํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์œผ๋ฉด ๊ทธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— read(2)๊ฐ€ ์ด๋ค„์งˆ ๋•Œ๊นŒ์ง€ write(2)๊ฐ€ ๋ธ”๋ก ํ•œ๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋…ผ๋ธ”๋ก์œผ๋กœ ๋งŒ๋“ค์—ˆ์œผ๋ฉด EAGAIN ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

์ œ๊ณต ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ 8๋ฐ”์ดํŠธ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ’ 0xffffffffffffffff๋ฅผ ์“ฐ๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด write(2)๊ฐ€ EINVAL ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

poll(2), select(2) (๊ธฐํƒ€ ์œ ์‚ฌ ํ•จ์ˆ˜)

๋ฐ˜ํ™˜๋˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด poll(2) (epoll(7)๋„ ๋น„์Šทํ•จ) ๋ฐ select(2)๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • ์นด์šดํ„ฐ ๊ฐ’์ด 0๋ณด๋‹ค ํฌ๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•˜๋‹ค. (select(2)์˜ readfds ์ธ์ž, poll(2)์˜ POLLIN ํ”Œ๋ž˜๊ทธ)

  • ๋ธ”๋ก ๋˜์ง€ ์•Š๊ณ  ์ ์–ด๋„ "1" ๊ฐ’์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๋‹ค. (select(2)์˜ writefds ์ธ์ž, poll(2)์˜ POLLOUT ํ”Œ๋ž˜๊ทธ)

  • ์นด์šดํ„ฐ ๊ฐ’ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๊ฐ์ง€ํ•œ ๊ฒฝ์šฐ select(2)๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•˜๋ฉด์„œ ๋™์‹œ์— ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ‘œ์‹œํ•˜๋ฉฐ poll(2)์€ POLLERR ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ write(2)๋Š” ์ ˆ๋Œ€ ์นด์šดํ„ฐ๋ฅผ ๋„˜์น˜๊ฒŒ ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ KAIO ์„œ๋ธŒ์‹œ์Šคํ…œ์—์„œ eventfd "์•Œ๋ฆผ ๋ฐœ์†ก"์„ 2^64๋ฒˆ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๋„˜์นจ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด๋ก ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๊ณ  ์‹ค์ œ๋กœ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค.) ๋„˜์นจ์ด ๋ฐœ์ƒํ–ˆ์œผ๋ฉด read(2)๊ฐ€ ๊ฐ€์žฅ ํฐ uint64_t ๊ฐ’(์ฆ‰ 0xffffffffffffffff)์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” pselect(2)์™€ ppoll(2) ๊ฐ™์€ ๋‹ค๋ฅธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋‹ค์ค‘ํ™” API๋„ ์ง€์›ํ•œ๋‹ค.

close(2)
ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ซ์•„์•ผ ํ•œ๋‹ค. ๋™์ผ eventfd ๊ฐ์ฒด์— ์—ฐ๊ณ„๋œ ๋ชจ๋“  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ๋‹ซํ˜”์„ ๋•Œ ์ปค๋„์ด ๊ทธ ๊ฐ์ฒด์˜ ์ž์›์„ ํ•ด์ œํ•œ๋‹ค.

fork(2)๋กœ ์ƒ์„ฑ๋œ ์ž์‹์€ eventfd()๋กœ ๋งŒ๋“  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์‚ฌ๋ณธ์„ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค. ๋ณต์ œ๋œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ๋™์ผํ•œ eventfd ๊ฐ์ฒด์— ์—ฐ๊ณ„๋˜์–ด ์žˆ๋‹ค. 'exec์—์„œ ๋‹ซ๊ธฐ' ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด execve(2)๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ eventfd()๋กœ ๋งŒ๋“  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์œ ์ง€๋œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ eventfd()๋Š” ์ƒˆ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋„๋ก errno๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EINVAL
์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ flags์— ์ง€์ •ํ–ˆ๋‹ค.
EMFILE
์—ด๋ฆฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ํ”„๋กœ์„ธ์Šค๋ณ„ ์ œํ•œ์— ๋„๋‹ฌํ–ˆ๋‹ค.
ENFILE
์—ด๋ฆฐ ํŒŒ์ผ ์ด๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ์ „์—ญ ์ œํ•œ์— ๋„๋‹ฌํ–ˆ๋‹ค.
ENODEV
(๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ๋Š”) ์ต๋ช… ์•„์ด๋…ธ๋“œ ์žฅ์น˜๋ฅผ ๋งˆ์šดํŠธ ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.
ENOMEM
์ƒˆ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•˜๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.22๋ถ€ํ„ฐ eventfd()๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. glibc ๋ฒ„์ „ 2.8๋ถ€ํ„ฐ ์ž˜ ๋™์ž‘ํ•˜๋Š” ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.27๋ถ€ํ„ฐ eventfd2() ์‹œ์Šคํ…œ ํ˜ธ์ถœ(NOTES ์ฐธ๊ณ )์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฒ„์ „ 2.9๋ถ€ํ„ฐ glibc์˜ eventfd() ๋ž˜ํผ๊ฐ€ ์ปค๋„ ์ง€์› ์‹œ eventfd2() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•œ๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
eventfd() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

eventfd()์™€ eventfd2()๋Š” ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

์‘์šฉ์—์„œ ํŒŒ์ดํ”„(pipe(2) ์ฐธ๊ณ )๋ฅผ ์ด๋ฒคํŠธ ์ „๋‹ฌ์šฉ์œผ๋กœ๋งŒ ์“ฐ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์—์„œ ํŒŒ์ดํ”„ ๋Œ€์‹  eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. eventfd์˜ ์ปค๋„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํŒŒ์ดํ”„๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์œผ๋ฉฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ํ•œ ๊ฐœ๋งŒ ํ•„์š”ํ•˜๋‹ค. (ํŒŒ์ดํ”„์—์„œ๋Š” ๋‘ ๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.)

์ปค๋„์—์„œ ์‚ฌ์šฉ ์‹œ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋Š” ์ปค๋„์—์„œ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ์˜ ๊ฐ€๊ต๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ˆ๋ฅผ ๋“ค์–ด KAIO(์ปค๋„ AIO) ๊ฐ™์€ ๊ธฐ๋Šฅ์—์„œ ์–ด๋–ค ๋™์ž‘์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋กœ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ํ•ต์‹ฌ์€ ์—ฌ๋А ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์ฒ˜๋Ÿผ select(2)๋‚˜ poll(2), epoll(7)์„ ์ด์šฉํ•ด ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์‘์šฉ์—์„œ "์ „ํ†ต์ " ํŒŒ์ผ์˜ ์ค€๋น„ ์ƒํƒœ์™€ eventfd ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ์ปค๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ค€๋น„ ์ƒํƒœ๋ฅผ ๋™์‹œ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (eventfd() ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ๊ทธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ select(2)๋‚˜ poll(2), epoll(7)์„ ํ†ตํ•ด ๋‹ค์ค‘ํ™” ํ•  ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ์ด๋‹ค.)

ํ”„๋กœ์„ธ์Šค์˜ /proc/[pid]/fdinfo ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ๋Œ€์‘ํ•˜๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ•ญ๋ชฉ์„ ํ†ตํ•ด eventfd ์นด์šดํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ proc(5) ์ฐธ๊ณ .

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ์ฐจ์ด

๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋‘ ๊ฐ€์ง€ ์žˆ๋‹ค. eventfd()์™€ ๋” ์ตœ์‹ ์ธ eventfd2()์ด๋‹ค. ์•ž์ชฝ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ flags ์ธ์ž๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋’ค์ชฝ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์œ„์— ๊ธฐ์ˆ ํ•œ flags ๊ฐ’๋“ค์„ ๊ตฌํ˜„ํ•œ๋‹ค. glibc ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ eventfd2()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

glibc ์ถ”๊ฐ€ ๊ธฐ๋Šฅ

GNU C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ƒˆ๋กœ์šด ํƒ€์ž… ํ•˜๋‚˜์™€ ํ•จ์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ข€ ์ถ”์ƒํ™” ํ•ด ๋ณด๋ ค๋Š” ๊ฒƒ์ด๋‹ค.

typedef uint64_t eventfd_t;

int eventfd_read(int fd, eventfd_t *value);
int eventfd_write(int fd, eventfd_t value);

์ด ํ•จ์ˆ˜๋“ค์€ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ •ํ™•ํ•œ ์ˆ˜์˜ ๋ฐ”์ดํŠธ๋ฅผ ์ „์†กํ–ˆ์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์•„๋‹ˆ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ ์„œ ๋ถ„๊ธฐํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ๋ถ€๋ชจ๊ฐ€ ์ž ์‹œ ์ž ๋“œ๋Š” ๋™์•ˆ ์ž์‹์ด ํ”„๋กœ๊ทธ๋žจ ๋ช…๋ นํ–‰ ์ธ์ž๋กœ ๋ฐ›์€ ์ •์ˆ˜๋“ค ๊ฐ๊ฐ์„ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ์“ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž ์—์„œ ๊นฌ ๋ถ€๋ชจ๊ฐ€ eventfd ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ ์ฝ๊ธฐ๋ฅผ ํ•œ๋‹ค.

๋‹ค์Œ ์…ธ ์„ธ์…˜์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์˜ˆ๋ฅผ ๋ณด์—ฌ ์ค€๋‹ค.

$ ./a.out 1 2 4 7 14
Child writing 1 to efd
Child writing 2 to efd
Child writing 4 to efd
Child writing 7 to efd
Child writing 14 to efd
Child completed write loop
Parent about to read
Parent read 28 (0x1c) from efd

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#include <sys/eventfd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>             /* uint64_t ์ •์˜ */

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
    int efd, j;
    uint64_t u;
    ssize_t s;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s <num>...\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    efd = eventfd(0, 0);
    if (efd == -1)
        handle_error("eventfd");

    switch (fork()) {
    case 0:
        for (j = 1; j < argc; j++) {
            printf("Child writing %s to efd\n", argv[j]);
            u = strtoull(argv[j], NULL, 0);
                    /* strtoull()์— ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ˜ ๊ฐ€๋Šฅ */
            s = write(efd, &u, sizeof(uint64_t));
            if (s != sizeof(uint64_t))
                handle_error("write");
        }
        printf("Child completed write loop\n");

        exit(EXIT_SUCCESS);

    default:
        sleep(2);

        printf("Parent about to read\n");
        s = read(efd, &u, sizeof(uint64_t));
        if (s != sizeof(uint64_t))
            handle_error("read");
        printf("Parent read %llu (0x%llx) from efd\n",
                (unsigned long long) u, (unsigned long long) u);
        exit(EXIT_SUCCESS);

    case -1:
        handle_error("fork");
    }
}

SEE ALSO

futex(2), pipe(2), poll(2), read(2), select(2), signalfd(2), timerfd_create(2), write(2), epoll(7), sem_overview(7)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ