從乙個程序傳送資料到另外乙個程序。
傳送的是資料塊,這個稱為訊息,訊息有型別,有邊界。
每條訊息的最大長度有限制(msgmax)位元組
[root@localhost ~]
# cat /proc/sys/kernel/msgmax
8192
每個訊息佇列的總位元組數有上限(msgmnb)位元組
[root@localhost ~]
# cat /proc/sys/kernel/msgmnb
16384
系統上能建立的訊息佇列的總數有限制(msgmni)
ipc物件隨核心持續,所以核心要維護ipc物件,所以
核心為每乙個ipc物件分配乙個結構體(訊號量、共享記憶體,訊息佇列)
訊息佇列的結構體:
訊息佇列在核心裡面的表示形式
每條訊息由鍊錶串接起來
man msgget 檢視幫助手冊
開啟或建立乙個訊息佇列
int
msgget
(key_t key,
int msg***)
;
引數說明:
如果key為:ipc_private,建立的訊息佇列不能被其他程序共享。
msg***:
ipc_creat:如果沒有key為1234這個訊息佇列,就建立,有就開啟。
o_excl:如果key為1234的訊息佇列存在,msgget返回-1,表示失敗
訊息佇列控制函式:
man msgctl檢視幫助
int
msgctl
(int msqid,
int cmd,
struct msqid_ds *buf)
;
引數說明:
int cmd:
ipc_rmid:刪除訊息佇列
如果只是刪除訊息佇列,第三個引數不關心他
msgctl
(1234
,ipc_rmid,
null
);
struct msqid_ds buf;
msgctl
(1234
,ipc_stat,
&buf)
;
需要知道訊息佇列的結果,列印結構體即可。
比如獲取這個訊息佇列的許可權(在ipc物件的結構體裡面):
printf
(「mode=
%o\n」,buf.msg_perm.mode)
;
man ipcrm
ipcrm -q 訊息佇列的key(可以通過ipcs檢視)
ipcrm -q 訊息佇列的id(可以通過ipcs檢視)
往訊息佇列裡面發訊息
int
msgsnd
(int msqid,
const
void
*msgp, size_t msgsz,
int msg***)
;
引數說明:
const void *msgp:要傳送內容的指標,一般把這個指標指向乙個結構體
struct msgbuf
;
int msgflag:
這個引數為0的時候,訊息佇列滿,如果再發訊息,核心會等待
這個引數等於ipc_nowait的時候,如果再發訊息,返回-1,資源暫且不可用
struct msgbuf
;struct msgbuf *ptr;
ptr =
(struct msgbuf *
)malloc
(sizeof
(long
)+ len)
;ptr->mtype =1;
//訊息型別為1
strcpy
(ptr->mtext,
"hello");
msgsnd
(msgid, ptr, msgmax,0)
//第三個引數:訊息內容的長度
系統裡面有個巨集:#define msgmax 8192
ssize_t msgrcv
(int msqid,
void
*msgp, size_t msgsz,
long msgtyp,
int msg***)
;
引數說明:
struct msgbuf
;struct msgbuf ptr;
msgrcv
(msqid,
&ptr, msgmax ,1,
0)//接收訊息型別為1的訊息
System V訊息佇列
該函式用於建立乙個新的訊息佇列或訪問乙個已存在的訊息佇列,返回乙個整數識別符號。當建立乙個新的訊息佇列時,msqid ds結構的如下成員被初始化 msg perm結構的uid和cuid成員被設定成當前程序的有效使用者id,gid和cgid成員被設定成當前程序的有效id oflag中的讀寫許可權位存放...
system v 訊息佇列(二)
1 功能 把一條訊息新增到訊息佇列中 2 原型 intmsgsnd int msqid,const void msgp.size t msgsz,int msg 3 引數 msgqid 由msgget函式返回的訊息佇列標識碼 msgp 是乙個指標,指標指向準備傳送的訊息 msgsz 是msgp指向的...
System V訊息佇列 3
server程序接收時,指定msgtyp為1,從隊首不斷接收訊息 server程序傳送時,將mtype指定為接收到的client程序的pid client程序傳送的時候,mtype指定為自己程序的pid client程序接收時,需要將msgtyp指定為自己程序的pid,只接收訊息型別為自己pid的訊...