繼續堅持,或許不能深刻理解,但至少要保證有印象。
訊息佇列(也叫做報文佇列)能夠克服早期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 前者開啟來讀,後者開啟來寫。管道沒有名字,所以只能由有親緣關係的程序使用。儘管管道是由單個程序建立的,它卻很少在單個程...