Man page - epoll(7)
Packages contains this manual
- shm_overview(7)
- nss(5)
- proc_mtrr(5)
- intro(7)
- tcp(7)
- iso_8859-9(7)
- armscii-8(7)
- proc_kpagecount(5)
- initrd(4)
- mouse(4)
- proc_stat(5)
- x25(7)
- proc_interrupts(5)
- fifo(7)
- repertoiremap(5)
- icmp(7)
- futex(7)
- feature_test_macros(7)
- lp(4)
- bpf-helpers(7)
- epoll(7)
- proc_sys_dev(5)
- namespaces(7)
- proc_sysrq-trigger(5)
- proc_bus(5)
- cp1251(7)
- proc_pid_maps(5)
- proc_sys_vm(5)
- proc_pid_projid_map(5)
- st(4)
- proc_pid(5)
- issue(5)
- pid_namespaces(7)
- unicode(7)
- inode(7)
- hosts.equiv(5)
- iso-8859-13(7)
- proc_fb(5)
- proc_modules(5)
- proc_pid_autogroup(5)
- keyrings(7)
- sysvipc(7)
- proc_kmsg(5)
- cgroups(7)
- latin6(7)
- proc_pid_uid_map(5)
- unix(7)
- proc_pid_io(5)
- pts(4)
- packet(7)
- ld-linux.so(8)
- tzselect(8)
- iconv(1)
- proc_pid_syscall(5)
- proc_pid_net(5)
- proc_pid_pagemap(5)
- tty(4)
- proc_profile(5)
- standards(7)
- proc_pid_mounts(5)
- filesystems(5)
- iso-8859-15(7)
- locale(5)
- iso_8859_3(7)
- xattr(7)
- iso-8859-2(7)
- proc_uptime(5)
- persistent-keyring(7)
- credentials(7)
- proc_pid_timers(5)
- utmpx(5)
- vcsa(4)
- proc_pid_exe(5)
- proc_net(5)
- proc_timer_stats(5)
- ip(7)
- proc_pid_fd(5)
- ptmx(4)
- user_namespaces(7)
- resolv.conf(5)
- url(7)
- iso_8859_5(7)
- iso_8859-8(7)
- urn(7)
- process-keyring(7)
- proc_pid_auxv(5)
- proc_ksyms(5)
- proc_ide(5)
- veth(4)
- ldd(1)
- proc_swaps(5)
- landlock(7)
- proc_vmstat(5)
- system_data_types(7)
- cp1252(7)
- lirc(4)
- proc_kpageflags(5)
- random(7)
- precedence(7)
- cpuset(7)
- proc_pid_ns(5)
- acct(5)
- latin4(7)
- proc_pid_cgroup(5)
- proc_cpuinfo(5)
- iso_8859-2(7)
- proc_keys(5)
- charsets(7)
- pldd(1)
- proc_pid_stat(5)
- rtnetlink(7)
- netlink(7)
- ram(4)
- mem(4)
- iso-8859-6(7)
- proc_key-users(5)
- iso_8859_15(7)
- fanotify(7)
- proc_sys_net(5)
- sysfs(5)
- math_error(7)
- latin1(7)
- proc_pid_root(5)
- nptl(7)
- proc_cgroups(5)
- proc_iomem(5)
- proc_pid_statm(5)
- sem_overview(7)
- hier(7)
- full(4)
- proc_pid_status(5)
- proc_pid_cwd(5)
- proc_pid_cpuset(5)
- proc_scsi(5)
- uri(7)
- proc_diskstats(5)
- iso_8859_6(7)
- latin2(7)
- latin5(7)
- man-pages(7)
- ld.so(8)
- uts_namespaces(7)
- proc_pid_mountstats(5)
- intro(3)
- proc_pid_seccomp(5)
- proc_pid_wchan(5)
- attributes(7)
- symlink(7)
- mount_namespaces(7)
- charmap(5)
- tis-620(7)
- iso-8859-10(7)
- getent(1)
- proc_buddyinfo(5)
- ttytype(5)
- rtc(4)
- proc_malloc(5)
- suffixes(7)
- sln(8)
- signal(7)
- proc_sys_abi(5)
- signal-safety(7)
- time_namespaces(7)
- proc_pid_comm(5)
- raw(7)
- gai.conf(5)
- proc_crypto(5)
- locale(1)
- iso-8859-3(7)
- motd(5)
- proc_meminfo(5)
- iso-8859-8(7)
- protocols(5)
- proc_pid_map_files(5)
- pthreads(7)
- null(4)
- proc(5)
- zdump(8)
- socket(7)
- proc_sys_kernel(5)
- ddp(7)
- memusagestat(1)
- hd(4)
- iso-8859-14(7)
- shells(5)
- pipe(7)
- glob(7)
- proc_self(5)
- network_namespaces(7)
- utmp(5)
- proc_kcore(5)
- nsswitch.conf(5)
- sd(4)
- iso-8859-5(7)
- iso_8859_16(7)
- man(7)
- iso_8859-6(7)
- dir_colors(5)
- mq_overview(7)
- vsock(7)
- ascii(7)
- thread-keyring(7)
- fs(5)
- proc_pid_attr(5)
- proc_sys_debug(5)
- proc_sys(5)
- proc_pid_cmdline(5)
- pty(7)
- services(5)
- cgroup_namespaces(7)
- securetty(5)
- netdevice(7)
- iso_8859_13(7)
- host.conf(5)
- proc_pid_setgroups(5)
- proc_slabinfo(5)
- sock_diag(7)
- iso_8859-14(7)
- iso-8859-11(7)
- iso_8859_11(7)
- operator(7)
- regex(7)
- wavelan(4)
- proc_sys_fs(5)
- nologin(5)
- proc_pci(5)
- koi8-r(7)
- erofs(5)
- intro(2)
- utf8(7)
- proc_kallsyms(5)
- proc_sysvipc(5)
- queue(7)
- proc_sys_sunrpc(5)
- intro(5)
- latin8(7)
- mtrace(1)
- ipc_namespaces(7)
- dsp56k(4)
- iso_8859_4(7)
- proc_pid_smaps(5)
- proc_cmdline(5)
- rpc(5)
- proc_tty(5)
- proc_version(5)
- smartpqi(4)
- proc_pid_timerslack_ns(5)
- aio(7)
- session-keyring(7)
- resolver(5)
- slabinfo(5)
- wtmp(5)
- iso_8859_9(7)
- proc_locks(5)
- mailaddr(7)
- proc_pid_oom_score(5)
- kmem(4)
- iconvconfig(8)
- iso_8859-7(7)
- glibc(7)
- hostname(7)
- proc_thread-self(5)
- ipv6(7)
- iso_8859_7(7)
- proc_kpagecgroup(5)
- core(5)
- time(7)
- units(7)
- proc_dma(5)
- loop(4)
- address_families(7)
- zero(4)
- intro(4)
- procfs(5)
- iso_8859-4(7)
- vdso(7)
- tmpfs(5)
- iso-8859-16(7)
- iso_8859_10(7)
- user-session-keyring(7)
- libc(7)
- proc_fs(5)
- koi8-u(7)
- latin3(7)
- proc_tid_children(5)
- proc_pid_limits(5)
- proc_pid_coredump_filter(5)
- iso_8859-15(7)
- arp(7)
- urandom(4)
- iso_8859-10(7)
- hpsa(4)
- proc_pid_environ(5)
- boot(7)
- ftm(7)
- ld-linux(8)
- proc_driver(5)
- loop-control(4)
- iso_8859-16(7)
- proc_filesystems(5)
- tzfile(5)
- sprof(1)
- proc_pid_task(5)
- proc_pid_oom_score_adj(5)
- proc_mounts(5)
- iso-8859-4(7)
- iso_8859-1(7)
- utf-8(7)
- iso_8859-13(7)
- intro(6)
- proc_timer_list(5)
- rtld-audit(7)
- iso_8859-3(7)
- group(5)
- sched(7)
- proc_pid_clear_refs(5)
- hosts(5)
- iso_8859-11(7)
- numa(7)
- iso_8859_2(7)
- locale(7)
- iso-8859-1(7)
- fuse(4)
- proc_tid(5)
- proc_execdomains(5)
- proc_pid_mountinfo(5)
- intro(8)
- iso_8859_8(7)
- proc_loadavg(5)
- proc_pid_oom_adj(5)
- re_format(7)
- iso_8859_14(7)
- zic(8)
- bootparam(7)
- inotify(7)
- posixoptions(7)
- proc_partitions(5)
- iso-8859-9(7)
- proc_pid_mem(5)
- networks(5)
- proc_sys_user(5)
- udp(7)
- proc_zoneinfo(5)
- latin10(7)
- proc_pid_fdinfo(5)
- proc_pid_stack(5)
- memusage(1)
- spufs(7)
- pkeys(7)
- path_resolution(7)
- proc_ioports(5)
- intro(1)
- ldconfig(8)
- msr(4)
- svipc(7)
- port(4)
- proc_pid_personality(5)
- cciss(4)
- latin9(7)
- capabilities(7)
- localedef(1)
- vcs(4)
- iso_8859-5(7)
- elf(5)
- proc_sys_proc(5)
- console_codes(4)
- random(4)
- iso-8859-7(7)
- termcap(5)
- cpuid(4)
- environ(7)
- string_copying(7)
- proc_pid_gid_map(5)
- queue(3)
- termio(7)
- user-keyring(7)
- complex(7)
- latin7(7)
- proc_config.gz(5)
- udplite(7)
- kernel_lockdown(7)
- proc_devices(5)
- proc_apm(5)
- iso_8859_1(7)
- proc_pid_numa_maps(5)
apt-get install manpages
Available languages:
en fr ja ru zh_TW zh_CNManual
epoll
NOMSYNOPSIS
DESCRIPTION
DĂ©tection par changement de niveau ou dâĂ©tat
Interaction avec autosleep
/proc interfaces
Exemple dâutilisation
Questions/Réponses
Erreurs possibles et moyens de les éviter
VERSIONS
STANDARDS
HISTORIQUE
NOTES
VOIR AUSSI
TRADUCTION
NOM
epoll â Notifications dâĂ©vĂ©nements dâentrĂ©es et sorties
SYNOPSIS
#include <sys/epoll.h>
DESCRIPTION
Lâinterface de programmation (API) epoll rĂ©alise une tĂąche similaire Ă poll (2) : surveiller plusieurs descripteurs de fichier pour voir si des E/S y sont possibles. LâAPI epoll peut ĂȘtre dĂ©clenchĂ©e par changement de niveau ou par changement dâĂ©tat et sâadapte bien Ă un grand nombre de descripteurs surveillĂ©s.
Le concept central de lâAPI epoll est lâ instance dâ epoll , une structure interne au noyau qui, du point de vue espace utilisateur, peut ĂȘtre considĂ©rĂ©e comme un conteneur pour deux listes :
|
- |
La liste interest (parfois appelĂ©e lâensemble epoll ) : lâensemble des descripteurs de fichier que le processus a enregistrĂ©s comme intĂ©ressants Ă surveiller. |
||
|
- |
La liste ready : lâensemble des descripteurs de fichier prĂȘts (ready) pour des E/S. Cette liste est un sous-ensemble de (plus prĂ©cisĂ©ment, un ensemble de rĂ©fĂ©rences de) descripteurs de fichier de la liste interest . La liste ready est alimentĂ©e dynamiquement par le noyau selon le rĂ©sultat des activitĂ©s dâE/S de ces descripteurs de fichier. |
Les appels systĂšme suivants sont fournis pour crĂ©er et gĂ©rer une instance dâ epoll :
|
- |
epoll_create (2) crĂ©e une instance dâ epoll et renvoie un descripteur de fichier rĂ©fĂ©rençant cette instance. La version plus rĂ©cente dâ epoll_create1 (2) Ă©tend les fonctionnalitĂ©s dâ epoll_create (2). |
||
|
- |
LâintĂ©rĂȘt pour des descripteurs de fichier particuliers est ensuite enregistrĂ© avec epoll_ctl (2), qui ajoute les articles dans la liste interest de lâinstance dâ epoll . |
||
|
- |
epoll_wait (2) attend les Ă©vĂ©nements dâE/S, en bloquant le thread appelant si aucun Ă©vĂ©nement nâest actuellement disponible. Cet appel systĂšme peut ĂȘtre considĂ©rĂ© comme recherchant des articles dans la liste ready de lâinstance dâ epoll . |
DĂ©tection par changement de niveau ou dâĂ©tat
Lâinterface de distribution dâĂ©vĂ©nements dâ epoll est capable de se comporter en dĂ©tection de changement de niveau (Level Triggered â LT) ou dâĂ©tat (Edge Triggered â ET). La diffĂ©rence entre ces deux mĂ©canismes est dĂ©crite ci-dessous. Supposons que le scĂ©nario suivant se produise :
|
(1) |
Le descripteur de fichier qui reprĂ©sente le cĂŽtĂ© lecture dâun tube ( rfd ) est enregistrĂ© dans lâinstance dâ epoll . |
||
|
(2) |
Une écriture dans le tube envoie 2 Ko de données du cÎté écriture du tube. |
||
|
(3) |
Un appel Ă epoll_wait (2) est effectuĂ© et renvoie rfd comme descripteur de fichier prĂȘt. |
||
|
(4) |
Un lecteur du tube lit 1 Ko de données depuis rfd . |
||
|
(5) |
Un appel dâ epoll_wait (2) est effectuĂ©. |
Si le descripteur rfd a Ă©tĂ© ajoutĂ© Ă lâensemble epoll en utilisant lâattribut EPOLLET (dĂ©tection de changement dâĂ©tat), lâappel epoll_wait (2), rĂ©alisĂ© Ă lâĂ©tape 5 , va probablement bloquer bien quâil y ait des donnĂ©es toujours prĂ©sentes dans le tampon dâentrĂ©e du fichier tandis que le pair distant attendra une rĂ©ponse basĂ©e sur les donnĂ©es quâil a dĂ©jĂ envoyĂ©es. La raison en est que le mĂ©canisme de distribution dâĂ©vĂ©nements dĂ©tectĂ©s par changement dâĂ©tat dĂ©livre les Ă©vĂ©nements seulement lorsque des Ă©vĂ©nements surviennent dans le descripteur de fichier supervisĂ©. Ainsi, Ă lâĂ©tape 5 , lâappelant peut attendre des donnĂ©es qui sont dĂ©jĂ prĂ©sentes dans le tampon dâentrĂ©e. Dans lâexemple ci-dessus, un Ă©vĂ©nement sur rfd sera dĂ©clenchĂ© Ă cause de lâĂ©criture Ă lâĂ©tape 2 et lâĂ©vĂ©nement est consommĂ© dans lâĂ©tape 3 . Comme lâopĂ©ration de lecture de lâĂ©tape 4 ne consomme pas toutes les donnĂ©es du tampon, lâappel Ă epoll_wait (2) effectuĂ© Ă lâĂ©tape 5 peut verrouiller indĂ©finiment.
Une application qui emploie lâattribut EPOLLET de la fonction epoll devrait toujours utiliser des descripteurs non bloquants pour Ă©viter quâune lecture ou une Ă©criture affame une tĂąche qui gĂšre plusieurs descripteurs de fichier. Lâutilisation prĂ©conisĂ©e dâ epoll comme interface en dĂ©tection par changement dâĂ©tat ( EPOLLET ) est la suivante :
|
(1) |
avec des descripteurs non bloquants ; |
||
|
(2) |
en attente dâĂ©vĂšnement seulement aprĂšs quâun read (2) ou un write (2) ait renvoyĂ© EAGAIN . |
En revanche, lorsquâil est utilisĂ© avec lâinterface en dĂ©tection par changement de niveau (par dĂ©faut si EPOLLET nâest pas spĂ©cifiĂ©), epoll est une alternative plus rapide Ă poll (2) et peut ĂȘtre employĂ© Ă chaque fois que ce dernier est utilisĂ©, car il utilise la mĂȘme sĂ©mantique.
Puisque mĂȘme dans un epoll de type dĂ©tection le changement dâĂ©tat, plusieurs Ă©vĂ©nements peuvent ĂȘtre gĂ©nĂ©rĂ©s Ă la rĂ©ception de nombreux blocs de donnĂ©es, lâappelant peut, en spĂ©cifiant lâattribut EPOLLONESHOT , faire dĂ©sactiver par epoll le descripteur de fichier associĂ© aprĂšs la rĂ©ception dâun Ă©vĂ©nement avec epoll_wait (2). Lorsque lâattribut EPOLLONESHOT est spĂ©cifiĂ©, il est de la responsabilitĂ© de lâappelant de rĂ©armer le descripteur en utilisant epoll_ctl (2) avec EPOLL_CTL_MOD .
Si plusieurs threads (ou processus si les processus enfant ont hĂ©ritĂ© du descripteur de fichier dâ epoll Ă travers fork (2)) sont bloquĂ©s dans epoll_wait (2) en attente du mĂȘme descripteur de fichier dâ epoll et quâun descripteur de fichier dans la liste interest , qui est marquĂ© pour une notification par dĂ©tection de changement dâĂ©tat ( EPOLLET ), devienne prĂȘt, seul un des threads (ou processus) est rĂ©veillĂ© de epoll_wait (2). Cela fournit une optimisation utile pour Ă©viter la bousculade de rĂ©veils (thundering herd) dans certain scĂ©narios.
Interaction avec autosleep
Si le systĂšme est en mode autosleep Ă lâaide de /sys/power/autosleep et quâun Ă©vĂ©nement survient et sort le pĂ©riphĂ©rique de sa veille, le pilote de pĂ©riphĂ©rique ne gardera le pĂ©riphĂ©rique actif que jusquâĂ la mise en file dâattente de lâĂ©vĂ©nement. Pour garder le pĂ©riphĂ©rique actif jusquâau traitement de lâĂ©vĂ©nement, lâattribut EPOLLWAKEUP dâ epoll_ctl (2) doit ĂȘtre utilisĂ©.
Quand lâattribut EPOLLWAKEUP est dĂ©fini dans le champ events pour une struct epoll_event , le systĂšme sera gardĂ© actif Ă partir du moment oĂč lâĂ©vĂ©nement est mis en file dâattente, Ă lâaide de lâappel epoll_wait (2) qui renvoie lâĂ©vĂ©nement jusquâĂ lâappel epoll_wait (2) suivant. Si lâĂ©vĂ©nement doit garder le systĂšme actif au delĂ de ce moment, alors un wake_lock sĂ©parĂ© devrait ĂȘtre pris avant le second appel Ă epoll_wait (2).
/proc interfaces
Les interfaces
suivantes peuvent ĂȘtre utilisĂ©es pour limiter
la quantité de mémoire du noyau
utilisée par
epoll
:
/proc/sys/fs/epoll/max_user_watches
(depuis
Linux 2.6.28)
Cela dĂ©finit une limite au nombre total de descripteurs de fichiers quâun utilisateur peut enregistrer au travers de toutes les instances dâ epoll du systĂšme. La limite est imposĂ©e par identifiant dâutilisateur rĂ©el. Chaque descripteur de fichier enregistrĂ© coĂ»te environ 90 octets sur un noyau 32 bits et environ 160 octets sur un noyau 64 bits. Actuellement la valeur par dĂ©faut pour max_user_watches est de 1/25 (4%) de la mĂ©moire basse disponible, divisĂ© par le coĂ»t dâallocation en octets.
Exemple dâutilisation
Tandis que lâutilisation dâ epoll avec un dĂ©clenchement par changement de niveau correspond Ă la mĂȘme sĂ©mantique que poll (2), le dĂ©clenchement par changement dâĂ©tat nĂ©cessite plus de clarification pour Ă©viter des dĂ©crochages dans la boucle dâĂ©vĂšnements de lâapplication. Dans cet exemple, lâĂ©couteur emploie un socket non bloquant sur lequel listen (2) a Ă©tĂ© appelĂ©. La fonction do_use_fd() va utiliser le nouveau descripteur de fichier jusquâĂ ce quâ EAGAIN soit renvoyĂ© par read (2) ou par write (2). Une application dâautomate fini pilotĂ© par les Ă©vĂšnements devrait, aprĂšs rĂ©ception dâ EAGAIN , enregistrer lâĂ©tat en cours, afin que lors de lâappel suivant Ă do_use_fd() , elle continue avec le read (2) ou le write (2) lĂ oĂč elle sâest arrĂȘtĂ©e.
#define
MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;
/* Code pour rĂ©gler le socket Ă
lâĂ©coute, 'listen_sock',
(socket(), bind(), listen()) omis. */
epollfd = epoll_create1(0);
if (epollfd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev)
== -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &addr, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl : conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].data.fd);
}
}
}
Lorsquâon utilise une dĂ©tection de changement dâĂ©tats, pour des raisons de performances, il est possible dâajouter le descripteur de fichier dans lâinterface dâ epoll ( EPOLL_CTL_ADD ) aprĂšs, en spĂ©cifiant ( EPOLLIN | EPOLLOUT ). Cela Ă©vite de basculer sans cesse entre EPOLLIN et EPOLLOUT lors des appels epoll_ctl (2) avec EPOLL_CTL_MOD .
Questions/Réponses
|
- |
Quelle est la clé utilisée pour distinguer les descripteurs de fichier enregistrés dans une liste interest ? |
La clĂ© est une combinaison du numĂ©ro du descripteur de fichier et de la description du fichier ouvert (aussi connue comme « open file handle », la reprĂ©sentation interne au noyau dâun fichier ouvert).
|
- |
Que se passe-t-il si on enregistre deux fois le mĂȘme descripteur de fichier dans une instance dâ epoll ? |
Vous aurez probablement un EEXIST . Cependant il est possible dâajouter un duplicata de descripteur ( dup (2), dup2 (2), F_DUPFD de fcntl (2)) sur la mĂȘme instance dâ epoll . Cela peut ĂȘtre une technique utile pour le filtrage dâĂ©vĂ©nements, si les descripteurs dupliquĂ©s sont enregistrĂ©s avec des masques events diffĂ©rents.
|
- |
Deux instances dâ epoll peuvent-elles attendre le mĂȘme descripteur de fichier ? Si oui, les Ă©vĂ©nements seront-ils reportĂ©s sur les deux descripteurs de fichier dâ epoll ? |
Oui, et les événements seront rapportés aux deux. Toutefois, une programmation soignée est nécessaire pour que cela soit fait correctement.
|
- |
Est-ce que le descripteur dâ epoll lui-mĂȘme est sujet Ă poll/epoll/select ? |
Oui. Si un descripteur de fichier dâ epoll a des Ă©vĂ©nements en attente, alors il indiquera quâil est lisible.
|
- |
Que se passe-t-il si on cherche Ă placer un descripteur dâ epoll dans son propre ensemble de descripteurs de fichier  ? |
Lâappel epoll_ctl (2) Ă©chouera ( EINVAL ). Toutefois vous pouvez ajouter un descripteur dâ epoll dans un autre ensemble de descripteurs de fichier dâ epoll .
|
- |
Puis-je envoyer le descripteur dâ epoll Ă travers un socket UNIX vers un autre processus ? |
Oui, mais il nây a aucune raison de faire ça, puisque le processus rĂ©cepteur nâaura pas de copie des descripteurs de fichier de la liste interest .
|
- |
Est-ce que la fermeture dâun descripteur le supprime automatiquement de toutes les listes interest dâ epoll ? |
Oui, mais prenez note des points suivants. Un descripteur de fichier est une rĂ©fĂ©rence vers la description dâun fichier ouvert (consultez open (2)). Ă chaque fois quâun descripteur est dupliquĂ© avec dup (2), dup2 (2), F_DUPFD de fcntl (2) ou fork (2), un nouveau descripteur de fichier qui se rĂ©fĂšre au mĂȘme fichier ouvert est créé. Une description de fichier ouvert continue dâexister jusquâĂ ce que tous les descripteurs de fichier qui sây rĂ©fĂšrent soient fermĂ©s.
Un descripteur de fichier nâest retirĂ© dâune liste interest quâaprĂšs la fermeture de tous les descripteurs de fichier qui se rĂ©fĂšrent Ă la description de fichier ouvert sous-jacente. Cela signifie que mĂȘme aprĂšs la fermeture dâun descripteur de fichier faisant partie de cette liste, des Ă©vĂ©nements peuvent toujours ĂȘtre rapportĂ©s pour ce descripteur de fichier si dâautres descripteurs de fichier, se rĂ©fĂ©rant Ă la mĂȘme description de fichier sous-jacente, restent ouverts. Pour empĂȘcher cela, le descripteur de fichier doit ĂȘtre explicitement supprimĂ© de la liste (en utilisant epoll_ctl (2) EPOLL_CTL_DEL ) avant quâil ne soit dupliquĂ©. Autrement, lâapplication doit assurer que tous les descripteurs soient fermĂ©s (ce qui peut ĂȘtre difficile si les descripteurs ont Ă©tĂ© dupliquĂ©s en dehors du cadre par des fonctions de bibliothĂšque qui utilisent dup (2) ou fork (2))
|
- |
Si plus dâun Ă©vĂ©nement surviennent entre deux appels epoll_wait (2), sont-ils combinĂ©s ou rapportĂ©s sĂ©parĂ©ment ? |
Ils sont combinés.
|
- |
Est-ce quâune opĂ©ration sur un descripteur affecte les Ă©vĂ©nements dĂ©jĂ collectĂ©s mais pas encore rapportĂ©s ? |
Vous pouvez faire deux choses sur un descripteur existant. Une suppression serait sans effet dans ce cas. Une modification revérifie les entrées et sorties disponibles.
|
- |
Dois-je lire/Ă©crire sans cesse un descripteur jusquâĂ obtenir EAGAIN si lâattribut EPOLLET est utilisĂ© (comportement par dĂ©tection de changement dâĂ©tat) ? |
La rĂ©ception dâun Ă©vĂ©nement depuis epoll_wait (2) suggĂšre quâun descripteur est prĂȘt pour lâopĂ©ration dâE/S dĂ©sirĂ©e. Il doit ĂȘtre considĂ©rĂ© comme prĂȘt jusquâĂ ce que la prochaine lecture ou Ă©criture (non bloquante) remonte un EAGAIN . Quand et comment utiliser le descripteur dĂ©pend de vous.
Pour les fichiers orientĂ©s paquet ou jeton (par exemple, un socket datagramme ou un terminal en mode canonique), la seule façon de dĂ©tecter la fin de lâespace dâentrĂ©e et sortie pour les lectures ou Ă©critures est de continuer Ă lire ou Ă©crire jusquâĂ la rĂ©ception dâun EAGAIN .
Pour les fichiers orientĂ©s flux (par exemple, les tubes, FIFO ou sockets en mode flux), la disponibilitĂ© des entrĂ©es et sorties peut aussi ĂȘtre dĂ©tectĂ©e en vĂ©rifiant la quantitĂ© de donnĂ©es lues ou Ă©crites sur le descripteur. Par exemple, si vous appelez read (2) en demandant la lecture dâune certaine quantitĂ© de donnĂ©es et que read (2) en renvoie moins, vous pouvez ĂȘtre sĂ»r dâavoir consommĂ© tout le tampon dâentrĂ©e pour le descripteur. La mĂȘme chose est vraie pour lâappel systĂšme write (2) (Ă©vitez cette derniĂšre technique si vous ne pouvez pas garantir que le descripteur de fichier surveillĂ© corresponde toujours Ă un fichier de type flux).
Erreurs possibles et moyens de les éviter
|
- |
Famine (dĂ©tection par changement dâĂ©tat) |
Sâil y a un gros volume dâespace dâE/S, il est possible quâen essayant de les traiter, dâautres fichiers ne soient pas pris en compte provoquant une famine. Ce problĂšme nâest pas spĂ©cifique Ă epoll .
La solution est de maintenir une liste de descripteurs prĂȘts et de marquer le descripteur de fichier prĂȘt dans leur structure associĂ©e, permettant Ă lâapplication de savoir quels fichiers traiter mais toujours en tourniquet englobant tous les fichiers prĂȘts. Cela permet aussi dâignorer les Ă©vĂ©nements ultĂ©rieurs sur des descripteurs prĂȘts.
|
- |
En cas dâutilisation dâun cache dâĂ©vĂ©nements... |
Si vous utilisez un cache dâĂ©vĂ©nements, ou stockez tous les descripteurs renvoyĂ©s par epoll_wait (2), alors assurez-vous de disposer dâun moyen de marquer dynamiquement leurs fermetures (câest-Ă -dire causĂ©es par un traitement dâĂ©vĂ©nement prĂ©cĂ©dent). Supposons que vous recevez 100 évĂ©nements dâ epoll_wait (2) et que lâĂ©vĂ©nement 47 implique de fermer lâĂ©vĂšnement 13. Si vous supprimez la structure et utilisez close (2) pour le descripteur de fichier pour lâĂ©vĂšnement 13, alors votre cache peut encore contenir des Ă©vĂ©nements pour ce descripteur, posant alors des problĂšmes de confusion.
Une solution est dâinvoquer, pendant le traitement de lâĂ©vĂ©nement 47, epoll_ctl ( EPOLL_CTL_DEL ) pour supprimer le descripteur 13, le fermer avec close (2), puis marquer sa structure associĂ©e comme supprimĂ©e et la lier Ă une liste de nettoyage. Si vous rencontrez un autre Ă©vĂ©nement pour le descripteur 13 dans votre traitement, vous verrez quâil a Ă©tĂ© supprimĂ© prĂ©cĂ©demment sans que cela ne prĂȘte Ă confusion.
VERSIONS
Certains autres systÚmes fournissent des mécanismes similaires. Par exemple, FreeBSD propose kqueue et Solaris /dev/poll .
STANDARDS
Linux.
HISTORIQUE
Linux 2.5.44. glibc 2.3.2.
NOTES
Lâensemble des descripteurs de fichier qui sont supervisĂ©s par un descripteur de fichier dâ epoll peut ĂȘtre visualisĂ© Ă lâaide de lâentrĂ©e pour le descripteur de fichier dâ epoll dans le rĂ©pertoire /proc/ pid /fdinfo du processus. Consultez proc (5) pour plus de dĂ©tails.
LâopĂ©ration KCMP_EPOLL_TFD de kcmp(2) peut ĂȘtre utilisĂ©e pour tester si un descripteur de fichier est prĂ©sent dans une instance dâepoll.
VOIR AUSSI
epoll_create (2), epoll_create1 (2), epoll_ctl (2), epoll_wait (2), ioctl_eventpoll (2), poll (2), select (2)
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .