Категории
Самые читаемые
ChitatKnigi.com » 🟢Компьютеры и Интернет » Интернет » Основы программирования в Linux - Мэтью Нейл

Основы программирования в Linux - Мэтью Нейл

Читать онлайн Основы программирования в Linux - Мэтью Нейл
1 ... 239 240 241 242 243 244 245 246 247 ... 324
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
Интерпретатор клиента

1. В этом файле реализовано девять функций для работы с базой данных, объявленных в файле cd_data.h. Делает он это передачей запросов серверу и затем возвратом ответа сервера из функции, действуя как посредник. Файл начинается с файлов #include и констант.

#define _POSIX_SOURCE

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>

#include <limits.h>

#include <sys/types.h>

#include <sys/stat.h>

#include "cd_data.h"

#include "cliserv.h"

2. Статическая переменная mypid уменьшает количество вызовов getpid, требуемых в противном случае. Мы применяем локальную функцию read_one_response для устранения дублирующегося программного кода.

static pid_t mypid;

static int read_one_response(message_db_t *rec_ptr);

3. Подпрограммы database_initialize и close все еще вызываются, но теперь используются, соответственно, для инициализации клиентского интерфейса каналов и удаления лишних именованных каналов, когда клиент завершил выполнение.

int database_initialize(const int new_database) {

 if (!client_starting()) return(0);

 mypid = getpid();

 return(1);

}

/* инициализация базы данных */

void database_close(void) {

 client_ending();

}

4. Подпрограмма get_cdc_entry вызывается для получения элемента каталога из базы данных по заданному названию компакт-диска в каталоге. В ней вы кодируете запрос в структуре message_db_t и передаете его на сервер. Далее вы считываете обратно ответ в другую структуру типа message_db_t. Если элемент найден, он включается в структуру message_db_t как структура типа cdc_entry, поэтому вы можете передать соответствующую часть структуры.

cdc_entry get_cdc_entry(const char *cd_catalog_ptr) {

 cdc_entry ret_val;

 message_db_t mess_send;

 message_db_t mess_ret;

 ret_val.catalog[0] = '';

 mess_send.client_pid = mypid;

 mess_send.request = s_get_cdc_entry;

 strcpy(mess_send.cdc_entry_data.catalog, cd_catalog_ptr);

 if (send_mess_to_server(mess_send)) {

  if (read_one_response(&mess_ret)) {

   if (mess_ret.response == r_success) {

    ret_val = mess_ret.cdc_entry_data;

   } else {

    fprintf(stderr, "%s", mess_ret.error_text);

   }

  } else {

   fprintf(stderr, "Server failed to respondn");

  }

 } else {

  fprintf(stderr, "Server not accepting requestsn");

 }

 return(ret_val);

}

5. Далее приведен исходный текст функции read_one_response, которая используется для устранения дублирующегося программного кода.

static int read_one_response(message_db_t *rec_ptr) {

 int return_code = 0;

 if (!rec_ptr) return(0);

 if (start_resp_from_server()) {

  if (read_resp_from_server(rec_ptr)) {

   return_code = 1;

  }

  end_resp_from_server();

 }

 return(return_code);

}

6. Остальные подпрограммы get_xxx, del_xxx и add_xxx реализованы аналогично функции get_cdc_entry и приводятся здесь для полноты картины. Сначала функция для извлечения дорожек компакт-диска.

cdt_entry get_cdt_entry(const char *cd_catalog_ptr,

 const int track no) {

 cdt_entry ret_val;

 message_db_t mess_send;

 message_db_t mess_ret;

 ret_val.catalog[0] = '';

 mess_send.client_pid = mypid; mess_send.request = s_get_cdt_entry;

 strcpy(mess_send.cdt_entry_data.catalog, cd_catalog_ptr);

 mess_send.cdt_entry_data.track_no = track_no;

 if (send_mess_to_server(mess_send)) {

  if (read_one_response(&mess_ret)) {

   if (mess_ret.response == r_success) {

    ret_val = mess_ret.cdt_entry_data;

   } else {

    fprintf(stderr, "%s", mess_ret.error_text);

   }

  } else {

   fprintf(stderr, "Server failed to respondn");

  }

 } else {

1 ... 239 240 241 242 243 244 245 246 247 ... 324
Перейти на страницу:
Открыть боковую панель
Комментарии
Жанна
Жанна 27.07.2025 - 01:48
Люблю настоящих мужчин. Главный герой, именно такой.
Майя
Майя 25.07.2025 - 01:56
Благодарю за рассказ. Не растянуто и очень интересно
Руслана
Руслана 17.06.2025 - 12:59
Замечательные рекомендации по подбору персонала 👏
Елизавета
Елизавета 16.05.2025 - 16:36
Осилила только первую страницу, как можно вообще такую муть писать, не видела, случайно, в лифте, не узнала своего босса. Это же детский сад. Все как под копирку, еще застряли в лифте, случайно не