eventfd man
生活随笔
收集整理的這篇文章主要介紹了
eventfd man
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概要
? ??#include<sys/eventfd.h>
? ??int eventfd(unsigned int initval, intflags);
描述 eventfd()創建一個“eventfd對象”,這個對象能被用戶空間應用用作一個事件等待/響應機制,靠內核去響應用戶空間應用事件。這個對象包含一個由內核保持的無符號64位整型計數器。這個計數器由參數initval說明的值來初始化。 從linux2.6.27開始,下面的值可以在flags中被 OR 來改變eventfd()的行為: EFD_NONBLOCK?在新打開的文件描述符中設置O_NONBLOCK文件狀態標示。使用這個標示節省了對fcntl的額外調? ? ?? ? ?? 用。
EFD_CLOEXEC ?在新打開的文件描述符中設置close-on-exec(FD_CLOEXEC)標示。
在linux2.6.26版本以下,flags參數都是不能夠使用的,必須為0.
eventfd()返回一個新的與eventfd對象關聯的文件描述符。下面的操作能在這個文件描述符上執行: read 如果eventfd計數器為一個非0值,read返回包含這個值的8個字節,并且這個計數器的值被重置為0.(返回的值為主機字節序)。 如果read的時候計數器為0,調用要么阻塞直到計數器變為非0,要么失敗返回EAGAIN,如果文件描述符是非阻塞的話。 read會失敗返回EINVAL,如果提供的buffer大小小于8字節的話。
write write調用向計數器增加一個由它的buffer提供的8字節整型值。計數器能存儲的最大值是最大的無符號64位整型值少1(0xfffffffffffffffe)。如果增加導致計時器的值超過了最大值,write要么阻塞直到一個read在這個文件描述符上執行,要么返回EAGAIN,如果文件描述法是非阻塞的。 write會失敗返回EINVAL,如果提供的buffer大小小于8字節的話,或者如果試圖寫入值0xffffffffffffff。
poll,select(等) 返回的文件描述符支持poll和select,如下: 文件描述符是可讀的(seceltreadfds參數;)如果計數器值大于0. 文件描述符是可寫的,如果它可以被寫入一個至少為1的值而不會被阻塞。 如果計數器值被檢測到溢出了,select會指示這個文件描述符為可讀可寫。如上所提醒的,write決不能溢出計數器。 eventfd文件描述符也支持其他文件多路轉接API:pselcet,ppoll,epoll。
close 當文件描述符不再被需要的時候它要被關閉。當所有和同一個eventfd對象相聯系的文件描述符被關系時,對象的資源就被內核清空。
由eventfd()創建的文件描述符拷貝被子進程通過fork所繼承。文件描述符的副本是同同一個eventfd對象相聯系的。由eventfd()創建的文件描述符在execve時被保留。
返回值 成功時,eventfd()返回一個新的eventfd文件描述符。失敗時,返回-1,errno指出錯誤情況。
錯誤 EINVAL ?標示不合法;在linux2.6.26或更早版本中,flags非0。 EMFILE ? 到達進程最大打開文件描述符限制。 ENFILE ? 到達系統總共能打開的文件數。 ENODEV ? 不能掛載匿名節點設備。 ENOMEM ? 沒有創建一個新eventfd文件描述符的足夠內存。
版本 eventfd()自從2.6.22開始可用。glibc版本2.8開始提供支持。eventfd2()系統調用從linux2.6.27開始可用。自從2.9開始,glibceventfd()用evnetfd2()系統調用封裝,如果內核支持的話。
注意 應用可以使用一個eventfd文件描述符來取代一個管道,在所有管道用來作為事件通知的情況下。內核消耗在一個eventfd文件描述符上的遠比在一個管道上的少,并且僅需要一個文件描述符(管道需要2個)。 當使用在內核中時,一個eventfd文件描述符能提供一個內核-用戶空間的橋梁。 一個關于eventfd要指出的地方是它能像其他文件描述符一樣用select,poll。epoll來監控。這意味著一個應用能同時監控:傳統“文件的讀端,和其他支持eventfd接口的內核機制的讀端。
后面的不想翻譯了
描述 eventfd()創建一個“eventfd對象”,這個對象能被用戶空間應用用作一個事件等待/響應機制,靠內核去響應用戶空間應用事件。這個對象包含一個由內核保持的無符號64位整型計數器。這個計數器由參數initval說明的值來初始化。 從linux2.6.27開始,下面的值可以在flags中被 OR 來改變eventfd()的行為: EFD_NONBLOCK?在新打開的文件描述符中設置O_NONBLOCK文件狀態標示。使用這個標示節省了對fcntl的額外調? ? ?? ? ?? 用。
EFD_CLOEXEC ?在新打開的文件描述符中設置close-on-exec(FD_CLOEXEC)標示。
在linux2.6.26版本以下,flags參數都是不能夠使用的,必須為0.
eventfd()返回一個新的與eventfd對象關聯的文件描述符。下面的操作能在這個文件描述符上執行: read 如果eventfd計數器為一個非0值,read返回包含這個值的8個字節,并且這個計數器的值被重置為0.(返回的值為主機字節序)。 如果read的時候計數器為0,調用要么阻塞直到計數器變為非0,要么失敗返回EAGAIN,如果文件描述符是非阻塞的話。 read會失敗返回EINVAL,如果提供的buffer大小小于8字節的話。
write write調用向計數器增加一個由它的buffer提供的8字節整型值。計數器能存儲的最大值是最大的無符號64位整型值少1(0xfffffffffffffffe)。如果增加導致計時器的值超過了最大值,write要么阻塞直到一個read在這個文件描述符上執行,要么返回EAGAIN,如果文件描述法是非阻塞的。 write會失敗返回EINVAL,如果提供的buffer大小小于8字節的話,或者如果試圖寫入值0xffffffffffffff。
poll,select(等) 返回的文件描述符支持poll和select,如下: 文件描述符是可讀的(seceltreadfds參數;)如果計數器值大于0. 文件描述符是可寫的,如果它可以被寫入一個至少為1的值而不會被阻塞。 如果計數器值被檢測到溢出了,select會指示這個文件描述符為可讀可寫。如上所提醒的,write決不能溢出計數器。 eventfd文件描述符也支持其他文件多路轉接API:pselcet,ppoll,epoll。
close 當文件描述符不再被需要的時候它要被關閉。當所有和同一個eventfd對象相聯系的文件描述符被關系時,對象的資源就被內核清空。
由eventfd()創建的文件描述符拷貝被子進程通過fork所繼承。文件描述符的副本是同同一個eventfd對象相聯系的。由eventfd()創建的文件描述符在execve時被保留。
返回值 成功時,eventfd()返回一個新的eventfd文件描述符。失敗時,返回-1,errno指出錯誤情況。
錯誤 EINVAL ?標示不合法;在linux2.6.26或更早版本中,flags非0。 EMFILE ? 到達進程最大打開文件描述符限制。 ENFILE ? 到達系統總共能打開的文件數。 ENODEV ? 不能掛載匿名節點設備。 ENOMEM ? 沒有創建一個新eventfd文件描述符的足夠內存。
版本 eventfd()自從2.6.22開始可用。glibc版本2.8開始提供支持。eventfd2()系統調用從linux2.6.27開始可用。自從2.9開始,glibceventfd()用evnetfd2()系統調用封裝,如果內核支持的話。
注意 應用可以使用一個eventfd文件描述符來取代一個管道,在所有管道用來作為事件通知的情況下。內核消耗在一個eventfd文件描述符上的遠比在一個管道上的少,并且僅需要一個文件描述符(管道需要2個)。 當使用在內核中時,一個eventfd文件描述符能提供一個內核-用戶空間的橋梁。 一個關于eventfd要指出的地方是它能像其他文件描述符一樣用select,poll。epoll來監控。這意味著一個應用能同時監控:傳統“文件的讀端,和其他支持eventfd接口的內核機制的讀端。
后面的不想翻譯了
EXAMPLE
The following program creates an eventfd file descriptor and then forks tocreate a child process. While the parent briefly sleeps, the child writeseach of the integers supplied in the program's command-line arguments to theeventfd file descriptor. When the parent has finished sleeping, it reads fromthe eventfd file descriptor. The following shell session shows a sample run of the program: ?$ ./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 readParent read 28 (0x1c) from efdProgram source
#include <sys/eventfd.h>? #include <unistd.h>? #include <stdlib.h> #include <stdio.h>? #include <stdint.h>? ?? ?#define handle_error(msg) \? ?do { perror(msg); exit(EXIT_FAILURE); } while (0)? ?intmain(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);? ?? ?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");? ?} ?}總結
以上是生活随笔為你收集整理的eventfd man的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 16即将登场:又有一批老设备被淘
- 下一篇: A20 init.sun7i.rc 文件