eventfd

EVENTFD(2)      Ð ÑководÑÑво пÑогÑаммиÑÑа Linux      EVENTFD(2)



ÐÐЯ
       eventfd - ÑоздаÑÑ ÑайловÑй деÑкÑипÑÐ¾Ñ Ð´Ð»Ñ
       ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобÑÑиÑÑ

ÐÐÐÐÐ
       #include <sys/eventfd.h>

       int eventfd(unsigned int initval, int flags);

ÐÐÐСÐÐÐÐ
       ÐÑзов eventfd() ÑоздаÑÑ Â«Ð¾Ð±ÑÐµÐºÑ eventfd», коÑоÑÑй
       можно иÑполÑзоваÑÑ Ð² каÑеÑÑве меÑанизма
       ожиданиÑ/ÑÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобÑÑиÑÑ Ð²
       пÑиложениÑÑ Ð¿ÑоÑÑÑанÑÑва полÑзоваÑÐµÐ»Ñ Ð¸ ÑдÑа.
       ÐбÑÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ 64-биÑнÑй (uint64_t)
       ÑÑÑÑÑик, обÑлÑживаемÑй ÑдÑом. ÐÑÐ¾Ñ ÑÑÑÑÑик
       иниÑиализиÑÑеÑÑÑ Ð·Ð½Ð°Ñением, ÑказаннÑм в
       аÑгÑменÑе initval.

       ÐÐ»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ eventfd() можно
       иÑполÑзоваÑÑ ÑледÑÑÑие знаÑÐµÐ½Ð¸Ñ flags (ÑеÑез OR):

       EFD_CLOEXEC (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.27)
              УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñлаг close-on-exec (FD_CLOEXEC) длÑ
              нового оÑкÑÑÑого Ñайлового
              деÑкÑипÑоÑа. СмоÑÑиÑе опиÑание Ñлага
              O_CLOEXEC в open(2) Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ ÐºÐ°Ðº
              ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑигодиÑÑÑÑ.

       EFD_NONBLOCK (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.27)
              УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñлаг ÑоÑÑоÑÐ½Ð¸Ñ Ñайла
              O_NONBLOCK Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ оÑкÑÑÑого Ñайлового
              деÑкÑипÑоÑа. ÐÑполÑзование данного
              Ñлага заменÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе вÑзовÑ
              fcntl(2) Ð´Ð»Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ Ñого же ÑезÑлÑÑаÑа.

       EFD_SEMAPHORE (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.30)
              ÐÑедоÑÑавлÑÐµÑ ÑемаÑоÑо-подобнÑÑ
              ÑеманÑÐ¸ÐºÑ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸Ð· нового
              Ñайлового деÑкÑипÑоÑа. СмоÑÑиÑе ниже.

       Ðо веÑÑии Linux 2.6.26 аÑгÑÐ¼ÐµÐ½Ñ flags не
       иÑполÑзовалÑÑ, и должен бÑÑÑ Ñавен нÑлÑ.

       ÐÑи завеÑÑении ÑабоÑÑ eventfd() возвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй
       ÑайловÑй деÑкÑипÑоÑ, коÑоÑÑй можно
       иÑполÑзоваÑÑ Ð´Ð»Ñ ÑÑÑлки на обÑÐµÐºÑ eventfd. Ðад
       ÑÑим ÑайловÑм деÑкÑипÑоÑом можно вÑполнÑÑÑ
       ÑледÑÑÑие опеÑаÑии:

       read(2)
              ÐаждÑй вÑполнивÑийÑÑ Ð²Ñзов read(2)
              возвÑаÑÐ°ÐµÑ 8-байÑное Ñелое. ÐÑзов read(2)
              завеÑÑиÑÑÑ Ñ Ð¾Ñибкой EINVAL, еÑли ÑазмеÑ
              Ñказанного бÑÑеÑа бÑÐ´ÐµÑ Ð¼ÐµÐ½ÑÑе 8 байÑ.

              ÐозвÑаÑаемое read(2) знаÑение имееÑ
              поÑÑдок Ð±Ð°Ð¹Ñ Ñзла, Ñ. е., иÑполÑзÑемÑй
              поÑÑдок Ð±Ð°Ð¹Ñ Ð´Ð»Ñ ÑелÑÑ Ð½Ð° маÑине Ñзла.

              СеманÑика read(2) завиÑÐ¸Ñ Ð¾Ñ Ð·Ð½Ð°ÑениÑ
              ÑÑÑÑÑика eventfd â Ñавно оно нÑÐ»Ñ Ð¸Ð»Ð¸ неÑ, и
              бÑл ли Ñказан Ñлаг EFD_SEMAPHORE пÑи
              Ñоздании Ñайлового деÑкÑипÑоÑа eventfd:

              *  ÐÑли Ñлаг EFD_SEMAPHORE не Ñказан и ÑÑÑÑÑик
                 eventfd не Ñавен нÑлÑ, Ñо read(2) возвÑаÑаеÑ
                 8 Ð±Ð°Ð¹Ñ Ñ ÐµÐ³Ð¾ знаÑением и знаÑение
                 ÑÑÑÑÑика ÑбÑаÑÑваеÑÑÑ Ð² нолÑ.

              *  ÐÑли Ñлаг EFD_SEMAPHORE задан Ñказан и
                 ÑÑÑÑÑик eventfd не Ñавен нÑлÑ, Ñо read(2)
                 возвÑаÑÐ°ÐµÑ 8 байÑ, ÑодеÑжаÑие
                 знаÑение 1, и знаÑение ÑÑÑÑÑика
                 ÑменÑÑаеÑÑÑ Ð½Ð° 1.

              *  ÐÑли ÑÑÑÑÑик eventfd Ñавен нÑÐ»Ñ Ð²Ð¾ вÑемÑ
                 вÑзова read(2), Ñо вÑзов блокиÑÑеÑÑÑ Ð´Ð¾
                 ÑÐµÑ Ð¿Ð¾Ñ, пока ÑÑÑÑÑик ÑÑÐ°Ð½ÐµÑ Ð½Ðµ ÑавнÑм
                 нÑÐ»Ñ (вÑÐµÐ¼Ñ ÑабоÑÑ read(2) опиÑано вÑÑе)
                 или завеÑÑаеÑÑÑ Ñ Ð¾Ñибкой EAGAIN, еÑли
                 ÑайловÑй деÑкÑипÑÐ¾Ñ Ñоздан
                 неблокиÑÑемÑм.

       write(2)
              ÐÑи вÑзове write(2) из его бÑÑеÑа к ÑÑÑÑÑикÑ
              добавлÑеÑÑÑ 8-байÑовое Ñелое знаÑение.
              ÐакÑималÑное знаÑение, коÑоÑое можеÑ
              ÑÑаниÑÑÑÑ Ð² ÑÑÑÑÑике, Ñавно наиболÑÑемÑ
              64-биÑÐ½Ð¾Ð¼Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¼Ð¸Ð½ÑÑ
              1 (Ñ.е., 0xfffffffffffffffe). ÐÑли пÑи добавлении
              знаÑение ÑÑÑÑÑика пÑевÑÑÐ¸Ñ Ð¼Ð°ÐºÑимÑм, Ñо
              write(2) заблокиÑÑеÑÑÑ Ð´Ð¾ ÑÐµÑ Ð¿Ð¾Ñ, пока длÑ
              Ñайлового деÑкÑипÑоÑа не бÑдеÑ
              вÑполнен вÑзов read(2), или завеÑÑиÑÑÑ Ñ
              оÑибкой EAGAIN, еÑли ÑайловÑй деÑкÑипÑоÑ
              Ñоздан неблокиÑÑемÑм.

              ÐÑзов write(2) завеÑÑиÑÑÑ Ñ Ð¾Ñибкой EINVAL,
              еÑли ÑÐ°Ð·Ð¼ÐµÑ Ñказанного бÑÑеÑа менÑÑе 8
              байÑ, или еÑли попÑÑаÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ
              знаÑение 0xffffffffffffffff.

       poll(2), select(2) (и подобнÑе)
              ÐозвÑаÑÑннÑй ÑайловÑй деÑкÑипÑоÑ
              поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ poll(2) (и, аналогиÑно,
              epoll(7)) и select(2) ÑледÑÑÑим обÑазом:

              *  ФайловÑй деÑкÑипÑÐ¾Ñ Ð´Ð¾ÑÑÑпен длÑ
                 ÑÑÐµÐ½Ð¸Ñ (в select(2) аÑгÑÐ¼ÐµÐ½Ñ readfds; в poll(2)
                 Ñлаг POLLIN), еÑли ÑÑÑÑÑик болÑÑе 0.

              *  ФайловÑй деÑкÑипÑÐ¾Ñ Ð´Ð¾ÑÑÑпен длÑ
                 запиÑи (в select(2) аÑгÑÐ¼ÐµÐ½Ñ writefds; в poll(2)
                 Ñлаг POLLOUT), еÑли можно запиÑаÑÑ
                 знаÑение Ñавное, как минимÑм, "1" без
                 блокиÑовки.

              *  ÐÑли обнаÑÑжено пеÑеполнение
                 ÑÑÑÑÑика, Ñо select(2) ÑказÑÐ²Ð°ÐµÑ Ð½Ð°
                 ÑайловÑй деÑкÑипÑоÑ, доÑÑÑпнÑй на
                 ÑÑение и запиÑÑ, и poll(2) возвÑаÑаеÑ
                 ÑобÑÑие POLLERR. Ðак ÑпоминалоÑÑ Ñанее,
                 write(2) никогда не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ
                 пеÑеполнение ÑÑÑÑÑика. Ðднако
                 пеÑеполнение Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи, еÑли
                 подÑиÑÑемой KAIO вÑполниÑÑÑ (возможно
                 ÑеоÑеÑиÑеÑки) 2^64 "пеÑÐµÐ´Ð°Ñ Ñигналов"
                 eventfd. ÐÑли пеÑеполнение пÑоизоÑло, Ñо
                 read(2) веÑнÑÑ Ð¼Ð°ÐºÑималÑное знаÑение
                 Ñипа uint64_t (Ñ.е., 0xffffffffffffffff).

              ФайловÑй деÑкÑипÑÐ¾Ñ eventfd Ñакже
              поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´ÑÑгие мÑлÑÑиплекÑнÑе
              пÑогÑаммнÑе инÑеÑÑейÑÑ: pselect(2) и ppoll(2).

       close(2)
              ÐÑли ÑайловÑй деÑкÑипÑÐ¾Ñ Ð±Ð¾Ð»ÑÑе не
              ÑÑебÑеÑÑÑ, его нÑжно закÑÑÑÑ. Ðогда вÑе
              ÑайловÑе деÑкÑипÑоÑÑ, ÑвÑзаннÑе Ñ Ð¾Ð´Ð½Ð¸Ð¼
              обÑекÑом eventfd, бÑдÑÑ Ð·Ð°ÐºÑÑÑÑ, ÑдÑо
              оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÑеÑÑÑÑÑ Ð¾Ð±ÑекÑа.

       ÐÐ¾Ð¿Ð¸Ñ Ñайлового деÑкÑипÑоÑа, Ñозданного
       eventfd(), наÑледÑеÑÑÑ Ð¿Ð¾Ñомком, ÑозданнÑм Ñ
       помоÑÑÑ fork(2). ÐÐ¾Ð¿Ð¸Ñ Ñайлового деÑкÑипÑоÑа
       ÑвÑзÑваеÑÑÑ Ñ Ñем же обÑекÑом eventfd. ФайловÑе
       деÑкÑипÑоÑÑ, ÑозданнÑе eventfd(), ÑоÑÑанÑÑÑÑÑ Ð¿Ñи
       вÑзове execve(2), еÑли не Ñказан Ñлаг close-on-exec.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении eventfd() возвÑаÑаеÑ
       новÑй ÑайловÑй деÑкÑипÑÐ¾Ñ eventfd. ÐÑи оÑибке
       возвÑаÑаеÑÑÑ -1, и errno ÑÑÑанавливаеÑÑÑ Ð²
       ÑооÑвеÑÑÑвÑÑÑее знаÑение.

