#include <sys/msg.h>
int msgctl(int mqid, int command, struct msqid_ds *msq_stat);
Переменная mqid должна быть допустимым идентификатором очереди. Пропуская пока параметр command, обратимся к третьему параметру msq_stat, который содержит адрес структуры msqid_ds. Эта структура определяется в файле <sys/msg.h> и содержит следующие элементы:
struct ipc_perm msg_perm; | // | Владелец/права доступа | |
msgqnum_t | msg_qnum; | // | Число сообщений в очереди |
msglen_t | msg_qbytes; | // | Макс. число байтов в очереди |
pid_t | msg_lspid; | // | Идентификатор процесса, |
последним вызвавшего msgsnd | |||
pid_t | msg_lrpid; | // | Идентификатор процесса, |
последним вызвавшего msgrcv | |||
time_t | msg_stime; | // | Время посл. вызова msgsnd |
time_t | msg_rtime; | // | Время посл. вызова msgrcv |
time_t | msg_ctime; | // | Время посл. изменения |
Структуры ipc_perm, с которыми уже встречались ранее, содержат связанную с очередью информацию о владельце и правах доступа. Типы msgqnum _ t, msglen_t, pid_t и time_t зависят от конкретной системы. Переменные типа time_t содержат число секунд, прошедшее с 00:00 по гринвичскому времени 1 января 1970 г. (Следующий пример покажет, как можно преобразовать такие значения в удобочитаемый формат.)
|
|
Параметр command в вызове msgctl сообщает системе, какую операцию она должна выполнить. Существуют три возможных значения этого параметра, каждое из которых может быть применено к одному из трех средств межпроцессного взаимодействия. Они обозначаются следующими константами, определенными в файле <sys/ipc.h>.
IPC_STAT Сообщает системе, что нужно поместить информацию о статусе объекта в структуру msg_stat.
IPC_SET Используется для задания значений управляющих параметров очереди сообщений, содержащихся в структуре msg_stat. При этом могут быть изменены только следующие поля:
msq_stat.msg_perm.uid
msq_stat.msg_perm.gid
msq_stat.msg_perm.mode
msq_stat.msg_qbytes
Операция IPC_SET завершится успехом только в случае ее выполнения суперпользователем или текущим владельцем очереди, заданным параметром msq_stat.msg_perm.uid. Кроме того, только суперпользователь может увеличивать значение msg_qbytes - максимальное количество байтов, которое может находиться в очереди
IPC_RMID Эта операция удаляет очередь сообщений из системы. Она также может быть выполнена только суперпользователем или владельцем очереди. Если параметр command принимает значение IPC_RMID, то параметр msg_stat задается равным NULL
Следующий пример, программа show_msg, выводит часть информации о статусе объекта очереди сообщений. Программа должна вызываться так:
$ show_msg значение_ключа
Программа show_msg использует библиотечную процедуру ctime для преобразования значений структуры time_t в привычную запись.
Текст программы show_msg:
/* Программа showmsg - выводит данные об очереди сообщений */
|
|
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <time.h>
void mqstat_print (key_t, int, struct msqid_ds *);
main (int argc, char **argv)
{
key_t mkey;
int msq_id;
struct msqid_ds msq_status;
if(argc!= 2)
{
fprintf(stderr, "Применение: showmsg значение_ключа\п");
exit(1);
}
/* Получаем идентификатор очереди сообщений */
mkey = (key_t)atoi(argv[1]);
if((msq_id = msgget(mkey, 0)) == -1)
{
perror("Ошибка вызова msgget");
exit(2);
}
/* Получаем информацию о статусе */
if(msgctl(msq_id, IPC_STAT, &msq_status) == -1)
{
perror("Ошибка вызова msgctl");
exit(3);
}
/* Выводим информацию о статусе */
mqstat_print(mkey, msq_id, &msq_status)
exit(0);
}
void mqstat_print(key_t mkey, int mqid, struct msqld_ds *mstat)
{
printf ("\пКлюч %d, msg_qid %d\n\n", mkey, mqid);
printf ("%d сообщений в очереди\п\п", mstat->msg_qnum);
printf ("Последнее сообщение послано процессом %d в %s\n",
mstat->msg_lspid, ctime(&(mstat->msg_stime)));
printf ("Последнее сообщение принято процессом %d в %s\n",
mstat->msg_lrpid, ctime(&(mstat->msg_rtime)));
}