訊息佇列 無親緣關係程序通訊

2021-10-07 21:55:21 字數 4002 閱讀 7475

訊息佇列不像共享記憶體的流程,它不需要訊號通知。

訊息佇列的另乙個特點:資訊讀取完自動刪除;可以阻塞

msgget函式:訊息佇列建立

標頭檔案: #include

#include

#include

函式原型: int msgget(key_t key, int flag);

引數: key,和訊息佇列關聯的key值

flag,訊息佇列的訪問權

返回: 成功,訊息佇列id

出錯:-1

例: msgid=msgget(ipc_private,0777);

msgctl函式:訊息佇列控制

標頭檔案: #include

#include

#include

原型: int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)

引數: msgid,訊息佇列id

cmd,ipc_stat,讀取訊息佇列的屬性,並將其儲存在buf指向的緩衝區

ipc_set,設定訊息佇列屬性,這個值取自buf引數

ipc_rmid,從系統中刪除訊息佇列

buf,訊息佇列緩衝區

返回: 成功0,出錯-1

例: msgctl(msgid,ipc_rmid,null);

msgsnd函式:傳送訊息佇列

標頭檔案: #include

#include

#include

函式原型: int msgsnd(int msqid, const void *msgp, size_t size, int flag)

引數: msqid,訊息佇列id

msgp,指向訊息的指標

常用訊息結構msgbuf如下:

struct msgbuf

size,傳送的訊息正文位元組數

flag,ipc_nowait,訊息沒有傳送完函式也會立即返回

0,直到傳送完函式才返回

返回:成功0,出錯-1

例: msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.voltage),0);

msgrcv函式:接收訊息

標頭檔案: #include

#include

#include

函式原型: int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)

引數: msgid,訊息佇列號

msgp,接收訊息的緩衝區

size,要接收的訊息位元組數

msgtype,0:接收訊息佇列中第乙個訊息

>0,接收訊息佇列中第乙個型別為msgtype的訊息

<0,接收訊息佇列中型別值不大於msgtype的絕對值切型別值又最小的訊息

flag,0:若無訊息函式一直阻塞

ipc_nowait,若沒訊息,程序立即返回enomsg

返回: 成功,接收到的訊息長度

出錯-1

例: msgrcv(msgid,(void *)&recvbuf,124,100,0);

server.c

#include

"sys/types.h"

#include

"sys/msg.h"

#include

"signal.h"

#include

"unistd.h"

#include

"stdio.h"

#include

"stdlib.h"

#include

"string.h"

struct msgbuf

;int

main()

msgid=

msgget

(key,ipc_creat|

0777);

if(msgid <0)

printf

("creat message queue sucess msgid=%d\n"

,msgid)

;system

("ipcs -q");

pid=

fork()

;if(pid >0)

//parent process write 100}if

(pid ==0)

//child process read 200

}msgctl

(msgid,ipc_rmid,

null);

system

("ipcs -q");

return0;

}

執行結果

creat message queue  sucess msgid=

65537

----

-- message queues --

----

--key msqid owner perms used-bytes messages

0x00000000

32768 alex 77700

0x61016518

65537 alex 77700

please input message:

receive message from message queue:hello

hi

client.c

#include

"sys/types.h"

#include

"sys/msg.h"

#include

"signal.h"

#include

"unistd.h"

#include

"stdio.h"

#include

"stdlib.h"

#include

"string.h"

struct msgbuf

;int

main()

msgid=

msgget

(key,ipc_creat|

0777);

if(msgid <0)

printf

("creat message queue sucess msgid=%d\n"

,msgid)

;system

("ipcs -q");

pid=

fork()

;if(pid ==0)

//child process write 200}if

(pid >0)

//parent process read 100

}msgctl

(msgid,ipc_rmid,

null);

system

("ipcs -q");

return0;

}

執行結果

creat message queue  sucess msgid=

65537

----

-- message queues --

----

--key msqid owner perms used-bytes messages

0x00000000

32768 alex 77700

0x61016518

65537 alex 77700

please input message:

hello

please input message:

receive message from message queue:hi

程序通訊(訊息佇列)

訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊息佇列與命名管道有一 樣的不足,就是每個訊息的最大長度是有上限的 msgmax 每個訊息佇列的總的位元組 數是有上限的 msgmnb 系統上訊息佇列的總數也有乙個上限 msgmni ipc物件資...

程序通訊 訊息佇列

訊息佇列的使用 建立開啟訊息佇列msgget 讀資料從佇列msgrcv 寫資料到佇列msgsnd 控制訊息佇列msgctl 目前主要有兩種型別的訊息佇列 posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用 訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得...

Linux程序通訊 訊息佇列

1.訊息佇列 訊息佇列也稱為報文佇列,訊息佇列是隨核心持續的,只有在核心重起或顯示刪除乙個訊息佇列時,該訊息佇列才會真正刪除 系統中記錄訊息佇列的資料結構struct ipc ids msg ids位於核心中,系統中所有訊息佇列都可以在結構msg ids中找到訪問入口 訊息佇列其實就是乙個訊息的鍊錶...