ÐШÐÐÐÐ
       EINVAL Ð flags Ñказано неподдеÑживаемое
              знаÑение.

       EMFILE ÐÑло доÑÑигнÑÑо огÑаниÑение по
              колиÑеÑÑÐ²Ñ Ð¾ÑкÑÑÑÑÑ ÑайловÑÑ Ð´ÐµÑкÑипÑоÑов
              на пÑоÑеÑÑ.

       ENFILE ÐоÑÑигнÑÑо макÑималÑное колиÑеÑÑво
              оÑкÑÑÑÑÑ Ñайлов в ÑиÑÑеме.

       ENODEV Ðе ÑдалоÑÑ ÑмонÑиÑоваÑÑ (внÑÑÑеннее)
              безÑмÑнное ÑÑÑÑойÑÑво inode.

       ENOMEM ÐедоÑÑаÑоÑно памÑÑи Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾
              Ñайлового деÑкÑипÑоÑа eventfd.

ÐÐРСÐÐ
       ÐÑзов eventfd() доÑÑÑпен в Linux наÑÐ¸Ð½Ð°Ñ Ñ ÑдÑа 2.6.22.
       ÐоддеÑжка в glibc поÑвилаÑÑ Ð² веÑÑии 2.8.
       СиÑÑемнÑй вÑзов eventfd2() (Ñм. ÐÐÐÐЧÐÐÐЯ) доÑÑÑпен
       в Linux наÑÐ¸Ð½Ð°Ñ Ñ ÑдÑа 2.6.27. Ð glibc веÑÑии 2.9 в
       обÑÑÑке eventfd() иÑполÑзÑеÑÑÑ ÑиÑÑемнÑй вÑзов
       eventfd2(), еÑли он поддеÑживаеÑÑÑ ÑдÑом.

