3、systemv 訊息佇列
為了便於程序之間通訊,我們可以使用管道通訊 systemv 也提供了一些函式來實現程序的
通訊.這就是訊息佇列.
#include
#include
#include
int msgget(key_t key,int msg***);
34int msgsnd(int msgid,struct msgbuf *msgp,int msgsz,int msg***);
int msgrcv(int msgid,struct msgbuf *msgp,int msgsz,
long msgtype,int msg***);
int msgctl(int msgid,int cmd,struct msqid_ds *buf);
struct msgbuf
msgget 函式和semget 一樣,返回乙個訊息佇列的標誌.msgctl 和semctl 是對訊息進行控
制.. msgsnd 和msgrcv 函式是用來進行訊息通訊的.msgid 是接受或者傳送的訊息佇列標
志.msgp 是接受或者傳送的內容.msgsz 是訊息的大小. 結構msgbuf 包含的內容是至少有
乙個為msgtype.其他的成分是使用者定義的.對於傳送函式msg*** 指出緩衝區用完時候的操
作.接受函式指出無訊息時候的處理.一般為0. 接收函式msgtype 指出接收訊息時候的操作.
如果msgtype=0,接收訊息佇列的第乙個訊息.大於0 接收佇列中訊息型別等於這個值的第
乙個訊息.小於0 接收訊息佇列中小於或者等於msgtype 絕對值的所有訊息中的最小乙個消
息. 我們以乙個例項來解釋程序通訊.下面這個程式有server 和client 組成.先執行服務
端後執行客戶端.服務端 server.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define msg_file "server.c"
#define buffer 255
#define perm s_irusr|s_iwusr
struct msgtype
;int main()
if((msgid=msgget(key,perm|ipc_creat|ipc_excl))==-1)
while(1)
exit(0);
}客戶端(client.c)
#include
#include
#include
#include
#include
#include
#include
#include
#define msg_file "server.c"
#define buffer 255
#define perm s_irusr|s_iwusr
struct msgtype
;int main(int argc,char **argv)
if((key=ftok(msg_file,'a'))==-1)
36if((msgid=msgget(key,perm))==-1)
msg.mtype=1;
strncpy(msg.buffer,argv[1],buffer);
msgsnd(msgid,&msg,sizeof(struct msgtype),0);
memset(&msg,'\0',sizeof(struct msgtype));
msgrcv(msgid,&msg,sizeof(struct msgtype),2,0);
fprintf(stderr,"client receive:%s\n",msg.buffer);
exit(0);
}注意服務端建立的訊息佇列最後沒有刪除,我們要使用ipcrm 命令來刪除的.
ipcs
ipcrm -q msqid
System V訊息佇列 3
server程序接收時,指定msgtyp為1,從隊首不斷接收訊息 server程序傳送時,將mtype指定為接收到的client程序的pid client程序傳送的時候,mtype指定為自己程序的pid client程序接收時,需要將msgtyp指定為自己程序的pid,只接收訊息型別為自己pid的訊...
System V訊息佇列
該函式用於建立乙個新的訊息佇列或訪問乙個已存在的訊息佇列,返回乙個整數識別符號。當建立乙個新的訊息佇列時,msqid ds結構的如下成員被初始化 msg perm結構的uid和cuid成員被設定成當前程序的有效使用者id,gid和cgid成員被設定成當前程序的有效id oflag中的讀寫許可權位存放...
SystemV訊息佇列
從乙個程序傳送資料到另外乙個程序。傳送的是資料塊,這個稱為訊息,訊息有型別,有邊界。每條訊息的最大長度有限制 msgmax 位元組 root localhost cat proc sys kernel msgmax 8192 每個訊息佇列的總位元組數有上限 msgmnb 位元組 root local...