File: epoll.7

package info (click to toggle)
manpages-ja 0.5.0.0.20100315-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 21,156 kB
  • ctags: 1
  • sloc: sh: 13,935; perl: 157; makefile: 114
file content (570 lines) | stat: -rw-r--r-- 16,292 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
.\"
.\"  epoll by Davide Libenzi ( efficient event notification retrieval )
.\"  Copyright (C) 2003  Davide Libenzi
.\"
.\"  This program is free software; you can redistribute it and/or modify
.\"  it under the terms of the GNU General Public License as published by
.\"  the Free Software Foundation; either version 2 of the License, or
.\"  (at your option) any later version.
.\"
.\"  This program is distributed in the hope that it will be useful,
.\"  but WITHOUT ANY WARRANTY; without even the implied warranty of
.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
.\"  GNU General Public License for more details.
.\"
.\"  You should have received a copy of the GNU General Public License
.\"  along with this program; if not, write to the Free Software
.\"  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
.\"
.\"  Davide Libenzi <davidel@xmailserver.org>
.\"
.\" Japanese Version Copyright (c) 2004-2005 Yuichi SATO
.\"         all rights reserved.
.\" Translated Sat Jun 19 07:50:04 JST 2004
.\"         by Yuichi SATO <ysato444@yahoo.co.jp>
.\" Updated & Modified 2005-01-18, Yuichi SATO
.\" Updated 2006-07-14, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
.\"         Catch up to LDP v2.34. epoll.4 is renamed to epoll.7.
.\" Updated 2007-09-07, Akihiro MOTOKI, LDP v2.64
.\" Updated 2008-04-08, Akihiro MOTOKI, LDP v2.79
.\" Updated 2009-02-23, Akihiro MOTOKI, LDP v3.19
.\"
.TH EPOLL 7 2009-02-01 "Linux" "Linux Programmer's Manual"
.SH ̾
epoll \- I/O ٥εǽ
.SH 
.B #include <sys/epoll.h>
.SH 
.B epoll

.BR poll (2)
ΰǤꡢåȥꥬ󥿥ե
٥ȥꥬ󥿥եΤɤȤƤѤ뤳ȤǤ
ƻ뤹եǥץο¿ˤѤǤ롣
.B epoll
󥹥󥹤κԤ
ʲΥƥॳ뤬󶡤Ƥ:
.IP * 3
.B epoll
󥹥󥹤
.BR epoll_create (2)
Ǻ롣
.BR epoll_create (2)
Ϻ epoll 󥹥󥹤򻲾Ȥեǥץ֤
(äȿ
.BR epoll_create1 (2)
Ǥϡ
.BR epoll_create (2)
εǽĥƤ)
.IP *
ΥեǥץФƻƤ
.BR epoll_ctl (2)
Ͽ롣
.B epoll
󥹥󥹤˸ϿƤեǥץν
.I epoll
ȸƤФ뤳Ȥ⤢롣
.IP *
Ǹ
.BR epoll_wait (2)
ǼºݤΥ٥Ԥ򳫻Ϥ롣
.SS ٥ȥꥬȥåȥꥬ
.B epoll
٥ (distribution) 󥿥եϡ
åȥꥬ (ET) ȤƤ٥ȥꥬ (LT) ȤƤư뤳ȤǤ롣
Ĥΰ㤤ϡΤ褦Ǥ롣
Τ褦ʥʥꥪäȤ褦:
.IP 1. 3
ѥפɤ߹¦ɽեǥץ
.RI ( rfd )

.B epoll
󥹥󥹤Ͽ롣
.IP 2.
ѥפؽ񤭹ץब 2 kB Υǡѥפν񤭹¦ؽ񤭹ࡣ
.IP 3.
.BR epoll_wait (2)
ƤӽФȡɤ߹߲ǽ (ready) ʥեǥץȤ
.I rfd
֤롣
.IP 4.
ѥפɤ߽Фץब1 kB Υǡ
.I rfd
ɤ߽Ф
.IP 5.
.BR epoll_wait (2)
θƤӽФԤ롣
.PP
.I rfd
եǥץ
.B EPOLLET
ե饰 (åȥꥬ) Ȥä
.B epoll
ɲäƤȡ
ѲǽʥǡեϥХåեˤޤ¸ߤˤ⤫餺
ƥå
.B 5

