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

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

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

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ клиСнтского ΠΊΠ°Π½Π°Π»Π°, запись Π² Π½Π΅Π³ΠΎ ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π° Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда Π²Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ многочислСнныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поиска, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ мноТСство ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΈ Π·Π°Ρ‚Π΅ΠΌ снова Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Π½Π°Π».

ΠŸΡ€ΠΎΠΊΠ»Π°Π΄ΠΊΠ° ΠΊΠ°Π½Π°Π»ΠΎΠ²

1.Β Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΊΠ°Π½Π°Π» ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

int start_resp_to_client(const message_db_t mess_to_send) {

#if DEBUG_TRACE

Β printf("%d :- start_resp_to_client()\n", getpid());

#endif

Β (void)sprintf(client_pipe_name, CLIENT_PIPE,

Β  mess_to_send.client_pid);

Β if ((client_fd = open(client_pipe_name, O_WRONLY)) == -1) return(0);

Β return(1);

}

2. ВсС сообщСния ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ клиСнтскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ сообщСниС, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΠ·ΠΆΠ΅.

int send_resp_to_client(const message_db_t mess_to_send) {

Β int write_bytes;

#if DEBUG_TRACE

Β printf("%d :- send_resp_to_client()\n", getpid());

#endif

Β if (client_fd == -1) return(0);

Β write_bytes = write(client_fd, &mess_to_send, sizeof(mess_to_send));

Β if (write_bytes != sizeof(mess_to_send)) return(0);

Β return(1);

}

3.Β Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΡ€ΠΎΠΉΡ‚Π΅ клиСнтский ΠΊΠ°Π½Π°Π».

void end resp_to_client(void) {

#if DEBUG_TFACE

Β printf("%d :- end_resp_to_client()\n", getpid());

#endif

Β if (client_fd != -1) {

  (void)close(сlient_fd);

Β Β client_fd = -1;

Β }

}

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру β€” клиСнтскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ pipe_imp.c. Они ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° сСрвСрныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠ½Ρ‚Ρ€ΠΈΠ³ΡƒΡŽΡ‰ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ

send_mess_to_server
.

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

1. ПослС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ доступности сСрвСра функция

client_starting
ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°Π½Π°Π» клиСнтской стороны.

int client_starting(void) {

#if DEBUG_TFACE

Β printf("%d client_starting\n", getpid());

#endif

Β mypid = getpid();

Β if ((server_fd = open(SERVER_PIPE, O_WRONLY)) == -1) {

Β Β fprintf(stderr, "Server not running\n");

Β  return(0);

Β }

Β (void)sprintf(client pipe name, CLIENT_PIPE, mypid);

Β (void)unlink(client_pipe_name);

Β if (mkfifo(client_pipe_name, 0777) == -1) {

Β  fprintf(stderr, "Unable to create client pipe %s\n", client_pipe_name);

Β  return(0);

Β }

Β return(1);

}

2. Ѐункция

client_ending
Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ дСскрипторы ΠΈ удаляСт Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π».

void client_ending(void) {

#if DEBUG_TRACE

Β printf("%d client_ending()\n", getpid());

#endif

Β if (client_write_fd != -1) (void)close(client_write_fd);

Β if (client_fd != -1) (void)close(client_fd);

Β if (server_fd != -1) (void)close(server_fd);

Β (void)unlink(client_pipe_name);

}

3. Ѐункция

send_mess_to_server
ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ запрос Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°Π½Π°Π» сСрвСра.

int send_mess_to_server(message_db_t mess_to_send) {

Β int write_bytes;

#if DEBUG_TRACE

Β printf("%d send_mess_to_server()\n", getpid());

#endif

Β if (server_fd == -1) return(0);

Β mess_to_send.client_pid = mypid;

Β write_bytes = write(server_fd, &mess_to_send, sizeof(mess_to_send));

Β if (write_bytes != sizeof(mess_to_send)) return(0);

Β return(1);

}

Как ΠΈ Π² сСрвСрных функциях, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π°Π·Π°Π΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΡ‚ сСрвСра с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Ρ€Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… мноТСствСнныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ поисков.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² с сСрвСра

1. Данная клиСнтская функция запускаСтся для оТидания ΠΎΡ‚Π²Π΅Ρ‚Π° сСрвСра. Она ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°Π½Π°Π» ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΊΠ°Π½Π°Π»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для записи. Π§ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

int start_resp_from_server(void) {

#if DEBUG_TRACE

Β printf("%d :- start_resp_from_server()\n", getpid());

#endif

Β if (client_pipe_name[0] == '\0') return(0);

Β if (client_fd != -1) return(1);

Β client_fd = open(client_pipe_name, O_RDONLY);

Β if (client_fd != -1) {

Β  client_write_fd = open(client_pipe_name, O_WRONLY);

Β Β if (client_write_fd != -1) return(1);

Β Β (void)close(client_fd);

Β Β client_fd = -1;

Β }

Β return(0);

}