2015-11-30 3 views
10

В настоящее время я использую очереди сообщений System V на Mac OSX, и у меня возникают проблемы с установкой размера очереди на значение, превышающее 2048 байт. Вот компиляции способен пример test.c:Настройка размера очереди сообщений V-системы на Mac OSX

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

Compile с:

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 быть больше, или я застрял?

+0

Попробуйте запустить 'ipcs -Q', чтобы увидеть, есть ли максимальный размер. –

+0

@MarkSetchell - я обновил вопрос с выходом 'ipcs -Q'. – dinkelk

+0

Я никогда не пробовал это на OSX, и я не знаю, работает ли это или может вызвать проблемы, но я думаю, вы бы сделали что-то вроде 'sysctl -w kernel.msgmnb = 2000000' –

ответ

5

Похоже, что OS X не позволяет увеличить размер очереди сообщений. Реализация системы V является старой и не документирована вообще. Мне также показалось странным, что определение MSGMNB, MSGMAX отсутствует в message.h, тогда как вы можете найти его в Linux и других реализациях Unix.

Я также нахожу это:

OS X является худшим из партии. Каждая очередь ограничена 2048 байтами и OS X молча игнорирует попытки увеличить это (как и FreeBSD). Чтобы добавить оскорбление к травме, похоже, нет возможности увеличить этот предел , не дожидаясь перекомпиляции ядра. Я предполагаю, что это основано на ограничениях очереди сообщений Darwin.(http://semanchuk.com/philip/sysv_ipc/)

Документ был обновлен на сентябрь 2014 года и подтверждает запись в списке рассылки яблоко:

http://lists.apple.com/archives/unix-porting/2008/Jan/msg00033.html

Указал на @Mark Setchell в комментарии.

Кроме того, в последнее время реализация Руби Упаковочный не поддерживается на OS X, как автор утверждает, что:

Сообщения обрабатываются ядром вашего компьютера. Не все ядра поддерживают очередь сообщений POSIX, в частности пример: Darwin (OS X). Дарвин внедряет старый API IPC System V. (https://github.com/Sirupsen/posix-mqueue)

В Интернете существуют и другие источники (в основном старые), которые указывают, что нет другого пути, кроме перекомпиляции ядра для увеличения очереди сообщений.

UPDATE: позиция компании Apple заключается в предотвращении использования System V IPC here:

поддерживаются некоторые System V примитивы, но их использование не рекомендуется в пользу POSIX эквивалентов.

Side предложение добавить: msgctl(id, IPC_RMID, NULL); в конце тестового кода, кто-то (как я, вздыхать!) Мог забыть, что каждая очередь должна быть закрыта.

+0

К сожалению, для Mac OS сообщений не существует эквивалента POSIX для очередей сообщений System V, потому что очереди Posix вообще не поддерживаются. – dinkelk

+0

@dinkelk Да, но странно, как вы можете видеть, это то, что сообщается в здании loper –

-1

страница людей для msgctl()

, поле кода меняется является током числа байт в очереди, а не максимальное количество байт в очереди.

Предлагаем посмотреть: msglen_t msg_qbytes, который является максимальным количеством байтов разрешено в очереди.

+0

Если вы посмотрите на мою код, он фактически меняет 'msg_qbytes'. – dinkelk

1

У меня возникли проблемы с поиском документации для Mac, но POSIX says, что когда очередь сообщений создается через msgget(), ее «msg_qbytes должен быть установлен равным системному пределу». Страница руководства BSD для msgget() говорит то же самое, и это самый близкий родственник OS X. Для чего это стоит, Linux man-страницы кажутся универсальными, чтобы согласиться.

Это все довольно непротиворечиво, указывая, что если ваш размер начальной очереди не достаточно велик, тогда вы будете закрыты. Вы можете (возможно) сжать его, но вы не сможете вырастить его за пределами его первоначального значения.

Смежные вопросы