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

網絡服務器軟件開發/中間件開發,關注ACE/ICE/boost

C++博客 首頁 新隨筆 聯系 聚合 管理
  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 閱讀(1043) 評論(0)  編輯 收藏 引用 所屬分類: 網絡服務器開發
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            好男人免费精品视频| 一本色道久久综合狠狠躁篇怎么玩| 激情久久久久久久久久久久久久久久| 国产精品二区二区三区| 欧美视频一区二区| 国产精品高清网站| 国产午夜精品视频| 黄色综合网站| 日韩西西人体444www| 中文av一区特黄| 欧美一区二区在线免费观看| 久久国产精品99国产精| 欧美aaaaaaaa牛牛影院| 亚洲精品在线三区| 欧美一级二区| 欧美国产视频在线观看| 国产精品久久久久久模特| 国产一区白浆| 先锋影音国产精品| 欧美国产综合| 国产欧美一区二区精品仙草咪| 午夜性色一区二区三区免费视频 | 国内免费精品永久在线视频| 激情文学综合丁香| 夜夜嗨av一区二区三区网站四季av| 亚洲一区日韩在线| 欧美a一区二区| 亚洲自拍电影| 欧美另类极品videosbest最新版本 | 免费一级欧美片在线观看| 99香蕉国产精品偷在线观看| 欧美自拍偷拍| 国产精品久久久久久亚洲调教| 亚洲第一精品电影| 亚洲欧美日韩精品久久亚洲区| 欧美不卡视频| 先锋影音一区二区三区| 欧美日本亚洲视频| 亚洲大胆女人| 久久久成人精品| 一区二区三区四区国产| 蜜桃av噜噜一区| 国产午夜精品一区二区三区欧美 | 久久成人综合网| 欧美高清在线播放| 今天的高清视频免费播放成人| 亚洲免费婷婷| 日韩亚洲不卡在线| 欧美经典一区二区| 在线视频观看日韩| 狂野欧美一区| 久久精品免费观看| 国产午夜精品视频| 久久国产乱子精品免费女| 亚洲视频精选| 国产精品久久久久久久第一福利| 日韩一级精品视频在线观看| 欧美激情亚洲另类| 欧美成人情趣视频| 欧美日韩精品综合| 99精品黄色片免费大全| 亚洲国产综合91精品麻豆| 久久精品国产精品亚洲精品| 国产在线精品二区| 欧美日韩一区在线播放| 亚洲精品在线一区二区| 91久久精品国产91性色| 欧美成人伊人久久综合网| 亚洲三级视频在线观看| 亚洲日本视频| 国产精品h在线观看| 性欧美videos另类喷潮| 香蕉久久久久久久av网站| 激情久久久久久久| 欧美好吊妞视频| 亚洲人成网站777色婷婷| 欧美成人黄色小视频| 亚洲精品一区二区三区蜜桃久| 欧美 日韩 国产 一区| 欧美电影免费观看| 一区二区三区视频在线观看| 这里只有精品视频| 国产色综合久久| 乱中年女人伦av一区二区| 欧美成人高清| 亚洲欧美中日韩| 久久精品一区二区三区不卡牛牛 | 亚洲一区二区三区国产| 国产精品视频最多的网站| 久久亚洲精品一区二区| 欧美激情综合亚洲一二区| 亚洲欧美日韩中文视频| 久久综合伊人77777蜜臀| 在线一区视频| 久久电影一区| 亚洲一区二区黄色| 久久久综合精品| 亚洲图片在线观看| 久久久97精品| 中文在线不卡| 久久―日本道色综合久久| 在线亚洲一区观看| 久久久国产视频91| 亚洲一区二区三区视频播放| 久久麻豆一区二区| 午夜亚洲影视| 欧美精品久久久久久久久老牛影院 | 国产麻豆日韩欧美久久| 欧美激情一区三区| 国产欧美日韩一区二区三区在线 | 在线视频精品一区| 伊人狠狠色j香婷婷综合| 一区二区三区久久| 亚洲第一在线| 午夜一区二区三区不卡视频| 亚洲精品日日夜夜| 欧美一区二区三区视频免费| 欧美精品九九99久久| 免费视频最近日韩| 国产在线欧美| 亚洲欧美网站| 亚洲男女毛片无遮挡| 欧美日韩成人一区二区| 欧美激情一级片一区二区| 黑人巨大精品欧美一区二区| 亚洲欧美日韩天堂一区二区| 亚洲一区二区三区精品在线观看| 欧美jjzz| 亚洲高清av| 亚洲国产美女| 麻豆久久久9性大片| 久久综合999| 国产精品日韩精品| 亚洲欧美中文字幕| 亚洲欧美在线看| 欧美日韩成人网| 亚洲国产精品久久久| 亚洲黄色精品| 免费黄网站欧美| 亚洲国产精品一区二区第一页| 亚洲成人在线视频网站| 蜜臀久久99精品久久久画质超高清| 欧美不卡视频| 亚洲麻豆国产自偷在线| 欧美国产在线电影| 一本色道精品久久一区二区三区| 亚洲视频免费在线观看| 欧美精选在线| 中文一区在线| 久久国产主播精品| 影音先锋日韩精品| 欧美欧美天天天天操| 99精品欧美一区二区三区| 午夜日韩在线观看| 在线成人激情黄色| 欧美激情一区二区三区不卡| 艳妇臀荡乳欲伦亚洲一区| 午夜久久tv| 在线观看欧美日本| 欧美日韩国产区一| 亚洲综合第一| 免费在线观看成人av| 99热这里只有精品8| 国产精品毛片一区二区三区| 久久精品成人| 日韩亚洲欧美成人一区| 久久久久久久波多野高潮日日| 亚洲国产一区在线| 国产精品一区二区男女羞羞无遮挡 | 亚洲国产精品va| 亚洲在线成人| 好看的日韩av电影| 欧美午夜久久久| 久久精品亚洲一区二区| 亚洲电影自拍| 国产精品久久二区| 麻豆久久婷婷| 亚洲永久字幕| 亚洲精品1区| 久久噜噜亚洲综合| 亚洲免费视频在线观看| 亚洲欧洲综合另类在线| 国产亚洲精品一区二区| 欧美日韩国产999| 久久久www免费人成黑人精品 | 亚洲综合首页| 亚洲国产精品一区二区三区| 国产精品一区二区在线观看网站 | 欧美午夜无遮挡| 久久久久国色av免费看影院| 亚洲伦理在线免费看| 女人色偷偷aa久久天堂| 性欧美videos另类喷潮| 久久gogo国模裸体人体| 久久先锋影音av| 香蕉成人久久| 一区二区三区|亚洲午夜| 在线看片成人| 国内外成人在线视频| 国产精品视频免费观看|