1. 程式人生 > >C語言 訊息佇列

C語言 訊息佇列

訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然POSIX 1003.1b在訊號的實時性方面作了拓廣,使得訊號在傳遞資訊量方面有了相當程度的改進,但是訊號這種通訊方式更像"即時"的通訊方式,它要求接受訊號的程序在某個時間範圍內對訊號做出反應,因此該訊號最多在接受訊號程序的生命週期內才有意義,訊號所傳遞的資訊是接近於隨程序持續的概念(process-persistent);管道及有名管道則是典型的隨程序持續IPC,並且,只能傳送無格式的位元組流無疑會給應用程式開發帶來不便,另外,它的緩衝區大小也受到限制。
訊息佇列就是一個訊息的連結串列。可以把訊息看作一個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向訊息佇列中按照一定的規則新增新訊息;對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。訊息佇列是隨核心持續的。

目前主要有兩種型別的訊息佇列:POSIX訊息佇列以及系統V訊息佇列,系統V訊息佇列目前被大量使用。考慮到程式的可移植性,新開發的應用程式應儘量使用POSIX訊息佇列。
系統V訊息佇列是隨核心持續的,只有在核心重起或者顯式刪除一個訊息佇列時,該訊息佇列才會真正被刪除。因此係統中記錄訊息佇列的資料結構(struct ipc_ids msg_ids)位於核心中,系統中的所有訊息佇列都可以在結構msg_ids中找到訪問入口。 訊息佇列就是一個訊息的連結串列。每個訊息佇列都有一個佇列頭,用結構struct msg_queue來描述。佇列頭中包含了該訊息佇列的大量資訊,包括訊息佇列鍵值、使用者ID、組ID、訊息佇列中訊息數目等等,甚至記錄了最近對訊息佇列讀寫程序的ID。讀者可以訪問這些資訊,也可以設定其中的某些資訊。


傳送端

/*************************************************************************
	> File Name: msg_send.c
	> Author: kid
	> Mail: [email protected] 
	> Created Time: 2014年03月01日 星期六 23時15分47秒
 ************************************************************************/

#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<linux/msg.h>
#define MAXMSG 512
struct my_msg   //訊息佇列結構體
{
	long int my_msg_type;
	int i;
	char some_text[MAXMSG];
}msg;
main()
{
	int msgid;
	char buffer[BUFSIZ];
	msgid=msgget(12,0666|IPC_CREAT);  //建立訊息佇列

	while(1){
		puts("Enter some text:");
		fgets(buffer,BUFSIZ,stdin);
		msg.i++;
		printf("i=%d\n",msg.i);
		msg.my_msg_type=3;
		strcpy(msg.some_text,buffer);
		msgsnd(msgid,&msg,MAXMSG,0);   //傳送資料到緩衝區
		if(strncmp(msg.some_text,"end",3)==0){   //比較輸入,若為end則跳出迴圈
		    break;
        }
    }
	exit(0);
}

接收端

/*************************************************************************
	> File Name: msg_receive.c
	> Author: kid
	> Mail: [email protected] 
	> Created Time: 2014年03月01日 星期六 23時24分02秒
 ************************************************************************/

#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<linux/msg.h>

#define MAXMSG 512
struct my_msg
{
	long int my_msg_type;
	int i;
	char some_text[MAXMSG];
}msg;
main()
{
	int msgid;
	msg.my_msg_type=3;
	msgid=msgget(12,0666|IPC_CREAT);
	while(1)
	{
		msgrcv(msgid,&msg,BUFSIZ,msg.my_msg_type,0);
		printf("You wrote:%s and i=%d\n",msg.some_text,msg.i);
		if(strncmp(msg.some_text,"end",3)==0)
			break;
	}
	msgctl(msgid,IPC_RMID,0);
	exit(0);
}

相關推薦

C語言 訊息佇列

訊息佇列(也叫做報文佇列)能夠克服早期unix通訊機制的一些缺點。作為早期unix通訊機制之一的訊號能夠傳送的資訊量有限,後來雖然POSIX 1003.1b在訊號的實時性方面作了拓廣,使得訊號在傳遞資訊量方面有了相當程度的改進,但是訊號這種通訊方式更像"即時"的通訊方式,

C語言_佇列的基本操作

本片部落格主要內容: 建立新結點 初始化佇列 入佇列 出佇列 返回對頭元素 返回隊尾元素 計算佇列長度 判斷佇列是否為空,為空返回1,否則返回零 ###1、初始化佇列 void QueueInit (Queue* q) //初始化佇列 { QNode *cur =

C語言--迴圈佇列實現

#include <stdio.h> #include <malloc.h> #include <stdlib.h> /* 迴圈佇列 */ typedef struct Queue { int *p_base; int front; int rear; }

c語言實現佇列舉例

標頭檔案 /* * my_queue.h * * Created on: Dec 3, 2018 * Author: lgh */ #ifndef INCLUDE_MY_QUEUE_H_ #define INCLUDE_MY_QUEUE_H_ #include <std

ACMNO.20 C語言-插入佇列 已有一個已排好的9個元素的陣列,今輸入一個數要求按原來排序的規律將它插入陣列中。 輸入 第一行,原始數列。 第二行,需要插入的數字。

