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

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

Жанры

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

 } 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
. После проверки успешного завершения подпрограмм захвата сигнала программа проверяет, передали ли вы
– i
в командной строке. Если да, она создаст новую базу данных. Если вызов подпрограммы
database_initialize
в файле cd_dbm.c завершится аварийно, будет выведено сообщение об ошибке. Если все хорошо и сервер работает, любые запросы от клиента направляются функции
process_command
, которую вы вскоре увидите.

int main(int argc, char *argv[]) {

 struct sigaction new_action, old_action;

 message_db_t mess command;

 int database_init_type = 0;

 new_action.sa_handler = catch_signals;

 sigemptyset(&new_action.sa_mask);

 new_action.sa_flags = 0;

 if ((sigaction(SIGINT, &new_action, &old_action) != 0) ||

(sigaction(SIGHUP, &new_action, &old_action) != 0) ||

(sigaction(SIGTERM, &new_action, &old_action) != 0)) {

fprintf(stderr, "Server startup error, signal catching failed\n");

exit(EXIT_FAILURE);

 }

 if (argc > 1) {

argv++;

if (strncmp("-i", *argv, 2) == 0) database_init_type = 1;

 }

 if (!database_initialize(database_init_type)) {

fprintf(stderr, "Server error :-\

could not initialize database\n");

exit (EXIT_FAILURE);

 }

 if (!server starting) exit(EXIT_FAILURE);

 while(server_running) {

if (read_request_from_client(&mess_command)) {

process_command(mess_command);

} else {

if (server_running) fprintf(stderr,

"Server ended — can not read pipe\n");

server_running = 0;

}

 } /* while */

 server_ending;

 exit(EXIT_SUCCESS);

}

3. Любые

сообщения клиентов направляются в функцию
process_command
, где они обрабатываются в операторе
case
, который выполняет соответствующие вызовы из файла cd_dbm.c.

static void process_command(const message_db_t comm) {

 message_db_t resp;

 int first_time = 1;

 resp = comm; /* копирует команду обратно,

затем изменяет resp, как требовалось */

 if (!start_resp_to_client(resp)) {

fprintf(stderr, "Server Warning:

start_resp_to_client %d failed\n", resp.client_pid);

return;

 }

 resp.response = r_success;

 memset(resp.error_text, '\0', sizeof(resp.error_text));

 save_errno = 0;

 switch(resp.request) {

 case s_create_new_database:

if (!database initialize(1))

resp.response = r_failure;

break;

 case s_get_cdc_entry:

resp.cdc_entry_data =

get_cdc_entry(comm.cdc_entry_data.catalog);

break;

 case s_get_cdt_entry:

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

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Пропала, или Как влюбить в себя жену

Юнина Наталья
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Пропала, или Как влюбить в себя жену

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

И только смерть разлучит нас

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
И только смерть разлучит нас

Лорд Системы 4

Токсик Саша
4. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 4

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Гарем вне закона 18+

Тесленок Кирилл Геннадьевич
1. Гарем вне закона
Фантастика:
фэнтези
юмористическая фантастика
6.73
рейтинг книги
Гарем вне закона 18+

Возвращение Низвергнутого

Михайлов Дем Алексеевич
5. Изгой
Фантастика:
фэнтези
9.40
рейтинг книги
Возвращение Низвергнутого

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Месть за измену

Кофф Натализа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть за измену