練習 LINUX程序間通訊之訊息佇列MSG

2021-09-07 03:47:56 字數 3167 閱讀 3794

繼續堅持,或許不能深刻理解,但至少要保證有印象。

訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然posix 1003.1b在訊號的實時性方面作了拓廣,使得訊號在傳遞資訊量方面有了相當程度的改進,但是訊號這種通訊方式更像"即時"的通訊方式,它要求接受訊號的程序在某個時間範圍內對訊號做出反應,因此該訊號最多在接受訊號程序的生命週期內才有意義,訊號所傳遞的資訊是接近於隨程序持續的概念(process-persistent),見 附錄 1;管道及有名管道及有名管道則是典型的隨程序持續ipc,並且,只能傳送無格式的位元組流無疑會給應用程式開發帶來不便,另外,它的緩衝區大小也受到限制。

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新訊息;對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。訊息佇列是隨核心持續的(參見 附錄 1)。

目前主要有兩種型別的訊息佇列:posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用。考慮到程式的可移植性,新開發的應用程式應盡量使用posix訊息佇列。

在本系列專題的序(深刻理解linux程序間通訊(ipc))中,提到對於訊息佇列、訊號燈、以及共享記憶體區來說,有兩個實現版本:posix的以及系統v的。linux核心(核心2.4.18)支援posix訊號燈、posix共享記憶體區以及posix訊息佇列,但對於主流linux發行版本之一redhad8.0(核心2.4.18),還沒有提供對posix程序間通訊api的支援,不過應該只是時間上的事。

/*

****************

* * test.c* *

*****************

*/#include

#include

#include

#include

#include

void msg_stat(int, struct

msqid_ds);

main()

msg_sbuf;

struct

msgmbufmsg_rbuf;

struct

msqid_ds msg_ginfo, msg_sinfo;

char* msgpath = "

/tmp/msgqueue";

key=ftok(msgpath, 'a'

); gflags = ipc_creat|ipc_excl;

msgid = msgget(key, gflags|00666

);

if(msgid == -1

)

msg_stat(msgid, msg_ginfo);

sflags=ipc_nowait;

msg_sbuf.mtype = 10

; msg_sbuf.mtext[

0] = 'a'

; reval = msgsnd(msgid, &msg_sbuf, sizeof

(msg_sbuf), sflags);

if(reval == -1

)

msg_stat(msgid, msg_ginfo);

rflags = ipc_nowait|msg_noerror;

reval = msgrcv(msgid, &msg_rbuf, 4, 10

, rflags);

if(reval == -1

) printf(

"read msg error\n");

else

printf(

"read from msg queue %d bytes\n

", reval);

msg_stat(msgid, msg_ginfo);

msg_sinfo.msg_perm.uid = 8

; msg_sinfo.msg_perm.gid = 8

; msg_sinfo.msg_qbytes = 16388

;

reval = msgctl(msgid, ipc_set, &msg_sinfo);

if(reval == -1

)

msg_stat(msgid, msg_ginfo);

reval =msgctl(msgid, ipc_rmid, null);

if(reval == -1

)

}void msg_stat(int msgid, struct

msqid_ds msg_info)

printf("\n

");printf(

"current number of bytes on queue is %d\n

", msg_info.msg_cbytes);

printf(

"number of messages in queue is %d\n

",msg_info.msg_qnum);

printf(

"max number of bytes on queue is %d\n

",msg_info.msg_qbytes);

printf(

"pid of last msgsnd is %d\n

",msg_info.msg_lspid);

printf(

"pid of last msgrcv is %d\n

",msg_info.msg_lrpid);

printf(

"last msgsnd time is %s

", ctime(&(msg_info.msg_stime)));

printf(

"last msgrcv time is %s

", ctime(&(msg_info.msg_rtime)));

printf(

"last change time is %s

", ctime(&(msg_info.msg_ctime)));

printf(

"msg uid is %d\n

",msg_info.msg_perm.uid);

printf(

"msg gid is %d\n

",msg_info.msg_perm.gid);

}

linux程序間通訊之訊息佇列

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。include include include include include include in...

linux程序間通訊之訊息佇列

訊息佇列 使用訊息佇列的好處 可以給訊息附加特定的訊息型別。訊息佇列用於同一臺計算機的程序間的通訊。include include key t ftok const char pathname,int proj id 該函式根據檔名生成乙個id 系統建立ipc 通訊 訊息佇列 訊號量和共享記憶體 時...

linux程序間通訊之訊息傳遞

linux 程序間通訊中訊息傳遞主要分為管道,fifo,訊息佇列 1 管道 管道由pipe函式建立,提供乙個單路 單向 資料流。pipe函式返回兩個檔案描述符 fd 0 和fd 1 前者開啟來讀,後者開啟來寫。管道沒有名字,所以只能由有親緣關係的程序使用。儘管管道是由單個程序建立的,它卻很少在單個程...