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

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

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

int del_cdt_entry(const char *cd_catalog_ptr, const int track_no);

cdc_entry search_cdc_entry(const char *cd_catalog_ptr,

Β int *first_call_ptr);

Π’ этих функциях ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ провСсти Ρ€Π΅Π·ΠΊΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром.

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ процСсса Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ части (рис. 13.6), нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ Сдиная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°.

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image044.jpg

Рис. 13.6 

Π’ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-ΡΠ΅Ρ€Π²Π΅Ρ€Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ прилоТСния Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСсколько ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для связи Π΄Π²ΡƒΡ… основных частСй прилоТСния. На рис. 13.7 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° нСобходимая структура.

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image045.jpg

Рис. 13.7 

Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ интСрфСйса ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΈ сСрвСра ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» pipe_imp.c. Π­Ρ‚ΠΎ сохраняСт Π² Π΅Π΄ΠΈΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ вСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, зависящий ΠΎΡ‚ примСнСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… хранятся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρƒ вас появятся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ с Π±ΠΎΠ»Π΅Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° рис. 13.8.

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image046.jpg

Рис. 13.8 

Π€Π°ΠΉΠ»Ρ‹ Π°Ρ€Ρ€_ui.c, client_if.c ΠΈ pipe_imp.c ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΒ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΡŽΡ‚ΡΡ вмСстС для получСния клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π€Π°ΠΉΠ»Ρ‹ cd_dbm.c, server.c ΠΈ pipe_imp.c ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΡŽΡ‚ΡΡ вмСстС для создания сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» cliserv.h дСйствуСт ΠΊΠ°ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ для связывания ΠΎΠ±Π΅ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π’ Ρ„Π°ΠΉΠ»Ρ‹ app_ui.c ΠΈ cd_dbm.c внСсСны ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ измСнСния, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ большоС ΠΈ сущСствСнная Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π΅ измСнилась ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсиСй, здСсь ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ cliserv.h, сlient_if.c ΠΈ pipe_imp.c.

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» cliserv.h

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим cliserv.h. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» опрСдСляСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрный интСрфСйс. Он Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈ клиСнтской, ΠΈ сСрвСрной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ.

1.Β Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹

#include
.

#include <unistd.h>

#include <stdlib.h>

#includeΒ <stdio.h>

#includeΒ <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

2.Β Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ опрСдСляСтС ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π» для сСрвСра ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько, клиСнтская ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса Π² имя, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, обСспСчивая ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°Π½Π°Π»Π°.

#define SERVER_PIPE "/tmp/server_pipe"

#define CLIENT_PIPE "/tmp/client_%d_pipe"

#define ERR_TEXT_LEN 80

3.Β Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊΠ°ΠΊ пСрСчислимыС Ρ‚ΠΈΠΏΡ‹, Π° Π½Π΅ ΠΊΠ°ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹

#define
.

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

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

#define
.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€

typedef
Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ запроса, отправляСмого Π½Π° сСрвСр; Π²Ρ‚ΠΎΡ€ΠΎΠΉ описываСт Ρ‚ΠΈΠΏ сСрвСрного ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

typedef enum {

Β s_create_new_database = 0,

Β s_get_cdc_entry,

Β s_get_cdt_entry,

Β s_add_cdc_entry,

Β s_add_cdt_entry,

Β s_del_cdc_entry,

Β s_del_cdt_entry,

Β s_fmd_cdc_entry

} client_request_e;

typedef enum {

Β r_success = 0,

Β r_failure,

Β r_find_no_more

} server_response_e;

4.Β Π”Π°Π»Π΅Π΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ структуру, которая Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСниС, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя процСссами Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях.

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° самом Π΄Π΅Π»Π΅ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ

cdc_entry
ΠΈ
cdt_entry
Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π΅, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… объСдинСниСм (union). Но для простоты ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ элСмСнтами, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² этом случаС Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄.

typedef struct {

Β pid_tΒ client_pid;

Β client_request_eΒ request;

Β server_response_eΒ response;

Β cdc_entryΒ cdc_entry_data;

Β cdt_entry cdt_entry_data;

Β charΒ error_text[ERR_TEXT_LEN + 1];

} message_db_t;

5.Β Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ интСрфСйса ΠΊΠ°Π½Π°Π»Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ содСрТащиСся Π² Ρ„Π°ΠΉΠ»Π΅ pipe_imp.c. Они дСлятся Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСрвСрной ΠΈ клиСнтской стороны, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π±Π»ΠΎΠΊΠ°Ρ… соотвСтствСнно.

int server_starting(void);

void server_ending(void);

int read_request_from_client(message_db_t *rec_ptr);

int start_resp_to_client(const message_db_t mess_to_send);

int send_resp_to_client(const message_db_t mess_to_send);

void end_resp_to_client(void);

int client_starting(void);

void client_ending(void);

int send_mess_to_server(message_db_t mess_to_send);

int start_resp_from_server(void);

int read_resp_from_server(message_db_t *rec_ptr);

void end_resp_from_server(void);

ΠœΡ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ обсуТдСниС Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ клиСнтского интСрфСйса ΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ сСрвСрных ΠΈ клиСнтских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, хранящихся Π² Ρ„Π°ΠΉΠ»Π΅ pipe_imp.c, ΠΈ ΠΏΡ€ΠΈ нСобходимости Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ исходному ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ интСрфСйса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

Рассмотрим Ρ„Π°ΠΉΠ» clientif.c. Он прСдоставляСт "ΠΏΠΎΠ΄Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅" вСрсии ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ доступа ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Они ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ запрос Π² структурС

message_db_t
ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° pipe_imp.c для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ запроса сСрвСру. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ внСсти ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния Π² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» app_ui.c.