SystemV訊息佇列

2021-10-23 18:38:24 字數 2982 閱讀 6401

從乙個程序傳送資料到另外乙個程序。

傳送的是資料塊,這個稱為訊息,訊息有型別,有邊界。

每條訊息的最大長度有限制(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的訊...