Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Можно либо изменить алгоритм поиска, либо, как показано в приведенном далее программном коде, спрятать сложность в подпрограмме интерфейса. Данный код вынуждает сервер возвращать все возможные совпадения с искомым значением и затем сохраняет их во временном файле до тех пор, пока клиент не запросит их.
1. Эта функция не так сложна, как кажется, просто в ней вызываются три функции канала
send_mess_to_serverstart_resp_from_serverread_resp_fromservercdc_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] = ' '; if (!work_file && (*first_call_ptr == 0)) return(ret_val);2. Далее показан первый вызов для поиска с указателем
*first_call_ptrtruefalsework_fileif (*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 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 respondingn"); } } else { fprintf (stderr, "Server not accepting requestsn"); }4. Следующая проверка ищет, есть ли совпадения с заданным значением. Далее вызов
fseekwork_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 } else { /* не *first_call_ptr */ if (entries_matching == 0) { fclose(work_file); work_file = (FILE *)0; return(ret_val); } } fread(&ret_val, sizeof(cdc_entry), 1, work_file); entries_matching--; return(ret_val);}Интерфейс сервера server.c
Если у клиента есть интерфейс для обращения к программе app_ui.c, серверу также нужна программа для управления (переименованной) программой cd_access.c, теперь cd_dbm.c. Далее приведена функция main сервера.
1. Начните с объявления нескольких глобальных переменных, прототипа функции
process_command#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <limits.h>#include <signal.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include "cd_data.h"#include "cliserv.h"int save errno;static int server_running = 1;static void process_command(const message_db_t mess_command);void catch_signals() { server_running = 0;}2. Теперь переходите к функции
main-idatabase_initializeprocess_command
