如何知道程序在乙個空訊息佇列中放入乙個訊息?如果阻塞在msgrcv呼叫中,則除了等待無法做其他事情,如果給msgrcv指定非阻塞標誌(ipc_nowait),儘管不阻塞了,但必須持續呼叫該函式來確定何時有訊息到達,也就是採用輪詢方式(polling),posix訊息佇列允許非同步事件通知來通知何時有訊息放入到某個空訊息佇列中,有2種方式:
1)產生乙個訊號
2)建立乙個執行緒執行乙個指定函式
這通過mq_notify建立。
union si**al ;
struct sigevent ;
#include "unpipc.h"
volatile sig_atomic_t mqflag;
static void sig_usr1(int signo)
int main(int argc,char** ar**)
sigprocmask(sig_unblock,&newmask,null); }
exit(0); }
struct msqid_ds ;
msgget建立乙個新的訊息佇列或訪問乙個已經存在的訊息佇列
msgsnd傳送乙個訊息,訊息是下面這樣的結構體:
struct msgbuf ;
但這個預定的結構一般無法滿足自己的需求,因此一般定義自己的結構
typedef struct my_msgbuf
message;
傳送資料時可以指定flag為ipc_nowait,這個標誌使得msgsnd呼叫非阻塞,
呼叫msgrcv函式時,若type指定為0,則返回訊息佇列第乙個訊息,若type小於0,則返回型別值小於或等於type絕對值的訊息中型別值最小的
第乙個訊息
使用兩個訊息佇列來實現前面的客戶—伺服器例子,乙個佇列用於從客戶方到伺服器的訊息,乙個佇列用於從伺服器到客戶的訊息。
#include "unpipc.h"
#define mq_key1 1234l
#define mq_key2 2345l
int main()
int main()
第8節使用乙個佇列來實現單伺服器,多客戶端的通訊,但互斥,死鎖可能存在,另一種思路就是為每個實體單獨設定乙個私有佇列,訊息都傳送到自己的佇列中,也只從自己的佇列中取訊息.
system v的訊息佇列比posix訊息佇列差多了,要使用select模型同時處理網路連線和ipc連線時,必須產生子程序,使用管道作為中介,另外乙個弱點是無法peek乙個訊息.
《UNIX網路程式設計 卷2》讀書筆記(四)
include globals include unpipc.h define maxnitems 1000000 define maxnthreads 100 globals shared by threads int nitems read only by producer and consum...
Unix網路程式設計讀書筆記(二)
套接字位址結構 typedef uint32 t in addr t struct in addr struct sockaddr in 在使用結構前總是把整個結構置零,是由於sin zero欄位沒有任何作用,只需置零即可。為了是套接字函式在處理位址時具有一定的通用性,套接字函式還定義了通用套接字位...
UNIX網路程式設計卷2程序間通訊讀書筆記彙總
unix 網路程式設計卷 2程序間通訊讀書筆記 一 概述 網路程式設計卷 2程序間通訊讀書筆記 二 管道 1 網路程式設計卷 2程序間通訊讀書筆記 二 管道 2 網路程式設計卷 2程序間通訊讀書筆記 三 有名管道 1 網路程式設計卷 2程序間通訊讀書筆記 三 有名管道 2 網路程式設計卷 2程序間通...