3 SystemV 訊息佇列

2021-06-06 20:16:15 字數 2059 閱讀 6418

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...