程序間通訊 posix 訊息佇列

2021-10-03 22:58:36 字數 4366 閱讀 7365

posix訊息佇列

訊息佇列可以認為是乙個訊息鍊錶,某個程序往乙個訊息佇列中寫入訊息之前,不需要另外某個程序在該佇列上等待訊息的達到,這一點與管道和fifo相反。posix訊息佇列與system

v訊息佇列的區別如下:

對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 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...