隊列是從開始到結束,有序的排放消息。消息隊列是用來在應用程序發送消息,隊列中存放了一些待處理的消息。
消息
消息用來在接受者和發送者之間傳輸,它本質上是一個字節數組,上面有一些頭信息。一個消息示例可以是任何告訴一個系統開始處理任務或完成任務的信息。
消息隊列的基本結構是簡單的,有一個客戶端應用程序稱為生產者,創建消息,並將它們傳送到消息隊列。其他應用程序,稱為消費者,連接到隊列,並得到要處理的消息。放置在隊列上的消息被存儲,直到用戶處理它們為止。
[code]#include <sys/msg.h> ------------------------------------ int msgget(key_t key, int msgflg);
[code]#include <sys/msg.h> ----------------------------------------- int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
[code] struct msgbuf { long mtype; /* message type, must be > 0 */ char mtext[1]; /* message data */ };
設置消息隊列屬性
[code]#include <sys/msg.h> --------------------- int msgctl(int msqid, int cmd, struct msqid_ds *buf);
[code]------ Messages: Limits -------- max queues system wide = 2779 max size of message (bytes) = 8192 default max size of queue (bytes) = 16384
根據kernel.txt可以得知,auto_msgmni的值默認是1,當設置為0的時候,就不能自動獲取msgmni
[code]root@test:# cat /proc/sys/kernel/auto_msgmni 1 root@test:#而在K4.4版本中。你會發現auto_msgmni居然是0,而且設置1設置失敗。
[code]root@test:/ # cat /proc/sys/kernel/auto_msgmni 0 root@test:/ # echo 1 > /proc/sys/kernel/auto_msgmni root@test:/ # cat /proc/sys/kernel/auto_msgmni 0 root@test:/ #這到底是什麼原因? 可以通過查看kernel的代碼得知。
[code]kernel/ipc_sysctl.c ------------------------ { .procname = "auto_msgmni", .data = NULL, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_ipc_auto_msgmni, .extra1 = &zero, .extra2 = &one, },以上是auto_msgmni的默認配置信息,而proc_ipc_auto_msgmni是設置auto_msgmni的回調函數。
[code] static int proc_ipc_auto_msgmni(struct ctl_table *table, int write, void __user *buffer, size_t *lenp, loff_t *ppos) { struct ctl_table ipc_table; int dummy = 0; memcpy(&ipc_table, table, sizeof(ipc_table)); ipc_table.data = &dummy; if (write) pr_info_once("writing to auto_msgmni has no effect"); return proc_dointvec_minmax(&ipc_table, write, buffer, lenp, ppos); }可以看到一句打印: 設置auto_msgmni已經沒有作用了。