В настоящее время я использую очереди сообщений System V на Mac OSX, и у меня возникают проблемы с установкой размера очереди на значение, превышающее 2048 байт. Ниже приведен пример компиляции test.c
:
#include <stdio.h>
#include <sys/msg.h>
#include <stdlib.h>
int main() {
// get a message queue id
int id = msgget(IPC_PRIVATE,IPC_CREAT|0600);
if (-1 == id)
exit(1);
// get message queue data structure
struct msqid_ds buf;
if (-1 == msgctl(id, IPC_STAT, &buf))
exit(1);
printf("size is %lu bytes\n", buf.msg_qbytes);
// set new buffer size
buf.msg_qbytes = 2750;
printf("setting size to %lu bytes\n", buf.msg_qbytes);
if (-1 == msgctl(id, IPC_SET, &buf))
exit(1);
// check updated message queue data structure
if (-1 == msgctl(id, IPC_STAT, &buf))
exit(1);
printf("size is %lu bytes\n", buf.msg_qbytes);
}
Скомпилировать с помощью:
clang -Wall -pedantic -o test test.c
И запустите с помощью:
sudo ./test
Примечание. Вы выполнили приведенный выше код с помощью sudo
, чтобы убедиться в успешности вызовов msgcntl
.
Вывод этого фрагмента программы:
size is 2048 bytes
setting size to 2750 bytes
size is 2048 bytes
Почему размер очереди не изменяется?
EDIT:
Выходной сигнал ipcs -Q
показывает:
IPC status from <running system> as of Tue Dec 1 10:06:39 PST 2015
msginfo:
msgmax: 16384 (max characters in a message)
msgmni: 40 (# of message queues)
msgmnb: 2048 (max characters in a message queue)
msgtql: 40 (max # of messages in system)
msgssz: 8 (size of a message segment)
msgseg: 2048 (# of message segments in system)
Можно ли сделать msgmnb
больше, или я застрял?