1. 程式人生 > >linux網路程式設計之POSIX訊息佇列

linux網路程式設計之POSIX訊息佇列

POSIX IPC名字限定:

必須以/打頭,並且後續不能有其它/ ,形如/somename

長度不能超過NAME_MAX

通過下面的命令將訊息佇列掛載到/dev/mqueue下,可通過cat/dev/mqueue/name檢視訊息佇列狀態

mount -t mqueue none /dev/mqueue

mq_open函式:

功能:用來建立和訪問一個訊息佇列

原型

mqd_t mq_open(const char *name, int oflag);

mqd_t mq_open(const char *name, int oflag, mode_tmode, struct mq_attr *attr);

引數

name: 某個訊息佇列的名字

oflag:與open函式類似,可以是O_RDONLY、O_WRONLY、O_RDWR,還可以按位或上O_CREAT、O_EXCL、O_NONBLOCK等。

mode:如果oflag指定了O_CREAT,需要設定mode。

返回值:成功返回訊息佇列檔案描述符;失敗返回-1

mq_unlink函式:

功能:刪除訊息佇列

原型

mqd_t mq_unlink(const char *name);

引數

name: 訊息佇列的名字

返回值:成功返回0;失敗返回-1

mq_getattr/mq_setattr函式:

功能:獲取/設定訊息佇列屬性

原型

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);

返回值:成功返回0;失敗返回-1

mq_attr結構體:

struct mq_attr {

    longmq_flags;    /* Flags: 0 or O_NONBLOCK */

    longmq_maxmsg;   /* Max. # of messages onqueue */

    longmq_msgsize;  /* Max. message size (bytes)*/

    longmq_curmsgs;  /* # of messages currently inqueue */

};

mq_send函式:

功能:傳送訊息

原型

mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_tmsg_len, unsigned msg_prio);

引數

mqdes:訊息佇列描述符

msg_ptr:指向訊息的指標

msg_len:訊息長度

msg_prio:訊息優先順序

返回值:成功返回0;失敗返回-1

mq_receive函式:

功能:接收訊息

原型

ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_tmsg_len, unsigned *msg_prio);

引數

mqdes:訊息佇列描述符

msg_ptr:返回接收到的訊息

msg_len:訊息長度

msg_prio:返回接收到的訊息優先順序

返回值:成功返回接收到的訊息位元組數;失敗返回-1

注意:返回指定訊息佇列中最高優先順序的最早訊息

mq_notify函式:

功能:建立或者刪除訊息到達通知事件

原型

mqd_t mq_notify(mqd_t mqdes, const struct sigevent*notification);

引數

mqdes:訊息佇列描述符

notification:

非空表示當訊息到達且訊息佇列先前為空,那麼將得到通知;

NULL表示撤消已註冊的通知

返回值:成功返回0;失敗返回-1

通知方式:

產生一個訊號

建立一個執行緒執行一個指定的函式

union sigval {         /* Data passed with notification */

    int     sival_int;   /*Integer value */

    void   *sival_ptr;   /*Pointer value */

};

struct sigevent {

    int          sigev_notify; /* Notification method */

    int          sigev_signo;  /* Notification signal */

    union sigval  sigev_value;  /*Data passed with notification */

    void       (*sigev_notify_function) (union sigval);

                  /*Function for thread notification */

    void       *sigev_notify_attributes;

                  /*Thread function attributes */

};

mq_notify注意:

任何時刻只能有一個程序可以被註冊為接收某個給定佇列的通知

當有一個訊息到達某個先前為空的佇列,而且已有一個程序被註冊為接收該佇列的通知時,只有沒有任何執行緒阻塞在該佇列的mq_receive呼叫的前提下,通知才會發出。

當通知被髮送給它的註冊程序時,其註冊被撤消。程序必須再次呼叫mq_notify以重新註冊(如果需要的話),重新註冊要放在從訊息佇列讀出訊息之前而不是之後。

相關推薦

linux網路程式設計POSIX訊息佇列

POSIX IPC名字限定: 必須以/打頭,並且後續不能有其它/ ,形如/somename 長度不能超過NAME_MAX 通過下面的命令將訊息佇列掛載到/dev/mqueue下,可通過cat/dev/mqueue/name檢視訊息佇列狀態 mount -t mqueue

linux網路程式設計POSIX 訊息佇列 和 系列函式

#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>#include<unistd.h>#includ

linux c程式設計Posix訊息佇列

 Posix訊息佇列可以認為是一個訊息連結串列. 有足夠寫許可權的執行緒可以往佇列中放置訊息, 有足夠讀許可權的執行緒可以從佇列中取走訊息 在某個程序往一個佇列寫入訊息前, 並不需要另外某個程序在該佇列上等待訊息的到達. 這跟管道和FIFO是相反的, 因為

linux網路程式設計POSIX 共享記憶體和 系列函式

在前面介紹了system v 共享記憶體的相關知識,現在來稍微看看posix 共享記憶體 和系列函式。 共享記憶體簡單來說就是一塊真正的實體記憶體區域,可以使用一些函式將這塊區域對映到程序的地址空間進行讀寫,而posix 共享記憶體與system v 共享記憶體不同的是它是

