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

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

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

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

    close(client_fifo_fd);

   }

  }

 } while (read_res > 0);

 close(server_fifo_fd);

 unlink(SERVER_FIFO_NAME);

 exit(EXIT_SUCCESS);

}

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

#include "client.h"

#include <ctype.h>


int main() {

 int server_fifo_fd, client_fifo_fd;

 struct data_to_pass_st my_data;

 int times_to_send;

 char client_fifo[256];

 server_fifo_fd = open(SERVER_FIFO_NAME, O_WRONLY);

 if (server_fifo_fd == -1) {

  fprintf (stderr, "Sorry, no server\n");

  exit(EXIT_FAILURE);

 }

 my_data.client_pid = getpid();

 sprintf(client_fifo, CLIENT_FIFO_NAME, my_data.client_pid);

 if (mkfifo(client_fifo, 0777) == -1) {

  fprintf(stderr, "Sorry, can't make %s\n", client_fifo);

  exit(EXIT_FAILURE);

 }

6. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· пяти ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² Ρ†ΠΈΠΊΠ»Π° клиСнтскиС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° сСрвСр. Π”Π°Π»Π΅Π΅ клиСнтский FIFO открываСтся (Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния" с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ) ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π’ ΠΊΠΎΠ½Ρ†Π΅ сСрвСрный FIFO закрываСтся, Π° клиСнтский FIFO удаляСтся ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы.

 for (times_to_send = 0; times_to_send < 5; times_to_send++) {

  sprintf(my_data.some_data, "Hello from %d", my_data.client_pid);

  printf("%d sent %s, ", my_data.client_pid, my_data.some_data);

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

  client_fifo_fd = open(client_fifo, O_RDONLY);

  if (client_fifo_fd != -1) {

   if (read(client_fifo_fd, &my_data, sizeof(my_data)) > 0) {

    printf("received: %s\n", my_data.some_data);

   }

   close(client_fifo_fd);

  }

 }

 close(server_fifo_fd);

 unlink(client_fifo);

 exit(EXIT_SUCCESS);

}

Для тСстирования этого прилоТСния Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ копию сСрвСра ΠΈ нСсколько ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ врСмя, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ.

$ ./server &

$ for i in 1 2 3 4 5

do

./client &

done

$

Они Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ сСрвСрный процСсс ΠΈ ΠΏΡΡ‚ΡŒ клиСнтских. Π’Ρ‹Π²ΠΎΠ΄ клиСнтских ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для краткости, выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

531 sent Hello from 531, received: HELLO FROM 531

532 sent Hello from 532, received: HELLO FROM 532

529 sent Hello from 529, received: HELLO FROM 529

530 sent Hello from 530, received: HELLO FROM 530

531 sent Hello from 531, received: HELLO FROM 531

532 sent Hello from 532, received: HELLO FROM 532

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°, запросы Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΠΆΠ°ΡŽΡ‚ΡΡ, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ запросов, Ρ‚.ΠΊ. порядок получСния клиСнтских запросов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΊ машинС ΠΈ Π΄Π°ΠΆΠ΅ Π² Ρ€Π°Π·Π½Ρ‹Ρ… сСансах Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС.

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ обсудим ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ клиСнтских ΠΈ сСрвСрных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²ΠΎ взаимодСйствии, Ρ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€.

Π‘Π΅Ρ€Π²Π΅Ρ€ создаСт свой ΠΊΠ°Π½Π°Π» FIFO Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅" ΠΈ блокируСтся. Он Π΄Π΅Π»Π°Π΅Ρ‚ это Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ клиСнтский процСсс Π½Π΅ подсоСдинится, ΠΎΡ‚ΠΊΡ€Ρ‹Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ FIFO для записи. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ сСрвСрный процСсс разблокируСтся ΠΈ выполняСтся Π²Ρ‹Π·ΠΎΠ² sleep, поэтому Π²Ρ‹Π·ΠΎΠ²Ρ‹ write ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. (Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ² sleep ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½, ΠΌΡ‹ примСняСм Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с мноТСствСнными ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.)

ΠœΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ клиСнтский процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π» сСрвСрный ΠΊΠ°Π½Π°Π» FIFO, ΠΎΠ½ создаСт собствСнный FIFO с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ для считывания Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра. Волько послС этого ΠΊΠ»ΠΈΠ΅Π½Ρ‚ записываСт Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° сСрвСр (ΠΏΡ€ΠΈΡ‡Π΅ΠΌ, Ссли ΠΊΠ°Π½Π°Π» ΠΏΠΎΠ»ΠΎΠ½ ΠΈΠ»ΠΈ сСрвСр всС Π΅Ρ‰Π΅ спит, клиСнтская ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° блокируСтся) ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ для Π²Ρ‹Π·ΠΎΠ²Π° read свой собствСнный ΠΊΠ°Π½Π°Π» FIFO, оТидая ΠΎΡ‚Π²Π΅Ρ‚Π°.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, сСрвСр ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ…, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ клиСнтский ΠΊΠ°Π½Π°Π» для записи ΠΈ записываСт Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ снимаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ клиСнтского процСсса. Когда ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· своСго ΠΊΠ°Π½Π°Π»Π° Π΄Π°Π½Π½Ρ‹Π΅, записанныС Ρ‚ΡƒΠ΄Π° сСрвСром.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ повторяСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° послСдний ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΊΠ°Π½Π°Π» сСрвСра, вызывая Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ сСрвСрного Π²Ρ‹Π·ΠΎΠ²Π° read (Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ 0), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½ΠΈ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π½Π΅Ρ‚ сСрвСрного ΠΊΠ°Π½Π°Π»Π°, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ для записи. Если Π±Ρ‹ это Π±Ρ‹Π» Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСрный процСсс, Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Π²Ρ‹Π±Ρ€Π°Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ…:

β–‘ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор собствСнного сСрвСрного ΠΊΠ°Π½Π°Π»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·ΠΎΠ² read всСгда Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π», Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» 0;

β–‘ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ сСрвСрный ΠΊΠ°Π½Π°Π», ΠΊΠΎΠ³Π΄Π° read Π²Π΅Ρ€Π½Π΅Ρ‚ 0 Π±Π°ΠΉΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвСрный процСсс блокировался Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ open, оТидая ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠ½ это Π΄Π΅Π»Π°Π», стартуя ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·.

Оба эти ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² Π½ΠΎΠ²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ прилоТСния для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, зная, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ простой ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрной систСмы, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Π’Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² Π½Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сигналов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠΈΠ΅ дСйствия ΠΏΠΎ навСдСнию порядка ΠΏΡ€ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ процСсса. Π‘ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ ранняя вСрсия прилоТСния с dbm ΠΈ интСрфСйсом ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π» максимально простым ΠΈ понятным.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ эту Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Если Π²Ρ‹ взяли исходный ΠΊΠΎΠ΄ с Web-сайта, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ make-Ρ„Π°ΠΉΠ» для Π΅Π³ΠΎ компиляции ΠΈ получСния сСрвСрной ΠΈ клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

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

Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π½Π΅Π΅ Π² Π³Π»Π°Π²Π΅ 7, Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… дистрибутивах Ρ„Π°ΠΉΠ»Ρ‹ dbm ΠΈΠΌΠ΅Π½ΡƒΡŽΡ‚ΡΡ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Если прСдоставлСнныС Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² вашСм дистрибутивС, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π³Π»Π°Π²Π΅ 7 ΠΈ ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ свСдСния ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ… ΠΈ мСстонахоТдСнии Ρ„Π°ΠΉΠ»ΠΎΠ² dbm.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ server -i позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков.

НСт Π½ΡƒΠΆΠ΄Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ выполнится, ΠΏΠΎΠΊΠ° сСрвСр Π½Π΅ установится ΠΈ Π½Π΅ запустится. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ make-Ρ„Π°ΠΉΠ», ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠΎΠ²ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

all: server client

CC=cc

CFLAGS= -pedantic -Wall

# Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Π·Π½Π°ΠΊ коммСнтария Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС

# DFLAGS=-DDEBUG_TRACE=1 -g

# Π“Π΄Π΅ ΠΈ ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ dbm ΠΌΡ‹ примСняСм.

# ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ gdbm прСдустановлСна Π² стандартном мСстС, Π½ΠΎ ΠΌΡ‹

# собираСмся ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, совмСстимыС с gdbrn, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅

# Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π΅Π΅ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ndbm. ДСлаСтся это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ndbm β€” 'самая

# стандартная' ΠΈΠ· вСрсий dbm. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ потрСбуСтся внСсти измСнСния

# Π² соотвСтствии с вашим дистрибутивом.

DBM_INC_PATH=/usr/include/gdbm

DBM_LIB_PATH=/usr/lib

DBM_LIB_FILE=-lgdbm

# Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… дистрибутивах ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ

# строку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ совмСстимости, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»Π΅Π΅.

# DBM_LIB_FILE=-lgdbm_compat -lgdbm


.с.о:

 $(CC) $(CFLAGS) -I$(DBM_INC_PATH) $(DFLAGS) -с $<


app_ui.o: app_ui.c cd_data.h

cd_dbm.o: cd_dbm.c cd_data.h

client_f.o: client_f.c cd_data.h cliserv.h

pipe_imp.o: pipe_imp.c cd_data.h cliserv.h

server.о: server.с cd_data.h cliserv.h

client: app_ui.o clientif.o pipe_imp.o

 $(CC) -o client $(DFLAGS) app_ui.ΠΎ clientif.o pipe_imp.o


server: server.ΠΎ cd_dbm.o pipe_imp.o

 $(CC) -o server -L$(DBM_LIB_PATH) $(DFLAGS) server.ΠΎ cd_dbm.o pipe_imp.o -l$(DBM_LIB_FILE)


clean:

 rm -f server client_app *.o *~

Π¦Π΅Π»ΠΈ

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

Для простоты Ρƒ вас Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ (ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ) ΠΊΠ°Π½Π°Π»Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния, Π½Π΅ заставляя администратора систСмы ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ смоТСтС ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ.