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

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

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

1. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° β€” поставщик. Она создаСт ΠΊΠ°Π½Π°Π», Ссли трСбуСтся, ΠΈ Π·Π°Ρ‚Π΅ΠΌ записываСт Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС.

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ, нас Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ ΠΌΡ‹ Π½Π΅ бСспокоимся ΠΎΠ± ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΡ„Π΅Ρ€Π°, Π’ ΠΎΠ±ΠΎΠΈΡ… листингах Π·Π°Ρ‚Π΅Π½Π΅Π½Π½Ρ‹Π΅ строки содСрТат измСнСния, внСсСнныС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ fifo2.c ΠΏΠΎΠΌΠΈΠΌΠΎ удалСния ΠΊΠΎΠ΄Π° со всСми Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>


#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF

#define TEN_MEG (1024 * 1024 * 10)


int main() {

 int pipe_fd;

 int res;

 int open_mode = O_WRONLY;

 int bytes_sent = 0;

 char buffer[BUFFER_SIZE + 1];

 if (access(FIFO_NAME, F_OK) == -1) {

  res = mkfifo(FIFO_NAME, 0777);

  if (res != 0) {

   fprintf(stderr, "Could not create fifo %s\n", FIFO_NAME);

   exit(EXIT_FAILURE);

  }

 }

 printf("Process %d opening FIFO O_WRONLY\n", getpid());

 pipe_fd = open(FIFO_NAME, open_name);

 printf("Process %d result %d\n", getpid(), pipe_fd);

 if (pipe_fd != -1) {

  while (bytes_sent < TEN_MEG) {

   res = write(pipe_fd, buffer, BUFFER_SIZE);

   if (res == -1) {

    fprintf(stderr, "Write error on pipe\n);

    exit(EXIT_FAILURE);

   }

   bytes_sent += res;

  }

  (void)close(pipe_fd);

 } else {

  exit(EXIT_FAILURE);

 }

 printf("Process %d finished\n", getpid());

 exit(EXIT_SUCCESS);

}

2. Π’торая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ, Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅. Она Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΈ выбрасываСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° FIFO.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>


#define FIFO_NAME "/tmp/my_fifo"

#define BUFFER_SIZE PIPE_BUF


int main() {

 int pipe_fd;

 int res;

 int open_mode = O_RDONLY;

 char buffer[BUFFER_SIZE - 1];

 int bytes_read = 0;

 memset(buffer, '\0', sizeof(buffer));

 printf("Process %d opening FIFO O_RDONLY\n", getpid());

 pipe_fd = open(FIFO_NAME, open_mode); 

 printf("PrосСss %d result %d\n", getpid(), pipe_fd);

 if (pipe_fd != -1) {

  do {

   res = read(pipe_fd, buffer,BUFFER_SIZE);

   bytes_read += res;

  } while (res > 0);

  (void)close(pipe_fd);

 } else {

  exit(EXIT_FAILURE);

 }

 printf("Process %d finished, %d bytes read\n", getpid(), bytes_read);

 exit(EXIT_SUCCESS);

}

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

$ ./fifo3 &

[1] 375

Process 375 opening FIFO O_WRONLY

$ time ./fifo4

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 <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>


#define SERVER_FIFO_NAME "/tmp/serv_fifo"

#define CLIENT_FIFO_NAME "/tmp/cli_%d_fifo"

#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 "client.h"

#include <ctype.h>


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);

 if (server_fifo_fd == -1) {

  fprintf(stderr, "Server fifo failure\n");

  exit(EXIT_FAILURE);

 }

 sleep(10); /* для Ρ†Π΅Π»Π΅ΠΉ дСмонстрации Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ */

 do {

  read_res = read(server_fifo_fd, &my_data, sizeof(my_data));

  if (read res > 0) {

3. ΠΠ° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ этапС Π²Ρ‹ выполняСтС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚Π΅ всС символы Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² прописныС ΠΈ соСдиняСтС CLIENT_FIFO_NAME с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ client_pid.

   tmp_char_ptr = my_data.some_data;

   while (*tmp_char_ptr) {

    *tmp_char_ptr = toupper(* tmp_char_ptr);

    tmp_char_ptr++;

   }

   sprintf(client_fifo, CLIENT_FIFO_NAME, my_data.client_pid);

4. Π”Π°Π»Π΅Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°Π·Π°Π΄, ΠΎΡ‚ΠΊΡ€Ρ‹Π² ΠΊΠ°Π½Π°Π» клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для записи" ΠΈ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ сСрвСрный FIFO с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ закрытия Ρ„Π°ΠΉΠ»Π° ΠΈ отсоСдинСния FIFO.

   client_fifo_fd = open(client_fifo, O_WRONLY);

   if (client_fifo_fd ! = -1) {

    write(client_fifo_fd, &my_data, sizeof(my_data));

    close(client_fifo_fd);

   }

  }

 } while (read_res > 0);