| MSGCTL(2) | Руководство программиста Linux | MSGCTL(2) |
msgctl - операции для работы с сообщениями System V
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
Вызов msgctl() выполняет операцию, заданную в cmd, над очередью сообщений System V с идентификатором msqid.
Структура данных msqid_ds определена в <sys/msg.h> следующим образом:
struct msqid_ds {
struct ipc_perm msg_perm; /* владелец и права */
time_t msg_stime; /* время последнего msgsnd(2) */
time_t msg_rtime; /* время последнего msgrcv(2) */
time_t msg_ctime; /* время последнего изменения */
unsigned long __msg_cbytes; /* текущее количество байт в
очереди (нет в стандарте) */
msgqnum_t msg_qnum; /* текущее количество сообщений
в очереди */
msglen_t msg_qbytes; /* максимальное количество байт
для очереди */
pid_t msg_lspid; /* PID последнего msgsnd(2) */
pid_t msg_lrpid; /* PID последнего msgrcv(2) */
};
Структура ipc_perm определена следующим образом (значения полей устанавливаются с помощью IPC_SET):
struct ipc_perm {
key_t __key; /* ключ, передаваемый в msgget(2) */
uid_t uid; /* эффективный UID владельца */
gid_t gid; /* эффективный GID владельца */
uid_t cuid; /* эффективный UID создателя */
gid_t cgid; /* эффективный GID создателя */
unsigned short mode; /* права */
unsigned short __seq; /* порядковый номер */
};
Возможные значения cmd:
struct msginfo {
int msgpool; /* размер в килобайтах буферного пула,
используемого для хранения данных сообщения;
ядром не используется */
int msgmap; /* максимальное количество элементов в карте
сообщений; ядром не используется */
int msgmax; /* максимальное количество байт, которые могут быть
записаны в одно сообщение */
int msgmnb; /* максимальное количество байт, которое можно
записать в очередь; используется для инициализации
msg_qbytes во время создания очереди
(msgget(2)) */
int msgmni; /* максимальное количество очередей сообщений */
int msgssz; /* размер сегмента сообщения;
ядром не используется */
int msgtql; /* максимальное количество сообщений во всех очередях
в системе; ядром не используется */
unsigned short int msgseg;
/* максимальное количество сегментов;
ядром не используется */
};
При успешном выполнении IPC_STAT, IPC_SET и IPC_RMID возвращается 0. При успешном выполнении операции IPC_INFO или MSG_INFO возвращается индекс самого последнего использованного элемента во внутреннем массиве ядра, в котором записана информация о всех очередях сообщений. (Эта информация может быть использована при повторяющихся операциях MSG_STAT и MSG_STAT_ANY для получения информации о всех очередях системы.) При успешном выполнении операции MSG_STAT или MSG_STAT_ANY возвращается идентификатор очереди, чей индекс был указан в msqid.
В случае ошибки возвращается -1, а в errno записывается значение ошибки.
В случае возникновения ошибки errno может принимать следующие значения:
POSIX.1-2001, POSIX.1-2008, SVr4.
Включение файлов <sys/types.h> и <sys/ipc.h> не требуется в Linux или любых версий POSIX. Однако, некоторые старые реализации требуют включения данных заголовочных файлов, и это также требуется по SVID. В приложениях, которые нужно перенести на такие старые системы, может потребоваться включить данных заголовочные файлы.
Операции IPC_INFO, MSG_STAT и MSG_INFO используются программой ipcs(1) для получения информации о выделенных ресурсах. В будущем для этого может быть задействован интерфейс файловой системы /proc.
Различные поля в struct msqid_ds, которые имели тип short в Linux 2.2, в Linux 2.4 теперь имеют тип long. Чтобы воспользоваться этим преимуществом достаточно пересобрать программу с glibc-2.1.91 или более новой версией. (Ядро различает старые и новые вызовы по флагу IPC_64 в cmd.)
msgget(2), msgrcv(2), msgsnd(2), capabilities(7), mq_overview(7), svipc(7)
| 2019-03-06 | Linux |