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

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

Жанры

Основы программирования в 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);

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

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Эпоха Опустошителя. Том II

Павлов Вел
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том II

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

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

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Альбион сгорит!

Зот Бакалавр
10. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Альбион сгорит!

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Тринадцатый X

NikL
10. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Тринадцатый X

Драчуны

Алексеев Михаил Николаевич
Проза:
советская классическая проза
5.00
рейтинг книги
Драчуны

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

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

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец