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

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

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

<i>Β memset(buffer, '\0', sizeof(buffer));</i>

<i>Β printf(&quot;Process %d opening FIFO O_RDONLY\n&quot;, getpid());</i>

<i>Β pipe_fd = open(FIFO_NAME, open_mode);Β </i>

<i> printf(&quot;PrосСss %d result %d\n&quot;, getpid(), pipe_fd);</i>

<i>Β if (pipe_fd != -1) {</i>

<i>Β  do {</i>

<i>Β Β Β res = read(pipe_fd, buffer,BUFFER_SIZE);</i>

<i>Β Β  bytes_read += res;</i>

<i>Β  } while (res &gt; 0);</i>

<i>Β  (void)close(pipe_fd);</i>

<i>Β } else {</i>

<i>Β Β exit(EXIT_FAILURE);</i>

<i>Β }</i>

<i>Β printf(&quot;Process %d finished, %d bytes read\n&quot;, getpid(), bytes_read);</i>

Β exit(EXIT_SUCCESS);

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ эти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, с использованиСм ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

time
для Ρ…Ρ€ΠΎΠ½ΠΎΠΌΠ΅Ρ‚Ρ€Π°ΠΆΠ° Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ (с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ пропусками для краткости) Π²Ρ‹Π²ΠΎΠ΄:

$ <b>./fifo3 &amp;</b>

[1] 375

Process 375 opening FIFO O_WRONLY

$ <b>time ./fifo4</b>

Process 377 opening FIFO O_RDONLY

Process 375 result 3

Process 377 result 3

Process 375 finished

Process 377 finished, 10485760 bytes read

realΒ 0m0.053s

userΒ 0m0.020s

sysΒ  0m0.040s

[1]+Β DoneΒ Β  ./fifo3

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

ОбС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ FIFO Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π’Ρ‹ запускаСтС ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ fifo3 (ΠΏΠΈΡˆΡƒΡ‰ΠΈΠΉ процСсс/поставщик), которая блокируСтся, оТидая, ΠΊΠΎΠ³Π΄Π° Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ процСсс ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΊΠ°Π½Π°Π» FIFO. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° fifo4 (ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ) запускаСтся, ΠΏΠΈΡˆΡƒΡ‰ΠΈΠΉ процСсс разблокируСтся ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠ°Π½Π°Π». Π’ это ΠΆΠ΅ врСмя Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ процСсс Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ОБ Linux Ρ‚Π°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… процСссов, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ³ΡƒΡ‚, ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΈΡˆΡƒΡ‰ΠΈΠΉ процСсс блокируСтся, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°Π½Π°Π» ΠΏΠΎΠ»ΠΎΠ½, Π° Ρ‡ΠΈΡ‚Π°ΡŽΡ‰ΠΈΠΉ β€” ΠΊΠΎΠ³Π΄Π° ΠΊΠ°Π½Π°Π» пуст.

Π’Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

time
ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΌΡƒ процСссу ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС ΠΎΠ΄Π½ΠΎΠΉ дСсятой сСкунды для считывания 10 ΠœΠ±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… Π² процСсс. Π­Ρ‚ΠΎ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°Π½Π°Π»Ρ‹, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΈΡ… рСализация Π² соврСмСнных вСрсиях Linux, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ эффСктивным срСдством ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ.

Π‘ΠΎΠ»Π΅Π΅ слоТная Ρ‚Π΅ΠΌΠ°: ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»ΠΎΠ² FIFO Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных прилоТСниях

Заканчивая обсуТдСниС ΠΊΠ°Π½Π°Π»ΠΎΠ² FIFO, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ построСния ΠΎΡ‡Π΅Π½ΡŒ простого ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного прилоТСния, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹. Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄ΠΈΠ½ сСрвСрный процСсс ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» запросы, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π» ΠΈΡ… ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ сторонС β€” ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ мноТСствСнным клиСнтским процСссам ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ сСрвСру. Для простоты ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° Π±Π»ΠΎΠΊΠΈ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСньшС

PIPE_BUF
Π±Π°ΠΉΡ‚ΠΎΠ². ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ систСму ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами, Π½ΠΎ ΠΌΡ‹ рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½, ΠΊΠ°ΠΊ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ примСнСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ².

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, каТСтся Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π» FIFO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ читаСтся сСрвСром ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ всё ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹. Если ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ FIFO Π² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, сСрвСр ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈ нСобходимости Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС. Π’Π°ΠΌ придСтся ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°Π½Π°Π» для Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄ΠΈΠ½ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ (PID) процСсса-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² исходных Π΄Π°Π½Π½Ρ‹Ρ…, отправляСмых Π½Π° сСрвСр, ΠΎΠ±Π΅ стороны смогут ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»Π° с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.13.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 13.13. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного прилоТСния

1.Β ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» client.h, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ±Ρ‰ΠΈΠ΅ для сСрвСрных ΠΈ клиСнтских ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ для удобства Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ систСмныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

#include &lt;string.h&gt;

#include &lt;fcntl.h&gt;

#include &lt;limits.h&gt;

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

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

#define SERVER_FIFO_NAME &quot;/tmp/serv_fifo&quot;

#define CLIENT_FIFO_NAME &quot;/tmp/cli_%d_fifo&quot;

#define BUFFER_SIZE 20

struct data_to_pass_st {

Β pid_t client_pid;

Β char some_data[BUFFER_SIZE - 1];

};

2.Β Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ server.c. Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ создаСтС ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΊΠ°Π½Π°Π» сСрвСра. Он задаСтся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния" ΠΈ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. ПослС засыпания (ΠΈΠ· дСмонстрационных сообраТСний) сСрвСр Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ структура Ρ‚ΠΈΠΏΠ°

data_to_pass_st
.

#include &quot;client.h&quot;

#include &lt;ctype.h&gt;

int main() {

Β int server_fifo_fd, client fifo_fd;

Β struct data_to_pass_st my_data;

Β int read_res;

Β char client_fifo[256];

Β char *tmp_char_ptr;

Β mkfifo(SERVER_FIFO_NAME, 0777);

Β server_fifo_fd = open(SERVER_FIFO_NAME, O_RDONLY);