unix兩大貢獻者貝爾實驗室和bsd,在程序之間通訊側重不同,前者基於核心對程序之間的通訊手段進行了改進,形成了「system v ipc」,而後者則是基於網路形成了套接字。
而posix則是ieee制定的標準,目的是為執行在不同作業系統上的軟體提供統一的介面,實現者則是不同的作業系統核心開發人員。
在訊號量這種常用的同步互斥手段方面,posix在無競爭條件下是不會陷入核心的,而system v則是無論何時都要陷入核心,因此效能稍差。
posix訊號量**於posix技術規範的實時擴充套件方案(posix realtime extension),常用於執行緒;system v訊號量,常用於程序的同步。這兩者非常相近,但它們使用的函式呼叫各不相同。前一種的標頭檔案為semaphore.h,函式呼叫為sem_init(),sem_wait(),sem_post(),sem_destory()等等。後一種標頭檔案為,函式呼叫為semctl(),semget(),semop()等函式。
功能:用來建立和訪問乙個訊息佇列
原型:mqd_t mq_open(const cahr *name,int oflag);
mqd_t mq_open(const char *name,int oflag,mode_t mode,struct mq_attr *attr);
引數name:表示訊息佇列的名字,它符合posix ipc的名字規則。
oflag:表示開啟的方式,和open函式的類似。有必須的選項:o_rdonly,o_wronly,o_rdwr,還有可選 項: o_nonblock,o_creat,o_excl。
attr:也是乙個可選引數,在oflag中含有o_creat標誌且訊息佇列不存在時才需要。該引數用於給新佇列設定某些屬性,如果是空指標,那麼就採用預設屬性。
返回值:
成功返回訊息佇列檔案描述符;失敗返回-1
cd /dev/mqueue
ls說明:
建立成功後在/dev/mqueue目錄下檢視
**
#include #include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
int main(void)
說明:
posix ipc名字有限定,必須以/打頭,並且後續不能有其它/,比如/abc
長度不能超過name_max
功能:關閉訊息佇列
原型:mqd_t mq_close(mqd_t mqdes);
引數mqdes:訊息佇列描述符
返回值:
成功返回0,失敗返回-1
功能:獲取/設定訊息佇列屬性
原型:mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr);
mqd_t mq_setattr(mqd_t mqdes, struct mq_attr *newattr, struct mq_attr *oldattr);
引數:newattr:要設定的屬性
oldattr:原來的屬性
返回值:
成功返回0,失敗返回-1
說明:
struct mq_attr
;
**
#include #include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
int main(void)
功能:
傳送訊息
原型:mqd_t mq_send(mqd_t mqdes, const char *msg_ptr,size_t msg_len, unsigned msg_prio);
引數mqdes:訊息佇列描述符
msg_ptr:指向訊息的指標
msg_len:訊息長度
msg_prio:訊息優先順序
返回值:
成功返回0,失敗返回-1
**
typedef struct stu
stu;
int main(int argc,char *argv)
mqd_t mqid;
//開啟乙個訊息佇列
mqid=mq_open("/abc",o_wronly);
if(mqid==(mqd_t)-1)
err_exit("mq_open");
stu stu;
strcpy(stu.name,"test");
stu.age=20;
unsigned prio=atoi(argv[1]);
mq_send(mqid,(const char*)&stu,sizeof(stu),prio);
mq_close(mqid);
return 0;
mq_close(mqid);
return 0;
}
功能:
接收訊息
原型:mqd_t mq_receive(mqd_t mqdes, char *msg_ptr,size_t msg_len, unsigned *msg_prio);
引數mqdes:訊息佇列描述符
msg_ptr:返回可接受到的訊息的指標
msg_len:訊息長度,要指定訊息的最大值
msg_prio:返回接收到的訊息優先順序
返回值:
成功返回接收到的訊息位元組數,失敗返回-1
注意:返回指定訊息佇列中最高優先順序的最早訊息
**
typedef struct stu
stu;
int main(int argc,char *argv)
功能:
建立或刪除到達通知事件,當訊息佇列從沒有訊息到有訊息,就會通知程序()。
原型:mqd_t mq_notify(mqd_t mqdes,const struct
sigevent* notification);
引數:mqdes:訊息佇列描述符
notification:
非空表示當訊息到達且訊息佇列先前為空,那麼將得到通知
null:表示撤銷已註冊的通知
union sigval;
struct sigevent;
返回值:
成功返回0,失敗返回-1
通知方式:
產生乙個訊號
建立乙個執行緒執行乙個指定的函式
**
#include #include #include #include #include #include #include #include #include #include #include #include #define err_exit(m) \
do \
while(0)
typedef struct stu
stu;
size_t size;
mqd_t mqid;
struct sigevent sigev;
void handle_sigusr1(int sig)
int main(int argc,char *argv)
mq_notify注意
1.任何時刻只能有乙個程序可以被註冊為接收某個給定佇列的通知
2.當有乙個訊息到達某個先前為空的佇列,而且已有乙個程序被註冊為接收該佇列的通知,只有沒有任何執行緒阻塞在該佇列的mq_receive呼叫的前提下,通知才會發出。
3.當通知被傳送到它的註冊程序時,其註冊被撤銷。程序必須再次呼叫mq_notify以重新註冊(如果需要的話),重新註冊要放在訊息佇列讀出資訊之前而不是之後。
POSIX訊息佇列
訊息佇列可認為是乙個訊息鍊錶,有寫許可權的執行緒可以往訊息佇列中寫訊息,有讀許可權的執行緒可以從佇列中讀取訊息,從而實現資料共享。每個訊息都是一條記錄,具有以下屬性 優先順序 無符號整數或長整數型別 訊息的資料部分長度 資料本身。1 相關函式 標頭檔案 include 建立和開啟 mqd t mq ...
Posix訊息佇列
posix訊息佇列與system v訊息佇列的主要差別 1 對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列的讀則可以返回任意指定優先順序的訊息 2 當往乙個空佇列放置乙個訊息時,posix訊息佇列允許產生乙個訊號或啟動乙個執行緒,system v訊息佇列則不提供類...
posix 訊息佇列
posix 訊息佇列 訊息佇列的使用 1.建立訊息佇列mq open const char name,int oflag,mode t mode,struct mq attr attr name 訊息佇列的名稱,以 開頭 oflag 標誌,o rdonly 唯讀 o wronly 只寫 o rdwr...