.BR epoll_wait (2)
θƤӽФǥϥ󥰤ǽ롣
ΰǡ⡼Ȥ³ (peer) ϴ줿ǡ
ŤƱԤƤ뤫⤷ʤ
Τ褦ʤȤͳϡåȥꥬ٥Ǥϡ
˥Ƥեǥ٥ȤäȤˤΤߥ٥Ȥ
뤿Ǥ롣
äơƥå
.B 5
ǤϡƤӽФ¦ϷŪ
ϥХåեˤ¸ߤǡԤĤȤˤʤ뤫⤷ʤ
嵭Ǥϡ
.B 2
ǹԤ줿񤭹ߤˤä
.I rfd
˴ؤ륤٥Ȥ졢
.B 3
ǥ٥Ȥ (consume) 롣
.B 4
ǹԤɤ߹ǤϡΥХåեǡ񤷤ʤΤǡ
ƥå
.B 5
ǹԤ
.BR epoll_wait (2)
θƤӽФ
̵¤ (block) 뤫⤷ʤ

.B EPOLLET
ե饰Ѥ륢ץꥱǤϡ
󥿥եϥ֥åʤ (non-blocking) եǥץ
Ȥ٤Ǥ롣
ϡ֥åɤ߹ߤ񤭹ߤˤäơ
ʣΥեǥץ򰷤
ߤƤޤΤ򤱤뤿Ǥ롣
.B epoll
򥨥åȥꥬ
.RB ( EPOLLET )
󥿥եȤƻȤƤˡϰʲ̤Ǥ롣
.RS
.TP 4
.B i
֥åʤեǥץȶ˻Ȥ
.TP
.B ii
.BR read (2)
ޤ
.BR write (2)

.B EAGAIN
֤ǤΤߡ٥ȤԤġ
.RE
.PP
٥ȥꥬ󥿥եȤƻȤ
 (餬ǥեȤǤ롢
.B EPOLLET
ꤵʤä)
.B epoll
ñ˹®
.BR poll (2)
ǤꡢȤƱʤΤǡ
.BR poll (2)
ȤƤȤǤϤɤǤѤ뤳ȤǤ롣

åȥꥬȤäǤ⡢ʣΥǡʣ
.B epoll
٥ȤΤǡ
ƤӽФ¦ˤ
.B EPOLLONESHOT
ե饰ꤹ륪ץ󤬤롣
Υե饰
.B epoll
Фơ
.BR epoll_wait (2)
ˤ륤٥ȤǡϢեǥץ̵ˤ롣
.B EPOLLONESHOT
ե饰ꤵ줿硢
.BR epoll_ctl (2)

