簡體   English   中英

在Mac OSX上設置System V消息隊列大小

[英]Setting System V message queue size on Mac OSX

我目前在Mac OSX上使用System V消息隊列,並且在將隊列大小設置為大於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

為什么隊列大小沒有更改?

編輯: 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變大,還是卡住?

似乎OS X不允許增加消息隊列大小。 系統V的實現是舊的,根本沒有記錄在案。 我還發現奇怪的是message.h中缺少定義MSGMNB,MSGMAX,而您可以在Linux和其他Unix實現中找到它。

我也發現了這一點:

OS X是最糟糕的。 每個隊列限制為2048個字節,OS X默默地忽略增加該隊列的嘗試(就像FreeBSD一樣)。 更糟的是,除非重新編譯內核,否則似乎沒有辦法增加此限制。 我猜這是基於達爾文消息隊列的限制。 http://semanchuk.com/philip/sysv_ipc/

該文檔已於2014年9月更新,並確認了蘋果郵件列表中的帖子:

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

@Mark Setchell在評論中指出。

此外,OS X不支持最新的Ruby Wrapper實現,因為作者指出:

消息由計算機的內核處理。 並非所有內核都支持POSIX消息隊列,其中一個著名的例子是Darwin(OS X)。 達爾文實現了較早的System V IPC API。 https://github.com/Sirupsen/posix-mqueue

在網絡上,還有其他來源(大多是較舊的來源)表明,除了重新編譯內核以增加消息隊列限制外,別無其他方法。

更新 :Apple的立場是在此處阻止使用System V IPC:

支持某些System V原語,但不建議使用它們以支持POSIX等效項。

側面建議,添加: msgctl(id, IPC_RMID, NULL); 在測試代​​碼的結尾,有人(像我一樣,嘆氣!)可能忘記了每個隊列都必須關閉。

我在查找Mac專用文檔時遇到了麻煩,但是POSIX說 ,通過msgget()創建消息隊列時,其“ msg_qbytes應設置為等於系統限制”。 msgget()的BSD手冊頁也是如此,這是OS X的最接近的相對版本。 對於它的價值,Linux手冊頁似乎普遍同意。

這非常一致,表明如果您的初始隊列大小不夠大,那么您就會被淘汰。 您可以(也許)縮小它,但不能使其超出初始值。

msgctl()的手冊頁

代碼更改的字段是隊列中的當前字節數,而不是隊列中的最大字節數。

建議您查看: msglen_t msg_qbytes ,它是隊列中允許的最大字節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM