1.Β ΠΠ°ΡΠ½ΠΈΡΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²
include
ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΉ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅
inputs
Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π²ΠΎΠ΄Π° Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ:
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
Β char buffer[128];
Β int result, nread;
Β fd_set inputs, testfds;
Β struct timeval timeout;
Β FD_ZERO(&inputs);
Β FD_SET(0, &inputs);
2.Β ΠΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ Π²Π²ΠΎΠ΄ ΠΈΠ· ΡΠ°ΠΉΠ»Π° stdin Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 2,5 ΡΠ΅ΠΊΡΠ½Π΄:
Β while(1) {
Β testfds = inputs;
Β Β timeout.tv_sec = 2;
Β Β timeout.tv_usec = 500000;
Β result = select(FD_SETSIZE, &testfds, (fd_set *)NULL,
Β Β (fd_set*)NULL, &timeout);
3.Β Π‘ΠΏΡΡΡΡ ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅
result
. ΠΡΠ»ΠΈ Π²Π²ΠΎΠ΄Π° Π½Π΅ Π±ΡΠ»ΠΎ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΡΠΈΠΊΠ» Π΅ΡΠ΅ ΡΠ°Π·. ΠΡΠ»ΠΈ Π² Π½Π΅ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ:
Β switch(result) {
Β Β case 0:
Β Β printf("timeout\n");
Β Β break;
Β Β case -1:
Β Β perror("select");
Β Β exit(1);
4.Β ΠΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Ρ Π²Π°Ρ Π½Π°Π±Π»ΡΠ΄Π°ΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ, ΡΠΈΡΠ°ΠΉΡΠ΅ Π²Π²ΠΎΠ΄ ΠΈΠ· stdin ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΠ΅ Π΅Π³ΠΎ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π° EOL (ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠΎΠΊΠΈ), Π΄ΠΎ Π½Π°ΠΆΠ°ΡΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡ <Ctrl>+<D>:
Β default:
Β Β if (FD_ISSET(0, &testfds)) {
Β Β Β ioctl(0, FIONREAD, &nread);
Β Β Β if (nread == 0) {
Β Β Β Β printf("keyboard done\n");
Β Β Β Β exit(0);
Β Β Β }
Β Β Β nread = read(0, buffer, nread);
Β Β Β buffer[nread] = 0;
Β Β Β printf("read %d from keyboard: %s", nread, buffer);
Β Β }
Β Β break;
Β }
Β }
}
ΠΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠ°ΠΆΠ΄ΡΠ΅ Π΄Π²Π΅ Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΎΠΉ ΡΠ΅ΠΊΡΠ½Π΄Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΡΡΠΎΠΊΡ
timeout
. ΠΡΠ»ΠΈ Π²Ρ Π½Π°Π±ΠΈΡΠ°Π΅ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅, ΠΎΠ½Π° ΡΠΈΡΠ°Π΅Ρ ΡΠ°ΠΉΠ» ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π°Π±ΡΠ°Π½ΠΎ. Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ
ΠΎΠ±ΠΎΠ»ΠΎΡΠ΅ΠΊ Π²Π²ΠΎΠ΄ Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΊΠ»Π°Π²ΠΈΡΠΈ <Enter> (ΠΈΠ»ΠΈ <Return>) ΠΈΠ»ΠΈ ΠΊΠ»Π°Π²ΠΈΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π²Π²ΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΡΠ΅ ΠΊΠ»Π°Π²ΠΈΡΡ <Enter>. Π£ΡΡΠΈΡΠ΅, ΡΡΠΎ ΡΠ°ΠΌΠ° ΠΊΠ»Π°Π²ΠΈΡΠ° <Enter> ΡΠΎΠΆΠ΅ ΡΠΈΡΠ°Π΅ΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» (ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²Π²ΠΎΠ΄ Π±Π΅Π· Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠΈ, Π²Π²Π΅Π΄Ρ ΡΡΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², Π·Π° ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ <Ctrl>+<D>).
$ <b>./select</b>
timeout
<b>hello</b>
read 6 from keyboard: hello
<b>fred</b>
read 5 from keyboard: fred
timeout
<b>^D</b>
keyboard done
$
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Π²ΡΠ·ΠΎΠ²
select
Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°. ΠΠ° ΡΡΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²ΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠ°ΠΆΠ΄ΡΠ΅ 2,5 ΡΠ΅ΠΊΡΠ½Π΄Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. Π Π½Π΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΠ΅Π»ΡΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ 0 ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
select
. ΠΡΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΡΠ»Π°Π³ΠΎΠΌ ΠΊΠ°ΠΊ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΊ Π²Π²ΠΎΠ΄Ρ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ
Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ.
ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ
ΠΠ°ΡΠ° ΠΏΡΠΎΡΡΠ°Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΈΠ³ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
select
Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ
ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², Π½Π΅ ΠΏΡΠΈΠ±Π΅Π³Π°Ρ ΠΊ ΠΏΠΎΠΌΠΎΡΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΡΠ΅ΠΌ, ΡΡΠΎΠ±Ρ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½Π΅ ΠΆΠ΄Π°Π»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄ΠΎΠ»Π³ΠΎ, ΠΏΠΎΠΊΠ° Π²Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
Π‘Π΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ
select
ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΊ ΡΠΎΠΊΠ΅ΡΡ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠ΅ΠΌΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΈ ΠΊ ΡΠΎΠΊΠ΅ΡΠ°ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ
ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΠΊΡΠΎΡ
FD_ISSET
Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² ΡΠΈΠΊΠ»Π΅ Π²ΡΠ΅Ρ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΈ Π²ΡΡΠ²Π»Π΅Π½ΠΈΡ Π°ΠΊΡΠΈΠ²Π½ΡΡ
ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ
.
ΠΡΠ»ΠΈ ΡΠΎΠΊΠ΅Ρ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, Π³ΠΎΡΠΎΠ² ΠΊ Π²Π²ΠΎΠ΄Ρ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
accept
Π±Π΅Π· ΡΠΈΡΠΊΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΡ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΡΡ Π·Π°ΠΏΡΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΆΠ΄ΡΡΠΈΠΉ, ΡΡΠΎ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ. Π§ΡΠ΅Π½ΠΈΠ΅ 0 Π±Π°ΠΉΡΠΎΠ² ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ, ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΊΡΡΡΡ ΡΠΎΠΊΠ΅Ρ ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ Π΅Π³ΠΎ ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΡΠ²ΠΎΠΈΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ².
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.9.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 15.9. Π£Π»ΡΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
1.Β Π ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ server5.Ρ Π²Ρ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ sys/time.h ΠΈ sys/ioctl.h Π²ΠΌΠ΅ΡΡΠΎ signal.h, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΈ ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ
select
:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>