Основы программирования в 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:
Поделиться:
Популярные книги
Вернуть невесту. Ловушка для попаданки
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Наследник
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Путешественник по Изнанке
4. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
попаданцы
мистика
5.00
рейтинг книги
Барон диктует правила
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ненаглядная жена его светлости
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Император Пограничья 10
10. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Санек
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Меченный смертью. Том 2
2. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Надуй щеки! Том 4
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00
рейтинг книги
Двойник короля 19
19. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Дважды одаренный. Том II
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Черный Маг Императора 11
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 12
12. Токийский лекарь
Фантастика:
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Я еще граф. Книга #8
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00