程序間通訊之訊息佇列msg queue

2021-07-01 18:40:13 字數 3402 閱讀 6990

訊息message是乙個格式化的可變長資訊單位。訊息機制允許乙個程序向任何其他程序傳送乙個訊息。本質上,訊息佇列很像是核心維護的乙個信箱,任何程序都可以向核心傳送一封信,這個信包括訊息的型別(用long型表示),和訊息的內容(char型陣列)。任何程序通過ipc物件識別符號,就可以向指定的信箱傳送訊息。類似的,任何程序可以通過ipc物件識別符號,來從信箱中收取指定型別的訊息。這裡的任何程序,是指具有訪問許可權的任何程序。

下面通過乙個例子來了解訊息佇列。

程式server建立訊息佇列,其他程序可以通過server程序建立的訊息佇列來進行通訊。這時寫訊息佇列的程式send可以傳送訊息,任何時候,讀訊息佇列的程式receive可以讀取訊息。

程式server的源**msgq.c

#include 

#include

#include

#include

int main()

else

printf("use \"id\", \"ipcs -q [-i msgid]\" to see more details\n");

printf("press enter to remove the message queue...\n");

getchar();

/* delete the msg queue */

retval = msgctl(msgid, ipc_rmid, null);

if(-1 == retval)

else

return;

}

receive.c

#include 

#include

#include

#include

#include

#define len 512

int main(int argc, char *argv)

msg_buf;

/*receive message from msg queue */

if(2 != argc)

sflag = ipc_nowait | msg_noerror;

doelse

if(100 == msg_buf.mtype)

break;

}while(1);

return ;

}

send.c

#include 

#include

#include

#include

#define len 512

int main(int argc, char *argv)

msg_buf;

/*send id message*/

if(4 != argc)

sflag = ipc_nowait;

msg_buf.mtype = atoi(argv[2]);

strcpy(&msg_buf.mtext[0], argv[3]);

ret = msgsnd(atoi(argv[1]), &msg_buf, strlen(msg_buf.mtext), sflag);

if(-1 == ret)

else

return ;

}

對應的makefile

server = server

send = s

receive = r

all:server send receive

server: msgq.c

gcc msgq.c -o $(server)

send: send.c

gcc send.c -o $(send)

receive: receive.c

gcc receive.c -o $(receive)

clean:

rm -f $(server) $(send) $(receive)

隨時的,可以使用命令ipcs -q來檢視系統所有的訊息佇列。

先執行server:

my pid is

11609

ipc key = 0x710400db

message queue msqid=163840

use "id", "ipcs -q [-i msgid]"

to see more details

press enter to remove the message queue...

程序server會建立訊息佇列後會停止執行,其他程序就可以通過匯出的msgq id來進行通訊。

然後從另乙個終端中執行send,就可以傳送訊息到id為163840的這個訊息佇列

test@test

:~$ ./s 163840

10 hello

這時通過ipcs -q -i 163840就可以看到163840這個訊息佇列的很多資訊,比如現在訊息佇列中有多少byte資料,最後乙個傳送訊息的程序程序號是多少。

可以再從第三個終端中執行receive,指定從163840這個訊息佇列中收取訊息。

test@test:~$ ./r 163840

pid:11616 received [5] byte from msqid [163840]

content:[hello]

exit when

type=

100. message receive error: no message of desired type

exit when

type=

100. message receive error: no message of desired type

exit when

type=

100. message receive error: no message of desired type

exit when

type=

100. message receive error: no message of desired type

exit when

type=

100. message receive error: no message of desired type

exit when

type=

100. message receive error: no message of desired type

r程序收不到型別為100的訊息就會迴圈讀取。這時可從第二個終端中檢視下訊息佇列的資訊,也可以繼續傳送其他訊息。

當傳送型別100的訊息時,收訊息程序滿足退出條件就退出了。

再返回第乙個終端中敲下回車,釋放申請的ipc資源。

程序間通訊之訊息佇列

include include define max msg buf len 512 int ikey 6004 struct ipcmsgbuf int main void 寫訊息佇列 memset msgdata,0,sizeof struct ipcmsgbuf msgdata.mtype 1...

程序間通訊之訊息佇列

訊息佇列其實就是提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。此外,訊息佇列和管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列不一定是先入先出。訊息佇列與命名管道有一樣的不足,就是每個訊息的最大長度是有上限的 msgm...

程序間通訊之訊息佇列

訊息佇列 訊息佇列本質上是提供了一種從乙個程序向另乙個程序傳送資料快的方法。每個資料快都被認為是有乙個型別,接受者程序接收的資料塊可以有不同的型別值。訊息佇列和管道的區別 1 訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先進先出的。2 訊息佇列的生命週期是隨核心的 不隨程序...