題目描述 已有一個已排好的9個元素的陣列,今輸入一個數要求按原來排序的規律將它插入陣列中。 輸入 第一行,原始數列。 第二行,需要插入的數字。 輸出 排序後的數列 樣例輸入 1 7 8 17 23 24 59 62 101 50 樣例輸出 1

c語言佇列結構

1.什麼是佇列 佇列是一種操作受限的線性表,其限制條件為允許在表的一端進行插入,而在表的另一端進行刪除。插入的一端叫做隊尾,刪除的一端叫做隊頭。向佇列中插入新元素的行為稱為進隊,從佇列中刪除元素的行為

C語言佇列演示(佇列的幾個函式)

/* * 佇列演示(佇列的幾個函式) * */ typedef struct { int arr[SIZE]; int head; //記錄最前面數字所在的下標 int tail; //記錄最後一個有效數字的下一個座標

C語言一個佇列的實現

佇列也是常用的資料結構之一,下面給出一個鏈式佇列的實現~~ 標頭檔案Queue.h [cpp]  view plain copy #ifndef Queue_H&n

C語言實現佇列的順序儲存

佇列  #1. 佇列不得和棧比較,棧是一種先進後出的線性表,而佇列是一種先進先出 (first in first out,縮寫 FIFO) 的線性表.  #2. 它只允許在表的一端進行插入,而在另一端刪除元素。  #3. 在佇列中插入的一端為隊尾(rear),允

資料機構 C語言實現佇列(含程式碼詳解 易懂)

/* 數學模型參照《大話資料結構》佇列部分   !!!取餘運算實現佇列迴圈!!! */ #include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h>

C#分散式訊息佇列 EQueue 2.0 釋出啦

前言 最近花了我幾個月的業餘時間,對EQueue做了一個重大的改造,訊息持久化採用本地寫檔案的方式。到現在為止,總算完成了,所以第一時間寫文章分享給大家這段時間我所積累的一些成果。 昨天,我寫過一篇關於EQueue 2.0效能測試結果的文章,有興趣的可以看看。 為什麼要改為檔案儲存? SQL

c#開源訊息佇列中介軟體EQueue 教程

一、簡介 EQueue是一個參照RocketMQ實現的開源訊息佇列中介軟體,相容Mono,具體可以參看作者的文章《分享一個c#寫的開源分散式訊息佇列equeue》。專案開源地址:https://github.com/tangxuehua/equeue,專案中包含了佇列

C#操作訊息佇列

public class QueueManage { /// /// 傳送物件到佇列中 /// /// 佇列名稱,因為佇列名稱在一個應用中應該不改變的,所以大家最好寫在配置檔案中 /// 要發出去的物件 public static void SendQueue(string

linux c語言實現佇列及用於生產者消費者模型

c語言沒有佇列的資料結構,需要自己實現//myqueue.h #ifndef __MYQUEUE_H__ #define __MYQUEUE_H__ #include <stdio.h> #include <stdlib.h> #define T

C語言佇列

佇列的定義及其運算1、定義      佇列(Queue)是隻允許在一端進行插入,而在另一端進行刪除的運算受限的線性表。          (1)允許刪除的一端稱為隊頭(Front)。   (2)允許插入的一端稱為隊尾(Rear)。   (3)當佇列中沒有元素時稱為空佇

linux c++ 迴圈訊息佇列寫法

很多場合,我們需要一個迴圈訊息處理模式,一個執行緒產生訊息,一個執行緒進行處理。產生訊息的執行緒就不用阻塞了,可以用了幹其他的事情了。常見串列埠或者網路通訊,負責解析位元組流的執行緒將訊息初步解析然後放置到一個訊息佇列裡面,處理執行緒負責迴圈取出訊息佇列裡面的訊息進行相應的

C語言中用佇列和搜尋解決"加1乘2平方問題"

描述 給定兩個正整數m、n,問只能做加1、乘2和平方這三種變化,從m變化到n最少需要幾次 輸入 輸入兩個10000以內的正整數m和n,且m小於n 輸出 輸出從m變化到n的最少次數 輸入樣例 1 16 輸出樣例

asp.net c# 通過訊息佇列處理高併發請求(以搶小米手機為例)

  網站面對高併發的情況下,除了增加硬體, 優化程式提高以響應速度外,還可以通過並行改序列的思路來解決。這種思想常見的實踐方式就是資料庫鎖和訊息佇列的方式。這種方式的缺點是需要排隊,響應速度慢,優點是節省成本。 演示一下現象 建立一個在售產品表 CREATE TABLE [dbo].[product](

Windows訊息佇列c語言

題目描述 訊息佇列是Windows系統的基礎。對於每個程序,系統維護一個訊息佇列。如果在程序中有特定事件發生,如點選滑鼠、文字改變等,系統將把這個訊息加到隊列當中。同時,如果佇列不是空的,這一程序迴圈地從佇列中按照優先順序獲取訊息。請注意優先順序值低意味著優先順

C語言】【unix c】兩個程序通過訊息佇列實現程序間的通訊

send.c: #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>