posix訊息佇列
訊息佇列可以認為是乙個訊息鍊錶,某個程序往乙個訊息佇列中寫入訊息之前,不需要另外某個程序在該佇列上等待訊息的達到,這一點與管道和fifo相反。posix訊息佇列與systemv訊息佇列的區別如下:
對posix訊息佇列的讀總是返回最高優先順序的最早訊息,對system v訊息佇列的讀則可以返回任意指定優先順序的訊息。
當往乙個空佇列放置乙個訊息時,posix訊息佇列允許產生乙個訊號或啟動乙個執行緒,system v訊息佇列則不提供類似的機制。
3.system v訊息佇列可以通過ipcs檢視和ipcrm檢視或者刪除乙個訊息佇列,posix訊息佇列/dev/* 下可以檢視對應的訊息佇列
#include typedef int mqd_t;
mqd_t mq_open(const char *name, int oflag, ... /* mode_t mode, struct mq_attr *attr */);
返回: 成功時為訊息佇列描述字,出錯時為-1。
功能: 建立乙個新的訊息佇列或開啟乙個已存在的訊息的佇列。
#include int mq_close(mqd_t mqdes);
返回: 成功時為0,出錯時為-1。
功能: 關閉已開啟的訊息佇列。
#include int mq_unlink(const char *name)
返回: 成功時為0,出錯時為-1
功能: 從系統中刪除訊息佇列。
#include int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
int mq_setattr(mqd_t mqdes, const struct mq_attr *attr, struct mq_attr *attr);
均返回:成功時為0, 出錯時為-1
每個訊息佇列有四個屬性:
struct mq_attr
;
每個訊息均有乙個優先順序,它是乙個小於mq_prio_max的無符號整數
#define mq_prio_max 32768
#include int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio);
返回:成功時為0,出錯為-1
ssize_t mq_receive(mqd_t mqdes, char *ptr, size_t len, unsigned int *priop);
返回:成功時為訊息中的位元組數,出錯為-1
訊息佇列的限制:
mq_open_max : 乙個程序能夠同時擁有的開啟著訊息佇列的最大數目mq_prio_max : 任意訊息的最大優先順序值加1
#include int mq_notify(mqd_t mqdes, const struct sigevent *notification);
返回: 成功時為0,出錯時為-1
功能: 給指定佇列建立或刪除非同步事件通知
union si**al
;struct sigevent
*/ int sigev_signo; /* signal number if sigev_signal */
union si**al sigev_value; /* passed to signal handler or thread */
void (*sigev_notify_function)(union si**al);
pthread_attr_t *sigev_notify_attribute;
};
非同步訊號安全函式
#include int sigwait(const sigset_t *set, int *sig);
posxi實時訊號
訊號可劃分為兩大小組:其值在sigrtmin和sigrtmax之間(包括兩者在內)的實時訊號。
所有其他訊號:sigalrm, sigint, sigkill等等。
void func(int signo, siginfo_t *info, void *context);
typedef struct
*/ union si**al si_value; /* integer or pointer value from sender */
} siginfo_t;
程式1:建立乙個訊息佇列,其名字是作為命令列引數指定,訊息佇列建立成功後輸出佇列的屬性。程式如下:
#include #include #include #include #include #include #include#define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth)
int main(int argc,char *ar**)
}if(optind != argc-1)
if((mqd = mq_open(ar**[optind],flags,file_mode,null)) == -1)
mq_getattr(mqd,&attr);
printf("max #msgs = %ld,max #bytes/msg = %ld,#currently on queue = %ld\n",
attr.mq_maxmsg,attr.mq_msgsize,attr.mq_curmsgs);
mq_close(mqd);
exit(0);
}
編譯執行:
gcc -o create_msg create_msg.c -lrt
./create_msg /msgqueue_test -e
create mqueue.
max #msgs = 10,max #bytes/msg = 8192,#currently on queue = 0
程式2:練習mq_send和mq_receive函式,呼叫mqsend程式向訊息佇列中寫入訊息,呼叫mqreceive程式從訊息佇列中讀取訊息。程式如下所示:
mq_send.c
#include #include #include #include #include #include #includetypedef unsigned int uint_t;
int main(int argc,char *ar**)
len = atoi(ar**[2]);
prio = atoi(ar**[3]);
mqd = mq_open(ar**[1],o_wronly);
ptr = calloc(len,sizeof(char));
if(mq_send(mqd,ptr,len,prio) == -1)
exit(0);
}
mq_receive.c
#include #include #include #include #include #include #includetypedef unsigned int uint_t;
int main(int argc,char *ar**)
}if(optind != argc-1)
mqd = mq_open(ar**[optind],flags);
mq_getattr(mqd,&attr);
buff = malloc(attr.mq_msgsize);
if((n = mq_receive(mqd,buff,attr.mq_msgsize,&prio)) == -1)
printf("read %ld bytes,priority = %u\n",(long) n,prio);
exit(0);
}
程式執行結果:
其中最後兩條, 設定阻塞或者非阻塞從訊息佇列讀取資料的情況.
程序間訊息佇列通訊
要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...
程序間通訊(訊息佇列)
在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...
程序間通訊 訊息佇列
有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...