ÐТРÐÐУТЫ
       ÐпиÑание ÑеÑминов данного Ñаздела ÑмоÑÑиÑе
       в attributes(7).

       ┌──────────────┬────────────────────────────────┬────────────────┐
       │ÐнÑеÑÑÐµÐ¹Ñ ÐÑÑибÑÑ                      ÐнаÑение │
       ├──────────────┼────────────────────────────────┼────────────────┤
       │eventfd()     │ ÐезвÑедноÑÑÑ Ð² ниÑÑÑ │ MT-Safe        │
       └──────────────┴────────────────────────────────┴────────────────┘

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       ÐÑÐ·Ð¾Ð²Ñ eventfd() и eventfd2() еÑÑÑ ÑолÑко в Linux.

ÐÐÐÐЧÐÐÐЯ
       ÐÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑ ÑайловÑй
       деÑкÑипÑÐ¾Ñ eventfd вмеÑÑо канала (Ñм. pipe(2)) во
       вÑÐµÑ ÑлÑÑаÑÑ, когда канал иÑполÑзÑеÑÑÑ ÑолÑко
       Ð´Ð»Ñ ÑигнализаÑии о ÑобÑÑиÑÑ. ÐздеÑжки ÑдÑа по
       ÑÐ°Ð¹Ð»Ð¾Ð²Ð¾Ð¼Ñ Ð´ÐµÑкÑипÑоÑÑ eventfd намного менÑÑе,
       Ñем по ÐºÐ°Ð½Ð°Ð»Ñ Ð¸ ÑÑебÑеÑÑÑ ÑолÑко один
       ÑайловÑй деÑкÑипÑÐ¾Ñ (пÑоÑив двÑÑ, пÑи
       иÑполÑзовании канала).

       ÐÑи иÑполÑзовании в ÑдÑе ÑайловÑй деÑкÑипÑоÑ
       eventfd Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ Ð¼Ð¾ÑÑ Ð¸Ð· ÑдеÑного в
       полÑзоваÑелÑÑкое пÑоÑÑÑанÑÑво, позволÑÑ
       напÑÐ¸Ð¼ÐµÑ ÑабоÑаÑÑ, подобно KAIO ( ÑдеÑнÑй AIO),
       ÑигнализиÑÑÑ, ÑÑо завеÑÑена какаÑ-Ñо опеÑаÑиÑ
       над ÑайловÑм деÑкÑипÑоÑом.

       ÐажнÑм моменÑом Ñайлового деÑкÑипÑоÑа eventfd
       ÑвлÑеÑÑÑ Ñо, ÑÑо за ним можно ÑледиÑÑ ÐºÐ°Ðº за
       обÑÑнÑм ÑайловÑм деÑкÑипÑоÑом Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
       select(2), poll(2) или epoll(7). ÐÑо ознаÑаеÑ, ÑÑо
       пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно
       оÑÑлеживаÑÑ Ð³Ð¾ÑовноÑÑÑ "обÑÑнÑÑ" Ñайлов и
       гоÑовноÑÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð¼ÐµÑанизмов ÑдÑа, коÑоÑÑе
       поддеÑживаÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ eventfd. (Ðез инÑеÑÑейÑа
       eventfd() ÑÑи меÑÐ°Ð½Ð¸Ð·Ð¼Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾
       мÑлÑÑиплекÑиÑоваÑÑ ÑеÑез select(2), poll(2) или
       epoll(7).)

       ТекÑÑее знаÑение ÑÑÑÑÑика eventfd можно найÑи
       в запиÑи Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑего Ñайлового
       деÑкÑипÑоÑа в каÑалоге пÑоÑеÑÑа /proc/[pid]/fdinfo.
       ÐодÑобноÑÑи ÑмоÑÑиÑе в proc(5).

   ÐÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой C и ÑдÑом
       ÐÑÐ½Ð¾Ð²Ñ ÑоÑÑавлÑÑÑ Ð´Ð²Ð° ÑиÑÑемнÑÑ Ð²Ñзова Linux:
       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 в пÑоÑивном ÑлÑÑае.

ÐÐ ÐÐÐÐ
       СледÑÑÑÐ°Ñ Ð¿ÑогÑамма ÑоздаÑÑ ÑайловÑй
       деÑкÑипÑÐ¾Ñ 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, "ÐÑполÑзование: %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");
           }
       }

СÐÐТРÐТРТÐÐÐÐ
       futex(2), pipe(2), poll(2), read(2), select(2), signalfd(2),
       timerfd_create(2), write(2), epoll(7), sem_overview(7)



Linux                             2016-03-15                        EVENTFD(2)