日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用

由于最近的工作中需要用到消息隊列,順帶花時間整理了一下 。
C語言消息隊列,有三種,一種是System V ipc,第二種的是posix ipc,第三種是自己用代碼實現(xiàn)的消息隊列 。
System V ipc 和Posix ipc 也叫進程間通信 。(IPC的全稱是Inter-process Comminication,就是進程間通信) 。
進程間通信分為三個內(nèi)容,分別是:消息隊列、信號量和共享內(nèi)存 。
System V IPC也分為以下三種類型:
System V 消息隊列
System V 信號量
System V 共享內(nèi)存區(qū)

redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用


System V IPC 三種類型
本文將主要介紹System V 消息隊列
在System V IPC中,System v ipc中有一個重要的類型是key_t,在msget、semget、shmget函數(shù)操作中都需要利用這個類型是參數(shù) 。
key_t的值由函數(shù)ftok來生成,函數(shù)ftok把一個[已存在的路徑名,pathname]和一個[整數(shù)標識符,id]轉(zhuǎn)換稱一個key_t值, 稱為IPC鍵 。
key_t ftok(const char *pathname, int proj_id);
System V 消息隊列消息隊列函數(shù)由msgget、msgctl、msgsnd、msgrcv四個函數(shù)組成 。
1.msgget函數(shù)原型
redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用


msgget函數(shù)原型
如果用msgget創(chuàng)建了一個新的消息隊列對象時,則msqid_ds結(jié)構(gòu)成員變量的值設(shè)置如下:
msg_qnum、msg_lspid、msg_lrpid、 msg_stime、msg_rtime設(shè)置為0 。
msg_ctime設(shè)置為當前時間 。
msg_qbytes設(shè)成系統(tǒng)的限制值 。
msgflg的讀寫權(quán)限寫入msg_perm.mode中 。
msg_perm結(jié)構(gòu)的uid和cuid成員被設(shè)置成當前進程的有效用戶ID,gid和cuid成員被設(shè)置成當前進程的有效組ID 。
2.msgctl函數(shù)原型
redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用


msgctl函數(shù)原型
3.msgsnd函數(shù)原型
redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用


msgsnd函數(shù)原型
msgsnd()為阻塞函數(shù),當消息隊列容量滿或消息個數(shù)滿會阻塞 。消息隊列已被刪除,則返回EIDRM錯誤;被信號中斷返回E_INTR錯誤 。
如果設(shè)置IPC_NOWAIT消息隊列滿或個數(shù)滿時會返回-1,并且置EAGAIN錯誤 。
msgsnd()解除阻塞的條件有以下三個條件:
① 不滿足消息隊列滿或個數(shù)滿兩個條件,即消息隊列中有容納該消息的空間 。
② msqid代表的消息隊列被刪除 。
③ 調(diào)用msgsnd函數(shù)的進程被信號中斷 。
4.msgrcv函數(shù)原型
redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用


msgrcv函數(shù)原型
msgrcv()解除阻塞的條件有以下三個:
① 消息隊列中有了滿足條件的消息 。
② msqid代表的消息隊列被刪除 。
③ 調(diào)用msgrcv()的進程被信號中斷 。
消息隊列使用程序范例
msgrcv.c
#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<stdio.h>struct msgbuf{long type;int groupid;int appid;char buf[1024];};int main(){int msgid;msgid=msgget(0x1000,IPC_CREAT | 0777);struct msgbuf mb;msgrcv(msgid,&mb,sizeof(struct msgbuf)-sizeof(long),1,0);printf("type: %dtgroupid: %dtappid: %dn", mb.type,mb.groupid, mb.appid);puts(mb.buf);}msgsnd.c
#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<stdio.h>struct msgbuf{long type;//類型int groupid;int appid;char buf[1024];};int main(){int msgid;msgid=msgget(0x1000,IPC_CREAT | 0777);struct msgbuf mb={1,1,1,"hello world"};int ret;ret=msgsnd(msgid,&mb,sizeof(struct msgbuf)-sizeof(long),0);//這里的長度不包括類型的大小}測試
redis是數(shù)據(jù)庫還是中間件 c#消息隊列實際應(yīng)用

推薦閱讀