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

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

Жанры

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

 struct data_to_pass_st my_data;

 int read_res;

 char client_fifo[256];

 char *tmp_char_ptr;

 mkfifo(SERVER_FIFO_NAME, 0777);

 server_fifo_fd = open(SERVER_FIFO_NAME, O_RDONLY);

 if (server_fifo_fd == -1) {

fprintf(stderr, "Server fifo failure\n");

exit(EXIT_FAILURE);

 }

 sleep(10); /*
для целей демонстрации разрешает клиентам создать очередь */

 do {

read_res = read(server_fifo_fd, &my_data, sizeof(my_data));

if (read res > 0) {

3. На следующем этапе вы выполняете некоторую обработку данных, только что полученных от клиента: преобразуете все символы в некоторых данных в прописные и соединяете

CLIENT_FIFO_NAME
с полученным идентификатором
client_pid
.

tmp_char_ptr = my_data.some_data;

while (*tmp_char_ptr) {

*tmp_char_ptr = toupper(* tmp_char_ptr);

tmp_char_ptr++;

}

sprintf(client_fifo, CLIENT_FIFO_NAME, my_data.client_pid);

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

client_fifo_fd = open(client_fifo, O_WRONLY);

if (client_fifo_fd ! = -1) {

write(client_fifo_fd, &my_data, sizeof(my_data));

close(client_fifo_fd);

}

}

 } while (read_res > 0);

 close(server_fifo_fd);

 unlink(SERVER_FIFO_NAME);

 exit(EXIT_SUCCESS);

}

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

#include "client.h"

#include <ctype.h>

int main {

 int server_fifo_fd, client_fifo_fd;

 struct data_to_pass_st my_data;

 int times_to_send;

 char client_fifo[256];

 server_fifo_fd = open(SERVER_FIFO_NAME, O_WRONLY);

 if (server_fifo_fd == -1) {

fprintf (stderr, "Sorry, no server\n");

exit(EXIT_FAILURE);

 }

 my_data.client_pid = getpid;

 sprintf(client_fifo, CLIENT_FIFO_NAME, my_data.client_pid);

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

fprintf(stderr, "Sorry, can't make %s\n", client_fifo);

exit(EXIT_FAILURE);

 }

6. В

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

 for (times_to_send = 0; times_to_send < 5; times_to_send++) {

sprintf(my_data.some_data, "Hello from %d", my_data.client_pid);

printf("%d sent %s, ", my_data.client_pid, my_data.some_data);

write(server_fifo_fd, &my_data, sizeof(my_data));

client_fifo_fd = open(client_fifo, O_RDONLY);

if (client_fifo_fd != -1) {

if (read(client_fifo_fd, &my_data, sizeof(my_data)) > 0) {

printf("received: %s\n", my_data.some_data);

}

close(client_fifo_fd);

}

 }

 close(server_fifo_fd);

 unlink(client_fifo);

 exit(EXIT_SUCCESS);

}

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

$ ./server &

$ for i in 1 2 3 4 5

do

./client &

done

$

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

531 sent Hello from 531, received: HELLO FROM 531

532 sent Hello from 532, received: HELLO FROM 532

529 sent Hello from 529, received: HELLO FROM 529

530 sent Hello from 530, received: HELLO FROM 530

531 sent Hello from 531, received: HELLO FROM 531

532 sent Hello from 532, received: HELLO FROM 532

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

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

Афганский рубеж 4

Дорин Михаил
4. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 4

Темный мир

Алмазов Игорь
6. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
попаданцы
5.00
рейтинг книги
Темный мир

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Искра

Видум Инди
2. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Искра

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Горячий старт. Часть 3

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

Настроение – Песец

Видум Инди
7. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Настроение – Песец

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Развод с драконом. Отвергнутая целительница

Шашкова Алена
Фантастика:
фэнтези
4.75
рейтинг книги
Развод с драконом. Отвергнутая целительница

Ваантан

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