.B EPOLL_CTL_MOD
ꤷƥեǥץٻѤǤ褦ˤΤϡ
ƤӽФ¦ǤǤ롣
.SS /proc 󥿥ե
epoll 񤹤륫̤ͥ¤뤿ˡ
ʲΥ󥿥եѤ뤳ȤǤ롣
.TP
.\" Following was added in 2.6.28, but them removed in 2.6.29
.\" .TP
.\" .IR /proc/sys/fs/epoll/max_user_instances " (since Linux 2.6.28)"
.\" This specifies an upper limit on the number of epoll instances
.\" that can be created per real user ID.
.TP
.IR /proc/sys/fs/epoll/max_user_watches " (Linux 2.6.28 ʹ)"
Υեϡ桼ƥƤ epoll 󥹥󥹤
ϿǤեǥץξ¤ꤹ롣
ξ¤ϼ¥桼 ID ñ̤Ǥ롣
Ͽ줿եǥץ 1 Ĥ񤹤̤ϡ
32 ӥåȥͥǤ褽 90 Хȡ
64 ӥåȥͥǤ褽 160 ХȤǤ롣
.\" 2.6.29 (in 2.6.28, the default was 1/32 of lowmem)
ߤΤȤ
.I max_user_watches
ΥǥեͤϡѲǽʥ겼¤ 1/25 (4%) Ǥꡢ
ϿǾ񤵤 (Хñ) dzäͤȤʤ롣
.SS ʻ
٥ȥꥬ󥿥եȤƻѤȤ
.B epoll
λȤ
.BR poll (2)
ƱǤ롣
åȥꥬȤƻȤϡ
ץꥱΥ٥ȥ롼פǥȡ (stall) ʤ褦ˡ
ȤΤˤƤɬפ롣
Ǥϡꥹʤϥ֥åʤåȤǤꡢ
.BR listen (2)
ƤФƤ롣
ؿ
.I do_use_fd()
ϡ
.BR read (2)
ޤ
.BR write (2)
ˤä
.B EAGAIN
֤ޤǤϡѤߤΥեǥץȤ
٥ȶươȥޥ󥢥ץꥱϡ
.B EAGAIN
塢Ȥξ֤ϿƤ٤Ǥ롣
ˤꡢ
.I do_use_fd()
ƤӽФΤȤˡߤȤ
.BR read (2)
ޤ
.BR write (2)
³뤳ȤǤ롣

.in +4n
.nf
#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;

/* Set up listening socket, \(aqlisten_sock\(aq (socket(),
   bind(), listen()) */

epollfd = epoll_create(10);
if (epollfd == \-1) {
    perror("epoll_create");
    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 (;;) {
    nfds = epoll_wait(epollfd, events, MAX_EVENTS, \-1);
    if (nfds == \-1) {
        perror("epoll_pwait");
        exit(EXIT_FAILURE);
    }

    for (n = 0; n < nfds; ++n) {
        if (events[n].data.fd == listen_sock) {
            conn_sock = accept(listen_sock,
                            (struct sockaddr *) &local, &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);
        }
    }
}
.fi
.in

åȥꥬ󥿥եȤƻȤ硢ǽͳˤꡢ

.RB ( EPOLLIN | EPOLLOUT )
ꤷƤ
.RB ( EPOLL_CTL_ADD
) եǥץ
.B epoll
󥿥եɲä뤳ȤǤ롣
ˤꡢ
.BR epoll_ctl (2)

.B EPOLL_CTL_MOD
ꤷƸƤӽФȤ
.B EPOLLIN

.B EPOLLOUT
Ϣ³Ūڤؤ򤱤롣
.SS Ȳ
.TP 4
.B Q0
.B epoll
Ͽ줿եǥץ̤ˤϡ
򥭡ȤƻȤФ褤
.TP
.B A0
ϥեǥץֹȥץե뵭 (open file
description) ȤǤ (ץե뵭Ҥ "open file handle" Ȥ
ƤФ졢ץ󤵤줿եΥͥɽǤ)
.TP
.B Q1
1 Ĥ
.B epoll
󥹥󥹤Ʊեǥץ 2 ϿȤɤʤ뤫
.TP
.B A1
֤
.B EEXIST

ʤ顢Ʊ
.B epoll
󥹥󥹤Фʣ줿ǥץɲä뤳ȤϲǽǤ
.RB ( dup (2),
.BR dup2 (2),
.BR fcntl (2)
.B F_DUPFD
ʤ)
.\" But a descriptor duplicated by fork(2) can't be added to the
.\" set, because the [file *, fd] pair is already in the epoll set.
.\" That is a somewhat ugly inconsistency.  On the one hand, a child process
.\" cannot add the duplicate file descriptor to the epoll set.  (In every
.\" other case that I can think of, descriptors duplicated by fork have
.\" similar semantics to descriptors duplicated by dup() and friends.)  On
.\" the other hand, the very fact that the child has a duplicate of the
.\" descriptor means that even if the parent closes its descriptor, then
.\" epoll_wait() in the parent will continue to receive notifications for
.\" that descriptor because of the duplicated descriptor in the child.
.\"
.\" See http://thread.gmane.org/gmane.linux.kernel/596462/
.\" "epoll design problems with common fork/exec patterns"
.\"
.\" mtk, Feb 2008
ʣեǥץۤʤ
.I events
ޥϿС٥Ȥե륿󥰤Τ
εǽͭѤʼˡǤ롣
.TP
.B Q2
2 Ĥ
.B epoll
󥹥󥹤ƱեǥץԤ뤳Ȥϲǽ
⤷ǽǤС٥Ȥξ
.B epoll
եǥץ𤵤뤫
.TP
.B A2
٥Ȥξ𤵤롣
ʤ顢ˤտץߥ󥰤ɬפ
뤫⤷ʤ
.TP
.B Q3
.B epoll
եǥץȤ poll/epoll/select ǽ
.TP
.B A3
ǽǤ롣
.B epoll
եǥץ˽ԤΥ٥Ȥϡ
ɤ߽ФǽΤ뤳Ȥ
.TP
.B Q4
.B epoll
եǥץ򼫿ȤΥեǥץ
褦ȤȤɤʤ뤫
.TP
.B A4
.BR epoll_ctl (2)
θƤӽФ
.RB ( EINVAL
) Ԥ

.B epoll
եǥץ¾
.B epoll
եǥץɲä뤳ȤϲǽǤ롣
.TP
.B Q5
.B epoll
եǥץ Unix ɥᥤ󥽥åȤ¾Υץ뤳Ȥϲǽ
.TP
.B A5
ǽ򤹤뤳Ȥ˰̣Ϥʤ
ʤʤ顢¦Υץ
.B epoll
ΥեǥץΥԡäƤʤǤ롣
.TP
.B Q6
եǥץ򥯥ȡΥեǥץƤ
.B epoll
礫鼫ưŪ˺뤫
.TP
.B A6
뤬ʲդɬפǤ롣
եǥץϥץե뵭
.RB ( open (2)
) ؤλȤǤ롣
ǥץʣ
.BR dup (2),
.BR dup2 (2),
.BR fcntl (2)

.B F_DUPFD

.BR fork (2)
ͳǹԤ٤ˡƱץե뵭Ҥ򻲾Ȥ뿷Υե
ǥץ롣
ץե뵭ҼΤϡȤ򻲾ȤƤΥեǥץ
ޤ¸ߤ³롣
եǥץ
.B epoll
礫Τϡб륪ץե뵭Ҥ򻲾ȤƤ
ƤΥեǥץ줿Ǥ
.RB ( epoll_ctl ()
.B EPOLL_CTL_DEL
ȤäƤΥǥץŪ˺ˤ)
ΤȤϡ
.B epoll
°Ƥ뤢եǥץ򥯥ǤäƤ⡢
Ʊե뵭Ҥ򻲾Ȥ¾Υեǥץץ󤵤Ƥ֤ϡ
եǥץ˥٥Ȥ𤵤ǽ
Ȥ̣롣
.TP
.B Q7
2 İʾΥ٥Ȥ
.BR epoll_wait (2)
δ֤ȯ硢ϤޤȤ𤵤뤫
Ȥ̡𤵤뤫
.TP
.B A7
ޤȤ𤵤
.TP
.B Q8
եǥץФϡ
˽Ƥ뤬ޤ𤵤Ƥʤ٥Ȥ˱ƶ뤫
.TP
.B A8
¸ΥեǥץФ 2 ĤԤȤǤ롣
ξ硢ˤϰ̣ʤ
ѹȡѲǽ I/O Ƥɤ߹ޤ롣
.TP
.B Q9
.B EPOLLET
ե饰 (åȥꥬư) ȤäƤ硢
.B EAGAIN
ޤǡ
³ƥեǥץɤ߽񤭤ɬפ뤫
.TP
.B A9
.BR epoll_wait (2)
饤٥Ȥ뤳Ȥϡ
Υեǥץ׵ᤵ줿 I/O ФƽѤߤǤ롢
ȤȤ桼˼ΤǤ롣
 (֥åʤ) read/write 
.B EAGAIN
ޤǤϥեǥץϽѤߤǤ
ͤʤФʤʤ
Υեǥץ򤤤ĤɤΤ褦˻Ȥϡ
桼ǤƤ롣
.sp
ѥåȻظȡظΥե (㤨Сǡॽåȡ
canonical ⡼ɤü) Ǥϡ
ɤ߹ / 񤭹Ѥ I/O ֤Τͣˡ
.B EAGAIN
ˤʤޤ read/write ԤȤǤ롣
.sp
ȥ꡼ظΥե (㤨СѥסFIFOȥ꡼ॽå) Ǥϡ
ɤ߹ / 񤭹Ѥ I/O ֤ȤԤ줿֤ϡ
оݤȤʤեǥץɤ߹ǡ̤ޤ
񤭹ǡ̤å뤳ȤǤ⸡ΤǤ롣
㤨С̤Υǡɤ߹ि
.BR read (2)
ƤȤˡ
.BR read (2)
֤Хȿ꾯ʤä硢
Υեǥץɤ߹ I/O ֤
ȤԤ줿Ȥʬ롣
.BR write (2)
Ȥäƽ񤭹ߤ򤹤Ȥ⡢ƱȤ
(ƻ뤷Ƥեǥץ˥ȥ꡼ظΥե
ȤƤ뤳ȤݾڤǤʤˤϡԤμˡλѤ򤱤뤳)
.SS ꤬ȤȲˡ
.TP
.B o  (starvation) (åȥꥬ)
.PP
礭 I/O ֤硢
 I/O ֤Υǡƽ (drain) 褦Ȥȡ
¾Υե뤬줺ȯ뤳Ȥ
(
.B epoll
˸ͭΤΤǤϤʤ)
.PP
βˡϡѤ߾֤ΥꥹȤơ
Ϣ data ¤Τǥեǥץ
ѲǽǤȥޡ뤳ȤǤ롣
ˤäơѲǽʤ٤ƤΥե
ɤΥեɬפ뤫򲱤뤳ȤǤ
֤˽ (round robin) 뤳ȤǤ롣
ѲǽǤեǥץФ
ʸ˼륤٥Ȥ̵뤹뤳ȤǤ롣
.TP
.B o ٥ȥåȤäƤ
.PP
٥ȥåȤäƤ硢
ޤ
.BR epoll_wait (2)
֤줿ƤΥեǥץǼƤ硢
줿ȤưŪ˥ޡ
(ĤޤΥ٥Ȥνˤäƥޡ) ˡ󶡤٤Ǥ롣
.BR epoll_wait (2)
 100 ĤΥ٥Ȥꡢ
٥ #47 ǤϤǥ٥ #13 ĤȲꤹ롣
٥ #13 ι¤Τեǥץ
.BR close (2)
ȡ٥ȥåϤΥեǥץԤĥ٥Ȥ
¸ߤȤäơ𤬵롣
.PP
褹 1 Ĥˡϡ٥ 47 ν򤷤Ƥ֤ˡ
եǥץ 13 
.BR close (2)
뤿
.BR epoll_ctl ( EPOLL_CTL_DEL )
ƤӽФϢդ줿 data ¤ΤѤߤȥޡơ
꡼󥢥åץꥹȤ˥󥯤뤳ȤǤ롣
Хåǥեǥץ 13 ˤĤƤ
¾Υ٥Ȥ򸫤Ĥ硢
Υեǥץ˺줿ΤǤʬΤǡ
ϵʤ
.SH С
.B epoll
API  Linux ͥ 2.5.44 Ƴ줿
.\" 󥿥ե Linux ͥ 2.5.66 dzꤵ٤Ǥ롣
glibc ǤΥݡȤϥС 2.3.2 ɲä줿
.SH 
.B epoll
API  Linux ͭǤ롣
¾ΥƥǤƱͤε󶡤Ƥ礬롣
㤨СFreeBSD 
.I kqueue
 Solaris 
.I /dev/poll
ʤɤǤ롣
.SH Ϣ
.BR epoll_create (2),
.BR epoll_create1 (2),
.BR epoll_ctl (2),
.BR epoll_wait (2)