linux網路程式設計posix 執行緒(四):posix 條件變數與互斥鎖 示例生產者--消費者問題

#include <unistd.h>#include <sys/types.h>#include <pthread.h>#include <semaphore.h>#include <stdlib.h>#include <stdio.h>

Linux程序間通訊POSIX訊息佇列

訊息佇列可認為是一個訊息連結串列,它允許程序之間以訊息的形式交換資料。有足夠寫許可權的程序或執行緒可往佇列中放置訊息,有足夠讀許可權的程序或執行緒可從佇列中取走訊息。每個訊息都是一個記錄,它由傳送者賦予一個優先順序。與管道不同,管道是位元組流模型,沒有訊息邊界。

linux IPCPOSIX訊息佇列

1.POSIX概述         前面已經學習了LINUX程序通訊方式的程序和FIFO兩種方式,但是POSIX是與之前兩種不同的方式,主要區別呢,在於使用管道和FIFO的時候,在寫入管道之前,應該有一個程序已經做好了讀的準備,它呢是以無格式的位元組流的方式進行通訊的,如果

linux 網路程式設計廣播

linux 網路程式設計之廣播 轉載:https://blog.csdn.net/qdlovecsj/article/details/8805483 廣播方式主要是指使用UDP套介面傳送資料,傳送資料的目標地址不是普通的地址,而是所指定網路的廣播地址。 什麼是廣播地址?是指IP地

Linux網路程式設計TCP程式設計

直接上程式碼如下所示: 1、標頭檔案定義 #ifndef __HEAD_NET_H__ #define __HEAD_NET_H__ #include <stdio.h> #include <string.h> #include <stdlib.h>

Linux網路程式設計IO模型

本文基於IO訪問中存在的兩個階段詳細介紹了Linux產生的五種IO模型。 上篇文章回顧: 小米開源監控Open-Falcon收錄汽車之家貢獻的Win版Agent 同步與非同步 同步是指一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後

linux網路程式設計多程序併發伺服器

1)使用多程序併發伺服器考慮的因素:       (1)父程序描述最大檔案描述符的個數(父程序需要關閉accept返回的新檔案描述符)       (2)系統內可建立程序的個數(與記憶體大小相關)       (3)程序建立過多是否降低整體服務效能 2)多程序建立併發

linux網路程式設計TCP狀態轉換及埠複用

(1)TCP狀態轉換圖               其中圖中分為三種狀態:實線代表的主動發起連線,虛線代表的被動發起連線,細實線代表的可以雙向發起連線的狀態。 主動發起連線方狀態變化:1)主動發起連線的一方傳送SYN標誌位,進入SYN_SENT狀態,等待接收被髮起連線方

Linux網路程式設計高階併發伺服器(轉)

1. 介紹 在上一節,我們介紹了Linux簡單的併發伺服器,通過在伺服器端建立多個子程序,來接收客戶端的請求,實現併發處理,但這種方式明顯有缺陷,伺服器並不知道客戶端請求的數量,所以事先建立的程序數不好確定。所以,這裡介紹三種高階併發伺服器模式。第一種是伺服器端統一

linux網路程式設計TCP介面詳解

socket int socket(int domain, int type, intprotocol);     監聽套接字描述符由socket建立,隨後用作bind和listen的第一個引數。一個伺服器通常僅建立一個監聽套接字,他在該伺服器的生命週期內一直存在。 c

linux網路程式設計用socket實現簡單客戶端和服務端的通訊(基於TCP)

一、介紹基於TCP協議通過socket實現網路程式設計常用API 1、讀者如果不是很熟悉,可以先看我之前寫的幾篇部落格,有socket,地址結構的理解,更加方便讀者理解 地址分別是: 2、socket(TCP)程式設計API簡介 1)、socket int s

linux網路程式設計RTP協議

以下內容取自: 本機通訊:https://www.cnblogs.com/lidabo/p/4160138.html(RTP協議傳輸)https://www.cnblogs.com/lidabo/p/4160145.html(RTP協議傳輸) 非本機:http://velep.com/arc

linux網路程式設計用socket實現簡單客戶端和服務端的通訊(基於UDP)

1、sendto和recvfrom函式介紹 sendto(經socket傳送資料) 相關函式 send , sendmsg,recv , recvfrom , socket 表頭檔案 #include < sys/types.h >#includ

Linux網路程式設計 大小端初探

    首先解釋一下大小端的概念。    大端(Big Endian),同時也是網路序,是資料在網路上傳輸的一種資料組織格式,其儲存的方式比較符合人們讀寫的習慣。    小端(Little Endian

linux網路程式設計伺服器

基於tcp協議的網路程式 1.所用函式: socket函式 socket()開啟一個網路埠,如果成功,就像open()一樣返回一個檔案描述符,應用程式可以像讀寫檔案一樣用read/write在網路上首發資料,如果調用出錯返回-1 bind函式:

Linux網路程式設計高階併發伺服器

在上一節,我們介紹了Linux簡單的併發伺服器,通過在伺服器端建立多個子程序,來接收客戶端的請求,實現併發處理,但這種方式明顯有缺陷,伺服器並不知道客戶端請求的數量,所以事先建立的程序數不好確定。所以,這裡介紹三種高階併發伺服器模式。第一種是伺服器端統一accept,接收