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) {}
Теперь вы можете просто запустить сервер, выполняющий в фоновом режиме реальное сохранение и извлечение данных, и затем выполнить клиентское приложение для подключения к серверу с помощью сообщений.
Все, что вы должны сделать, — это заменить интерфейсные функции из
Команды состояния 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 <
(или ipcrm shm <
).
Далее приведен пример вывода команды ipcs -m
:
$ ipcs -m
------ Shared Memory Segments ------
key shmid owner perms bytes nattch status
0x00000000 384 rick 666 4096 2 dest
Здесь показан единственный сегмент совместно используемой памяти объемом 4 Кбайт, присоединенный к двум процессам.
Команда ipcrm -m <
позволяет удалить совместно используемую память. Она бывает полезной, когда программа завершается аварийно при попытке убрать такую память.
Отображение состояния очереди сообщений
Для очередей сообщений предназначены команды ipcs -q
и ipcrm -q <
> (или ipcrm msg <
).
Далее приведен пример вывода команды ipcs -q
:
$ ipcs -q