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

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

Жанры

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

resp.cdt_entry_data =

get_cdt_entry(comm.cdt_entry_data.catalog,

comm.cdt_entry_data.track_no);

break;

 case s_add_cdc_entry:

if (!add_cdc_entry(comm.cdc_entry_data))

resp.response = r_failure;

break;

 case s_add_cdt_entry:

if (!add_cdt_entry(comm.cdt_entry_data))

resp.response = r_failure;

break;

 case s_del_cdc_entry:

if (!del_cdc_entry(comm.cdc_entry_data.catalog))

resp.response = r_failure;

break;

 case s_del_cdt_entry:

if (!del_cdt_entry(comm.cdt_entry_data.catalog,

comm.cdt_entry_data.track_no)) resp.response = r_failure;

break;

 case s_find_cdc_entry:

do {

resp.cdc_entry_data =

search_cdc_entry(comm.cdc_entry_data.catalog, &first_time);

if (resp.cdc_entry_data.catalog[0] != 0) {

resp.response = r_success;

if (!send_resp_to_client(resp)) {

fprintf(stderr,

"Server Warning:- failed to respond to %d\n", resp.client_pid);

break;

}

} else {

resp.response = r_find_no_more;

}

} while (resp.response == r_success);

break;

 default:

resp.response = r_failure;

break;

 } /* switch */

 sprintf(resp.error_text,

"Command failed:\n\t%s\n", strerror(save_errno));

 if (!send_resp_to_client(resp)) {

fprintf(stderr,

"Server Warning:- failed to respond to %d\n", resp.client_pid);

 }

 end_resp_to_client;

 return;

}

Прежде чем рассматривать действующую реализацию канала, давайте обсудим последовательность событий, которые должны произойти для передачи данных между клиентским и серверным процессами. На рис. 13.9 показан запуск обоих, и клиентского, и серверного, процессов, а также то, как они образуют петлю во время обработки команд и ответов.

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

Рис. 13.9 

Канал

Далее показан файл реализации канала pipe_imp.с, в котором содержатся клиентские и серверные функции.

Примечание

Как вы видели в главе 10, может быть определено символическое имя DEBUG_TRACE для того, чтобы показать последовательность вызовов, в которых клиентский и серверный процессы передают друг другу сообщения.

Заголовочный файл для реализации канала

1. Прежде всего, директивы

#include
:

#include "cd_data.h"

#include "cliserv.h"

2. Вы также определяете в файле программы несколько значений, нужных вам в разных функциях:

static int server_fd = -1;

static pid_t mypid = 0;

static char client_pipe_name[PATH_MAX + 1] = {'\0'};

static int client_fd = -1;

static int client_write_fd = -1;

Функции серверной стороны

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

Функции сервера

1. Подпрограмма

server_starting
создает именованный канал, из которого сервер будет считывать команды. Далее она открывает канал для чтения. Этот вызов
open
будет блокировать выполнение, пока клиент не откроет канал для записи. Используйте режим блокировки для того, чтобы сервер мог выполнить блокировку вызовов
read
в канале в ожидании отправляемых ему команд.

int server_starting(void) {

#if DEBUG_TRACE

 printf("%d server_starting\n", getpid);

#endif

 unlink(SERVER_PIPE);

 if (mkfifo(SERVER_PIPE, 0777) == -1) {

fprintf(stderr, "Server startup error, no FIFO created\n");

return(0);

 }

 if ((server_fd = open(SERVER_PIPE, O_RDONLY)) == -1) {

if (errno == EINTR) return(0);

fprintf(stderr, "Server startup error, no FIFO opened\n");

return(0);

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

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.43
рейтинг книги
Шайтан Иван 6

Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Твен Марк
Проза:
классическая проза
5.00
рейтинг книги
Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Газлайтер. Том 8

Володин Григорий Григорьевич
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Гримуар темного лорда VII

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Палач

Зайцев Сергей Григорьевич
4. Викс
Фантастика:
фэнтези
7.27
рейтинг книги
Палач

Кровавая купель

Кларк Саймон
Фантастика:
ужасы и мистика
9.14
рейтинг книги
Кровавая купель

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Директива Джэнсона

Ладлэм Роберт
Детективы:
шпионские детективы
7.00
рейтинг книги
Директива Джэнсона

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Деревенщина в Пекине 2

Афанасьев Семён
2. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.25
рейтинг книги
Деревенщина в Пекине 2

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

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

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.50
рейтинг книги
Ермак. Телохранитель