26.5.6. Тотальный контроль

We use cookies. Read the Privacy and Cookie Policy

26.5.6. Тотальный контроль

До сих пор мы рассматривали только системные вызовы для работы с сообщениями очереди, сейчас рассмотрим системный вызов msgctl(), предназначенный для контроля самой очереди.

int msgctl(int msgqid, int cmd, struct msqid_ds *buf);

Первый аргумент — это ID очереди, второй — команда, которую нужно выполнить:

? IPC_STAT — записывает в буфер buf структуру msqid_ds для очереди сообщений с идентификатором msgqid.

? IPC_SET — устанавливает значение ipc_perm структуры msqid. Значение берется из буфера buf.

? IPC_RMID — удаляет очередь.

Системный вызов возвращает 0 в случае успеха и -1, если произошла ошибка. Переменная errno устанавливается следующим образом:

? EACCESS — недостаточно прав.

? EFAULT — невозможно получить доступ к адресу буфера buf или неверный адрес.

? EIDRM — очередь была уничтожена прямо во время запроса.

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

? EPERM — у вас нет прав на запись в очередь.

Структура msqid_ds уже рассматривалась ранее, поэтому не вижу смысла приводить ее описание еще раз.

Если подытожить, то все, что мы можем сделать с очередью — это удалить ее и изменить права доступа или информацию о владельце (его UID и GID). Как удалить, думаю, понятно. Напишем функцию change_mode(), которая будет изменять права доступа к нашей очереди. Ей нужно передать два параметра — идентификатор очереди и новый режим доступа в виде строки, например, "0660".

int change_mode(int id, char *mode) {

 struct msqid_ds buf;

 /* Получаем копию структуры в буфер buf */

 if (msgctl(id, IPC_STAT, &buf) == -1) {

  return(-1);

 }

 /* Изменяем права доступа */

 sscanf(mode, "%ho", &buf.msg_perm.mode);

 /* Модернизируем внутреннюю структуру */

 if (msgctl(id, IPC_SET, &buf) == -1} {

  return(-1);

 }

 return(0);

}

Наша функция возвращает 0 в случае успеха или -1, если произошла ошибка.

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

Данный текст является ознакомительным фрагментом.