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

網絡服務器軟件開發/中間件開發,關注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>
            亚洲啪啪91| 久久久免费精品视频| 亚洲电影在线播放| 国产精品久久久一区麻豆最新章节| 亚洲一区3d动漫同人无遮挡| 亚洲国产成人精品久久| 老牛影视一区二区三区| 久热综合在线亚洲精品| 久久综合色综合88| 另类图片国产| 亚洲日本久久| 99精品国产在热久久| 一本高清dvd不卡在线观看| 亚洲美女视频网| 亚洲欧美视频在线| 欧美制服丝袜第一页| 久久蜜桃精品| 欧美日韩黄色大片| 国产精品免费电影| 91久久黄色| 欧美伊人影院| 亚洲精品网址在线观看| 国产亚洲人成网站在线观看| 亚洲国产专区校园欧美| 99这里只有久久精品视频| 午夜天堂精品久久久久| 欧美成人精品在线视频| 亚洲国内精品| 久久精品人人| 国产亚洲精品久| 亚洲欧美区自拍先锋| 欧美激情久久久久| 久久频这里精品99香蕉| 国产精品免费aⅴ片在线观看| 国产日韩欧美在线看| 亚洲影院一区| 一区二区三区视频观看| 久久躁日日躁aaaaxxxx| 国产一区二区中文字幕免费看| 99国内精品久久| 亚洲精品一区二区三区福利| 久久九九免费视频| 在线 亚洲欧美在线综合一区| 欧美一级专区免费大片| 午夜视黄欧洲亚洲| 国产一本一道久久香蕉| 久久综合国产精品| 久久亚洲影院| 日韩网站在线观看| 一区二区三区精品视频| 国产欧美在线播放| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久人人爽人人爽爽久久| 一区二区三区在线观看视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美成人黑人xx视频免费观看| 国产中文一区| 91久久精品国产91久久| 国产精品免费福利| 亚洲东热激情| 国产主播在线一区| 99re6这里只有精品| 国产精品一区2区| 亚洲国产精品va在线看黑人动漫| 欧美日韩精品一区二区天天拍小说| 亚洲综合日韩| 欧美成人在线网站| 久久精品视频免费播放| 欧美日韩不卡合集视频| 蜜桃av综合| 激情久久综艺| 欧美亚洲一级片| 一区二区日韩精品| 欧美破处大片在线视频| 欧美成人亚洲成人| 亚洲另类自拍| 男女激情视频一区| 欧美激情第二页| 亚洲精品国产无天堂网2021| 久久精品国产清高在天天线| 久久精品国产91精品亚洲| 国产伦精品一区二区三区四区免费| 亚洲欧洲一区二区三区久久| 亚洲国产成人久久| 欧美高清视频www夜色资源网| 亚洲第一级黄色片| 男男成人高潮片免费网站| 91久久精品一区二区别| 亚洲午夜未删减在线观看| 国产精品第一区| 久久国产精品久久w女人spa| 久久久久成人精品| 亚洲大片一区二区三区| 欧美激情片在线观看| 中文国产成人精品| 榴莲视频成人在线观看| 夜夜嗨av一区二区三区网页 | 久久久之久亚州精品露出| 国产午夜精品理论片a级探花| 久久精品99久久香蕉国产色戒| 欧美激情精品久久久久久变态| 亚洲综合色丁香婷婷六月图片| 国产区日韩欧美| 欧美日韩综合网| 理论片一区二区在线| 午夜欧美精品久久久久久久| 亚洲黄色三级| 欧美成人视屏| 美女国产一区| 蜜桃视频一区| 久久婷婷丁香| 久久综合999| 老司机免费视频久久| 午夜电影亚洲| 亚洲影视在线| 欧美在线电影| 久久亚洲精品一区二区| 久久精品一区二区三区不卡| 亚洲欧美日韩一区二区| 亚洲欧美日韩成人| 久久丁香综合五月国产三级网站| 一本色道久久综合亚洲精品婷婷| 亚洲精选大片| 亚洲午夜视频| 久久精品国产视频| 国产精品国产自产拍高清av王其| 欧美日韩和欧美的一区二区| 欧美三日本三级少妇三99| 国产精品视频xxx| 精品91视频| 亚洲午夜精品久久久久久浪潮| 亚洲视频在线一区| 久久综合色一综合色88| 亚洲国产高潮在线观看| 一区二区三区欧美在线观看| 亚洲欧美日韩国产成人| 麻豆国产精品va在线观看不卡| 欧美视频一区二区在线观看| 欧美视频在线观看免费网址| 国产亚洲精品久久久久动| 亚洲国产精品久久| 性欧美长视频| 亚洲另类在线一区| 久久人体大胆视频| 国产日韩欧美91| 亚洲一区精品视频| 最新日韩欧美| 麻豆精品在线播放| 黄色av一区| 久久久91精品国产一区二区精品| 亚洲免费成人| 欧美日韩精品一区二区三区四区| 在线欧美不卡| 欧美二区在线| 欧美国产亚洲另类动漫| 亚洲大片在线| 欧美激情一区二区三区在线视频观看 | 欧美视频在线观看一区二区| 在线看日韩av| 狠狠久久亚洲欧美专区| 日韩一级精品视频在线观看| 欧美高清视频| 欧美日韩高清免费| 亚洲影视九九影院在线观看| 这里只有视频精品| 国产一区二区三区无遮挡| 葵司免费一区二区三区四区五区| 久久精品国语| 日韩视频免费观看| 亚洲一区在线视频| 亚洲国产精品悠悠久久琪琪| 亚洲激情网站| 国产精品日韩欧美| 91久久久国产精品| 99精品99久久久久久宅男| 久久深夜福利免费观看| 久久综合久久综合这里只有精品| 另类专区欧美制服同性| 欧美伊久线香蕉线新在线| 麻豆国产va免费精品高清在线| 欧美日韩精品二区| 国产欧美精品一区| 黄色影院成人| 伊人影院久久| 亚洲国产高清一区二区三区| 亚洲色在线视频| 亚欧成人精品| 国产精品99久久久久久久久| 欧美chengren| 亚洲三级电影全部在线观看高清| 另类天堂av| 国产欧美精品一区二区三区介绍 | 亚洲欧洲av一区二区三区久久| 国产日韩欧美a| 欧美一区永久视频免费观看| av成人黄色| 国产精品乱子久久久久| 亚洲肉体裸体xxxx137| 亚洲午夜电影网| 午夜精品一区二区三区电影天堂 |