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

на главную

Жанры

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

 printf("%d :- client_starting\n", getpid);

#endif

 serv_qid = msgget((key_t)SERVER_MQUEUE, 0666);

 if (serv_qid == -1) return(0);

 cli_qid = msgget((key_t)CLIENT_MQUEUE, 0666);

 if (cli_qid == -1) return(0);

 return(1);

}

2. Как и в случае сервера, когда клиент завершает работу, вы задаете некорректные значения глобальных переменных. Это позволит выявить ошибки при

попытке клиента отправлять сообщения после вызова функции
client_ending
.

void client_ending {

#if DEBUG_TRACE

 printf("%d :- client_ending\n", getpid);

#endif

 serv_qid = -1;

 cli_qid = -1;

}

3. Для отправки сообщения серверу сохраните данные в своей структуре. Учтите, что вы должны задать ключ сообщения. Поскольку 0 — недопустимое значение для ключа, незаданный ключ означает, что он принимает (очевидно) случайное значение, поэтому иногда эта функция может возвращать ошибку, если значение оказывается нулевым.

int send_mess_to_server(message_db_t mess_to_send) {

 struct msg_passed my_msg;

#if DEBUG_TRACE

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

#endif

 my_msg.real_message = mess_to_send;

 my_msg.msg_key = mess_to_send.client_pid;

 if (msgsnd(serv_qid, (void *)&my_msg, sizeof(mess_to_send) , 0) == -1) {

perror("Message send failed");

return(0);

 }

 return(1);

}

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

int read_resp_from_server(message_db_t *rec_ptr) {

 struct msg_passed mymsg;

#if DEBUG_TRACE

 printf("%d :- read_resp_from_server\n", getpid);

#endif

 if (msgrcv(cli_qid, (void *)&my_msg, sizeof(*rec_ptr), getpid, 0) == -1) {

return(0);

 }

 *rec_ptr = my_msg.real_message;

 return(1);

}

5. Для сохранения совместимости с файлом pipe_imp.c необходимо объявить четыре дополнительные функции. Но в вашей программе они будут пустыми. Операции, которые они реализовывали в случае применения каналов, больше не нужны.

int start_resp_to_client(const message_db_t mess_to_send) {

 return(1);

}

void end_resp_to_client(void) {}

int start_resp_from_server(void) {

 return(1);

}

void end_resp_from_server(void) {}

Теперь

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

Все, что вы должны сделать, — это заменить интерфейсные функции из главы 11 другой реализацией, применяющей очереди сообщений. Преобразование приложения для использования очередей сообщений показывает мощь этого средства IPC, т.к. вам требуется меньше функций, чем в случае применения каналов, и даже эти необходимые функции гораздо проще, чем в предыдущей версии приложения.

Команды состояния IPC

Несмотря на то, что для соответствия требованиям X/Open этого не требуется, большинство систем Linux предоставляет набор команд, обеспечивающих доступ к данным IPC в режиме командной строки и удаление потерянных средств IPC. Существуют команды

ipcs
и
ipcrm
, очень полезные при разработке программ.

Один из досадных недостатков средств IPC состоит в том, что плохо написанная программа или программа, по какой-либо причине завершившаяся аварийно, может оставить свои ресурсы IPC (например, данные в очереди сообщений) еще долго блуждающими в системе без определенной цели после завершения программы. Такое поведение может привести к аварийному завершению нового запуска программы, поскольку она рассчитывает начать выполнение в очищенной системе, а на самом деле находит эти блуждающие ресурсы. Команды состояния (

ipcs
) и удаления (
ipcrm
) позволяют проверить систему и очистить ее от ненужных средств IPC.

Отображение состояния семафора

Для проверки состояния семафоров в системе примените команду

ipcs -s
. Если какие-то семафоры присутствуют, вывод команды будет выглядеть следующим образом:

$ ipcs -s

– ----- Semaphore Arrays ------

key semid owner perms nsems

0x4d00df1a 768 rick 666 1

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

ipcrm
. Для удаления только что отображенного семафора примените (в Linux) следующую команду:

$ ipcrm -s 768

В некоторых более старых системах Linux используется несколько иной синтаксис команды:

$ ipcrm sem 768

Но этот устаревший стиль редко встречается в наше время. Формат, подходящий для вашей конкретной системы, ищите на страницах интерактивного справочного руководства.

Отображение состояния совместно используемой памяти

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

ipcs -m
и
ipcrm -m <id>
(или
ipcrm shm <id>
).

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

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

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

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

Старый, но крепкий

Крынов Макс
1. Культивация без насилия
Фантастика:
рпг
уся
попаданцы
5.00
рейтинг книги
Старый, но крепкий

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия

#Бояръ-Аниме. Газлайтер. Том 24

Володин Григорий Григорьевич
24. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 24

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

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

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

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II