Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 275

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

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, &amp;testfds)) {

Β Β  Β ioctl(0, FIONREAD, &amp;nread);

Β Β  Β if (nread == 0) {

Β Β Β Β  printf(&quot;keyboard done\n&quot;);

Β Β Β  Β exit(0);

Β Β Β  }

Β Β Β  nread = read(0, buffer, nread);

Β Β  Β buffer[nread] = 0;

Β Β Β  printf(&quot;read %d from keyboard: %s&quot;, 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 &lt;sys/types.h&gt;

#include &lt;sys/socket.h&gt;

#include &lt;stdio.h&gt;

#include &lt;netinet/in.h&gt;

#include &lt;sys/time.h&gt;

#include &lt;sys/ioctl.h&gt;

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;