Описание

#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)));

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: