Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

fprintf(stderr, "Server not accepting requests\n");

 }

 return(0);

}

int del_cdt_entry(const char *cd_catalog_ptr, const int track no) {

 message_db_t mess_send;

 message_db_t mess_ret;

 mess_send.client_pid = mypid;

 mess_send.request = s_del_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) {

return(1);

} else {

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

}

} else {

fprintf(stderr, "Server failed to respond\n");

}

 } else {

fprintf(stderr, "Server not accepting requests\n");

 }

 return(0);

}

Поиск
в базе данных

Функция поиска по ключу компакт-диска сложнее. Пользователь этой функции рассчитывает вызвать ее один раз для начала поиска. Мы удовлетворили его ожидания в главе 7, задавая параметр

*first_call_ptr
равным
true
при первом вызове функции, и функция в этом случае возвращает первое найденное совпадение. При последующих вызовах функции поиска указатель
*first_call_ptr
равен
false
и возвращаются дальнейшие совпадения, по одному на каждый вызов.

Теперь, когда вы разделили приложение на два процесса, нельзя разрешать поиску обрабатывать по одному элементу на сервере, потому что другой клиент может запросить у сервера иной поиск, когда выполняется ваш поиск. Вы не можете заставить серверную часть хранить отдельно содержимое (как далеко продвинулся поиск) для поиска каждого клиента, т.к. клиент может просто остановить поиск на полпути, когда найден нужный компакт-диск или клиент "упал".

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

1. Эта функция не так сложна, как кажется, просто в ней вызываются три функции канала

send_mess_to_server
,
start_resp_from_server
и 
read_resp_fromserver
, которые будут рассмотрены в следующем разделе.

cdc_entry search_cdc_entry(const char *cd_catalog_ptr,

 int *first_call_ptr) {

 message_db_t mess_send;

 message_db_t mess_ret;

 static FILE *work_file = (FILE *)0;

 static int entries_matching = 0;

 cdc_entry ret_val;

 ret_val.catalog[0] = '\0';

 if (!work_file && (*first_call_ptr == 0)) return(ret_val);

2. Далее

показан первый вызов для поиска с указателем
*first_call_ptr
, равным
true
. Он немедленно приравнивается
false
, на случай, если вы забыли. Создается временный файл
work_file
и инициализируется структура сообщения клиенту.

if (*first_call_ptr) {

 *first_call_ptr = 0;

 if (work_file) fclose(work_file);

 work_file = tmpfile;

 if (!work_file) return(ret_val);

 mess_send.client_pid = mypid;

 mess_send.request = s_find_cdc_entry;

 strcpy(mess_send.cdc_entry_data.catalog, cd_catalog_ptr);

3. Теперь приводится проверка условий с тремя уровнями вложенности, заставляющая вызывать функции из файла pipe_imp.c. Если сообщение успешно отправлено на сервер, клиент ждет ответа от сервера. Пока считывания с сервера успешны, совпадения с искомой величиной возвращаются в

work_file
клиента и наращивается счетчик entries_matching.

 if (send_mess_to_server(mess_send)) {

if (start_resp_from_server) {

while (read_resp_from_server(&mess_ret)) {

if (mess_ret.response == r_success) {

fwrite(&mess_ret.cdc_entry_data, sizeof(cdc_entry), 1, work_file);

entries_matching++;

} else {

break;

}

} /* while */

} else {

fprintf(stderr, "Server not responding\n");

}

 } else {

fprintf (stderr, "Server not accepting requests\n");

 }

4. Следующая проверка ищет, есть ли совпадения с заданным значением. Далее вызов

fseek
переводит указатель в файле
work_file
на место записи следующей порции данных.

 if (entries_matching == 0) {

fclose(work_file);

work_file = (FILE *)0;

return(ret_val);

 }

 (void)fseek(work_file, 0L, SEEK_SET);

5. Если это не первый вызов функции поиска для данного конкретного элемента, программа проверяет, были ли уже найдены совпадения. В заключение в структуру

ret_val
читается следующий совпадающий элемент. Предшествующие проверки гарантируют наличие совпадающего элемента.

Поделиться:
Популярные книги

Покер для даймонов. Тетралогия

Бульба Наталья Владимировна
107. В одном томе
Фантастика:
фэнтези
8.55
рейтинг книги
Покер для даймонов. Тетралогия

"Господин мертвец"

Соловьев Константин Сергеевич
2. Господа Магильеры
Фантастика:
боевая фантастика
5.00
рейтинг книги
Господин мертвец

Потемкин

Елисеева Ольга Игоревна
916. Жизнь замечательных людей
Проза:
историческая проза
5.00
рейтинг книги
Потемкин

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.50
рейтинг книги
Воронцов. Перезагрузка

Последний рейд

Сай Ярослав
5. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Последний рейд

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Играть... в тебя

Маленькая женщина Большого

Зайцева Мария
5. Наша
Любовные романы:
эро литература
современные любовные романы
5.40
рейтинг книги
Маленькая женщина Большого

Булгаков

Варламов Алексей Николаевич
Проза:
историческая проза
современная проза
повесть
5.00
рейтинг книги
Булгаков

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Стихотворения 1906-1941

Цветаева Марина Ивановна
Поэзия:
поэзия
5.00
рейтинг книги
Стихотворения 1906-1941

Я до сих пор не царь. Книга XXVII

Дрейк Сириус
27. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я до сих пор не царь. Книга XXVII

Кодекс Охотника. Книга XXXIV

Винокуров Юрий
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV

Корона Тафелона

Авербух Наталья Владимировна
3. Ведьмина дорога
Фантастика:
фэнтези
5.00
рейтинг книги
Корона Тафелона