青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

網(wǎng)絡(luò)服務(wù)器軟件開發(fā)/中間件開發(fā),關(guān)注ACE/ICE/boost

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  152 Posts :: 3 Stories :: 172 Comments :: 0 Trackbacks
EPOLL(4)                   Linux Programmer's Manual                  EPOLL(4)
NAME
epoll - I/O event notification facility
SYNOPSIS
#include <sys/epoll.h>
DESCRIPTION
epoll  is a variant of poll(2) that can be used either as Edge or Level
Triggered interface and scales well to large numbers  of  watched  fds.
Three  system  calls  are  provided to set up and control an epoll set:
epoll_create(2), epoll_ctl(2), epoll_wait(2).
An epoll set is connected to a file descriptor  created  by  epoll_cre-
ate(2).   Interest  for certain file descriptors is then registered via
epoll_ctl(2).  Finally, the actual wait is started by epoll_wait(2).
NOTES
The epoll event distribution interface is able to behave both  as  Edge
Triggered  ( ET ) and Level Triggered ( LT ). The difference between ET
and LT event distribution mechanism can be described as  follows.  Sup-
pose that this scenario happens :
1      The file descriptor that represent the read side of a pipe ( RFD
) is added inside the epoll device.
2      Pipe writer writes 2Kb of data on the write side of the pipe.
3      A call to epoll_wait(2) is done that will return  RFD  as  ready
file descriptor.
4      The pipe reader reads 1Kb of data from RFD.
5      A call to epoll_wait(2) is done.
If  the RFD file descriptor has been added to the epoll interface using
the EPOLLET flag, the call to epoll_wait(2) done in step 5 will  proba-
bly  hang because of the available data still present in the file input
buffers and the remote peer might be expecting a response based on  the
data  it already sent. The reason for this is that Edge Triggered event
distribution delivers events only when events happens on the  monitored
file.  So, in step 5 the caller might end up waiting for some data that
is already present inside the input buffer. In the  above  example,  an
event on RFD will be generated because of the write done in 2 , and the
event is consumed in 3.  Since the read operation done in  4  does  not
consume the whole buffer data, the call to epoll_wait(2) done in step 5
might lock indefinitely. The epoll interface, when used with the  EPOL-
LET flag ( Edge Triggered ) should use non-blocking file descriptors to
avoid having a blocking read or write starve the task that is  handling
multiple  file  descriptors.  The suggested way to use epoll as an Edge
Triggered ( EPOLLET ) interface is  below,  and  possible  pitfalls  to
avoid follow.
i      with non-blocking file descriptors
ii     by  going  to  wait  for an event only after read(2) or write(2)
return EAGAIN
On the contrary, when used as a Level Triggered interface, epoll is  by
all means a faster poll(2), and can be used wherever the latter is used
since it shares the same semantics. Since even with the Edge  Triggered
epoll  multiple  events  can  be  generated  up on receival of multiple
chunks of data, the caller has the option to specify  the  EPOLLONESHOT
flag, to tell epoll to disable the associated file descriptor after the
receival of an event with epoll_wait(2).  When the EPOLLONESHOT flag is
specified,  it  is  caller  responsibility to rearm the file descriptor
using epoll_ctl(2) with EPOLL_CTL_MOD.
EXAMPLE FOR SUGGESTED USAGE
While the usage of epoll when employed like a Level Triggered interface
does  have  the  same  semantics  of  poll(2),  an Edge Triggered usage
requires more clarifiction to avoid stalls  in  the  application  event
loop.  In this example, listener is a non-blocking socket on which lis-
ten(2) has been called. The function do_use_fd()  uses  the  new  ready
file descriptor until EAGAIN is returned by either read(2) or write(2).
An event driven state machine application should, after having received
EAGAIN,  record  its  current  state  so  that  at  the  next  call  to
do_use_fd() it will continue to  read(2)  or  write(2)  from  where  it
stopped before.
struct epoll_event ev, *events;
for(;;) {
nfds = epoll_wait(kdpfd, events, maxevents, -1);
for(n = 0; n < nfds; ++n) {
if(events[n].data.fd == listener) {
client = accept(listener, (struct sockaddr *) &local,
&addrlen);
if(client < 0){
perror("accept");
continue;
}
setnonblocking(client);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = client;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
fprintf(stderr, "epoll set insertion error: fd=%d0,
client);
return -1;
}
}
else
do_use_fd(events[n].data.fd);
}
}
When  used  as an Edge triggered interface, for performance reasons, it
is possible to add the file descriptor inside  the  epoll  interface  (
EPOLL_CTL_ADD  )  once  by specifying ( EPOLLIN|EPOLLOUT ). This allows
you to avoid continuously switching between EPOLLIN and EPOLLOUT  call-
ing epoll_ctl(2) with EPOLL_CTL_MOD.
QUESTIONS AND ANSWERS (from linux-kernel)
Q1     What happens if you add the same fd to an epoll_set twice?
A1     You  will  probably get EEXIST. However, it is possible that two
threads may add the same fd twice. This is a harmless condition.
Q2     Can  two  epoll  sets  wait  for  the same fd? If so, are events
reported to both epoll sets fds?
A2     Yes. However, it is not recommended. Yes it would be reported to
both.
Q3     Is the epoll fd itself poll/epoll/selectable?
A3     Yes.
Q4     What happens if the epoll fd is put into its own fd set?
A4     It  will  fail.  However, you can add an epoll fd inside another
epoll fd set.
Q5     Can I send the epoll fd over a unix-socket to another process?
A5     No.
Q6     Will the close of an fd cause it to be removed  from  all  epoll
sets automatically?
A6     Yes.
Q7     If more than one event comes in between epoll_wait(2) calls, are
they combined or reported separately?
A7     They will be combined.
Q8     Does an operation on an fd affect the already collected but  not
yet reported events?
A8     You  can  do  two  operations on an existing fd. Remove would be
meaningless for this case. Modify will re-read available I/O.
Q9     Do I need to continuously read/write an  fd  until  EAGAIN  when
using the EPOLLET flag ( Edge Triggered behaviour ) ?
A9     No  you don't. Receiving an event from epoll_wait(2) should sug-
gest to you that such file descriptor is ready for the requested
I/O  operation.  You  have simply to consider it ready until you
will receive the next EAGAIN. When and how  you  will  use  such
file  descriptor is entirely up to you. Also, the condition that
the read/write I/O space is exhausted can be detected by  check-
ing  the  amount  of  data  read/write  from/to  the target file
descriptor. For example, if you call read(2) by asking to read a
certain  amount  of  data  and read(2) returns a lower number of
bytes, you can be sure to have exhausted the read I/O space  for
such  file  descriptor.  Same  is  valid  when writing using the
write(2) function.
POSSIBLE PITFALLS AND WAYS TO AVOID THEM
o Starvation ( Edge Triggered )
If there is a large amount of I/O space, it is possible that by  trying
to  drain it the other files will not get processed causing starvation.
This is not specific to epoll.
The solution is to maintain a ready list and mark the  file  descriptor
as  ready in its associated data structure, thereby allowing the appli-
cation to remember which files need to be  processed  but  still  round
robin  amongst  all the ready files. This also supports ignoring subse-
quent events you receive for fd's that are already ready.
o If using an event cache...
If you use  an  event  cache  or  store  all  the  fd's  returned  from
epoll_wait(2),  then  make  sure  to  provide a way to mark its closure
dynamically (ie- caused by a previous event's processing). Suppose  you
receive  100  events  from epoll_wait(2), and in eventi #47 a condition
causes event #13 to be closed.  If you remove the structure and close()
the  fd  for event #13, then your event cache might still say there are
events waiting for that fd causing confusion.
One solution for this is to call, during the processing  of  event  47,
epoll_ctl(EPOLL_CTL_DEL)  to  delete  fd  13 and close(), then mark its
associated data structure as removed and link it to a cleanup list.  If
you  find  another  event  for fd 13 in your batch processing, you will
discover the fd had been previously removed and there will be no confu-
sion.
CONFORMING TO
epoll(4) is a new API introduced in Linux kernel 2.5.44.  Its interface
should be finalized in Linux kernel 2.5.66.
SEE ALSO
epoll_create(2) epoll_ctl(2) epoll_wait(2)
Linux                           23 October 2002                       EPOLL(4)
posted on 2008-05-21 14:43 true 閱讀(1045) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)服務(wù)器開發(fā)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品99久久久久久人 | 亚洲另类黄色| 国产精品午夜在线观看| 欧美高清日韩| 国产亚洲欧洲一区高清在线观看| 亚洲高清久久网| 国产午夜精品视频免费不卡69堂| 亚洲精品极品| 亚洲国产日韩欧美| 久久久91精品国产一区二区三区| 亚洲专区一区二区三区| 免费不卡在线观看| 蜜桃久久精品乱码一区二区| 国产精品亚洲综合| 99视频国产精品免费观看| 在线免费精品视频| 久久久久一区| 久久综合激情| 国产综合色在线| 亚洲欧美日韩另类| 性欧美办公室18xxxxhd| 欧美日韩无遮挡| 亚洲精品小视频| 亚洲毛片一区| 欧美激情在线播放| 亚洲国产人成综合网站| 亚洲人精品午夜| 欧美成人精品一区二区| 亚洲高清资源| 亚洲精品系列| 欧美日韩国产一区二区三区地区 | 欧美日韩成人在线播放| 欧美高清视频一二三区| 在线观看91久久久久久| 久久久久国产精品人| 久久综合给合久久狠狠色| 黑人巨大精品欧美一区二区| 欧美在线综合| 老色鬼精品视频在线观看播放| 国产一区二区三区高清在线观看| 欧美亚洲一区| 米奇777超碰欧美日韩亚洲| 一区二区在线观看av| 麻豆freexxxx性91精品| 亚洲娇小video精品| 亚洲小说春色综合另类电影| 国产精品久久久久国产精品日日| 亚洲午夜视频| 久久综合电影一区| 亚洲国产欧美在线人成| 欧美日韩国产系列| 午夜一区不卡| 欧美成人一区二区在线| 99国产精品国产精品毛片| 欧美午夜精品理论片a级按摩 | 国产色产综合产在线视频| 欧美一区二粉嫩精品国产一线天| 久久一区国产| 亚洲三级影院| 国产精品性做久久久久久| 亚洲欧美日本国产有色| 麻豆精品91| 一区二区电影免费观看| 国产欧美日韩视频一区二区三区| 久久国产色av| 亚洲精品综合久久中文字幕| 欧美一级视频免费在线观看| 精品动漫一区| 欧美日韩综合视频| 久久久久久有精品国产| 一本色道久久综合亚洲精品婷婷 | 午夜精品国产更新| 悠悠资源网亚洲青| 欧美日韩午夜剧场| 久久久精品日韩欧美| 亚洲精品在线二区| 久久综合久久久| 亚洲伊人网站| 亚洲国产日韩一区| 国产精品一区二区在线| 欧美国产大片| 久久成人免费电影| 亚洲视频电影在线| 亚洲破处大片| 老司机免费视频一区二区三区| 亚洲无人区一区| 亚洲激情亚洲| 国产亚洲精品久| 国产精品国产三级国产专播品爱网| 久久一区欧美| 欧美一区二区三区的| 在线亚洲欧美专区二区| 亚洲茄子视频| 亚洲国产精品久久久久秋霞影院| 久久久www成人免费精品| 亚洲永久免费观看| 日韩小视频在线观看| 亚洲盗摄视频| 国外视频精品毛片| 国产偷国产偷精品高清尤物| 欧美亚州一区二区三区| 欧美精品大片| 欧美成人官网二区| 蜜臀av国产精品久久久久| 久久黄色小说| 久久久久国产一区二区三区| 亚洲欧美伊人| 亚洲欧美日韩精品在线| 亚洲一区中文| 亚洲男人av电影| 午夜精品久久久99热福利| 亚洲欧美三级伦理| 午夜久久黄色| 性娇小13――14欧美| 亚洲欧美自拍偷拍| 欧美亚洲视频在线观看| 欧美一级在线亚洲天堂| 久久国产精品亚洲77777| 欧美一区二区视频在线| 久久av在线看| 另类av一区二区| 农村妇女精品| 欧美日韩成人一区二区三区| 欧美三区在线| 国产伦一区二区三区色一情| 国产免费亚洲高清| 狠狠色狠狠色综合系列| 亚洲国产岛国毛片在线| 亚洲人成亚洲人成在线观看图片| 99国产精品| 亚洲欧美日韩在线综合| 欧美一级片一区| 另类亚洲自拍| 亚洲国产毛片完整版 | 99re热这里只有精品视频| 一区二区三区国产| 欧美诱惑福利视频| 免费在线亚洲| 国产精品白丝黑袜喷水久久久| 国产精品免费小视频| 韩国女主播一区| 亚洲区第一页| 香蕉久久夜色精品国产使用方法 | 久久九九99| 亚洲高清一区二| 亚洲视频在线视频| 久久久欧美一区二区| 欧美另类专区| 国产拍揄自揄精品视频麻豆| 一区在线观看视频| 亚洲视频综合| 免费人成网站在线观看欧美高清| 最新热久久免费视频| 亚洲欧美中文另类| 欧美人与禽猛交乱配| 国产热re99久久6国产精品| 亚洲国产小视频在线观看| 亚洲永久免费av| 亚洲福利国产精品| 欧美一区激情| 欧美日韩免费在线视频| 精品1区2区3区4区| 亚洲欧美激情精品一区二区| 欧美成人精品三级在线观看| 一区二区三区高清| 欧美电影专区| 国内久久视频| 亚洲欧洲av一区二区| 欧美黄在线观看| 久久成人亚洲| 国产精品久久综合| 99精品国产99久久久久久福利| 久久精品成人一区二区三区| 亚洲乱码国产乱码精品精98午夜| 久久久亚洲国产美女国产盗摄| 国产精品国色综合久久| 亚洲精品乱码久久久久久日本蜜臀| 久久久精品久久久久| 中国av一区| 欧美日韩精品一二三区| 亚洲国产精品电影| 久久亚洲捆绑美女| 欧美亚洲一区二区在线观看| 国产精品swag| 一区二区三区视频免费在线观看 | 欧美激情在线观看| 亚洲第一区中文99精品| 久久久.com| 香港久久久电影| 国产精品一区二区三区四区| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲国产天堂网精品网站| 开元免费观看欧美电视剧网站| 国产一区二区三区自拍| 久久精品夜夜夜夜久久| 香蕉久久a毛片| 国产亚洲精品美女| 久久久久久久国产| 欧美在线播放| 在线电影国产精品|