Linux下的訊息佇列MsgQueue
server檔案執行時先收訊息再發訊息,但是server.c中建立了訊息佇列,所以先執行server
client檔案執行時先發訊息再收訊息
執行結果:開啟兩個terminal分別進行
comm.h標頭檔案
1 #ifndef _COMM_H_
2 #define _COMM_H_
3
4
5 #include<stdio.h>
6 #include<sys/types.h>
7 #include<sys/ipc.h>
8 #include<sys/msg.h>
9 #include<string.h>
10
11 #define SERVER 1
12 #define CLIENT 2
13
14 #define PATHNAME "."
15 #define PROJ_ID 0x6666
16
17 struct msgbuf
18 {
19 long mtype;
20 char mtext[1024];
21 };
22
23 int creat(); //建立訊息佇列
24 int send(int msgid,int who,char*msg); //傳送訊息
25 int recv(int msgid,int type,char out[]); //接收訊息
26 int destory(int msgid); //銷燬訊息佇列
27 int get(); //獲得訊息佇列的識別符號
28 #endif
comm.c
1 #include"comm.h"
2
3 static int com(int flags)
4 {
5 key_t key=ftok(PATHNAME,PROJ_ID);
6 if(key<0)
7 {
8 perror("ftok");
9 return -1;
10 }
11 int msgid=msgget(key,flags);
12 if(msgid<0)
13 {
14 perror("msgget");
15 return -2;
16 }
17 return msgid;
18 }
19
20 int creat()
21 {
22 return com(IPC_CREAT|IPC_EXCL|0666);
23 }
24
25 int destory(int msgid)
26 {
27 if(msgctl(msgid,IPC_RMID,NULL)<0)
28 {
29 perror("msgctr");
30 return -1;
31 }
32 }
33
34 int get()
35 {
36 return com(IPC_CREAT);
37 }
38
39 int send(int msgid,int who,char *msg)
40 {
41 struct msgbuf buf;
42 buf.mtype=who;
43 strcpy(buf.mtext,msg);
44 if(msgsnd(msgid,(void*)&buf,sizeof(buf.mtext),0)<0)
45 {
46 perror("msgsnd");
47 return -1;
48 }
49 }
50
51 int recv(int msgid,int type,char out[])
52 {
53 struct msgbuf buf;
54 if(msgrcv(msgid,(void*)&buf,sizeof(buf.mtext),type,0)<0)
55 {
56 perror("msgrcv");
57 return -1;
58 }
59 strcpy(out,buf.mtext);
60 return 0;
61 }
62
server.c
1 #include"comm.h"
2
3 int main()
4 {
5 int msgid=creat();
6 char buf[1024];
7 while(1)
8 {
9 buf[0]=0;
10 recv(msgid,CLIENT,buf);
11 printf("clien say #%s\n",buf);
12
13 printf("please enter#");
14 fflush(stdout);
15 ssize_t s=read(0,buf,sizeof(buf)-1);
16 if(s>0)
17 {
18 buf[s]=0;
19 send(msgid,SERVER,buf);
20 }
21 }
22 destory(msgid);
23 return 0;
24 }
client.c
1 #include"comm.h"
2
3 int main()
4 {
5 int msgid=get();
6 char buf[1024];
7 while(1)
8 {
9 buf[0]=0;
10 printf("please enter#");
11 fflush(stdout);
12 ssize_t s=read(0,buf,sizeof(buf)-1);
13 if(s>0)
14 {
15 buf[s]=0;
16 send(msgid,CLIENT,buf);
17 }
18
19 recv(msgid,SERVER,buf);
20 printf("server say#%s\n",buf);
21 }
22 return 0;
23 }
24
Makefile.c
1 .PHONY:all
2 all:server client
3 server:server.c comm.c
4 gcc -o [email protected] $^
5 client:client.c comm.c
6 gcc -o [email protected] $^
7 .PHONY:clean
8 clean:
9 rm -f server cli
相關推薦
Linux下的訊息佇列MsgQueue
server檔案執行時先收訊息再發訊息,但是server.c中建立了訊息佇列,所以先執行server client檔案執行時先發訊息再收訊息 執行結果:開啟兩個terminal分別進行 comm.h標頭檔案 1 #ifndef _COMM_H_ 2 #define
Linux作業系統--訊息佇列
1、訊息佇列的特點 (1)訊息佇列是訊息的連結串列,具有特定的格式,存放在記憶體中並由訊息佇列識別符號標識. (2)訊息佇列允許一個或多個程序向它寫入與讀取訊息. (3)管道和命名管道都是通訊資料都是先進先出的原則。 (4)訊息佇列可以實現訊息的隨機查詢,訊息不一定要
網際網路業務場景下訊息佇列架構
訊息佇列作為一種基礎的抽象資料結構,被廣泛應用在各類程式設計與系統設計中。 同步VS非同步 通訊的一個基本問題是:發出去的訊息什麼時候需要被接收到?這個問題引出了兩個基礎概念:“同步通訊”和“非同步通訊”。根據理論抽象模型,同步通訊和非同步通訊最本質的差別來自於時鐘機制的有無。同步通訊的雙方需要一個校
linux中訊息佇列
訊息佇列 1.建立新訊息佇列或取得已存在訊息佇列 原型:int msgget(key_t key, int msgflg);引數:key:可以認為是一個埠號,也可以由函式ftok生成。 msgflg: IPC_CREAT:如果IPC不存在,則建立一個IPC資源,否則開啟
linux中訊息佇列kfifo和訊號量sem_t的用法
使用kfifo和sem_t配合來實現訊息佇列:由sem來管理目前可以傳送和接收的總的訊息數,由kfifo來儲存訊息。具體實現起來就是定義訊號量sem_t_send和sem_t_recv,sem_t_send設為max_num,sem_t_recv設為0。
Linux POSIX 訊息佇列
程式執行時,服務程序阻塞於mq_receive,客戶程序每發一條訊息佇列,服務程序都會從mq_receive處返回,但不一定接收到的訊息就是客戶程序最近傳送的那一條訊息,因為客戶程序往訊息佇列中新增訊息時會按照優先順序來排序,如果客戶程序同時向訊息佇列新增多條訊息,服務程序還未來得及讀取,那麼
Linux之訊息佇列機制
一.訊息佇列先知 其實,訊息佇列與命名管道有很多相似之處,但少了在開啟和關閉管道方面的複雜性。但使用訊息佇列應為解決我們在,命名管道時遇到的一些問題,比如管道的阻塞問題。 訊息佇列提供了一種子啊兩個
對Linux中訊息佇列和訊號量集合的理解
訊息佇列和訊號量集合同樣作為程序間通訊的重要手段,是LInux程式設計必需理解的內容,但兩者類似的操作和檔案結構讓很多人不能理解其中的原理。下面我來介紹下我的理解: 在使用訊息佇列和訊號量集合前都必須使用的一個函式Key_t ftok(char *pathname,char
linux(deepin15.4)下部署叢集RabbitMQ訊息佇列映象模式(三)
第三天 一、映象佇列策略 1、映象佇列可以防止主節點掛掉,整個佇列就癱瘓了。所以要想在主節點掛掉或故障也能正常應用,就要複製佇列內容到叢集裡的每個節點,須要建立映象佇列。 2、映象模式配置完成之後,會存在一個主節點和多個映象節點(或稱為熱備佇列,Slave
Linux 下開源訊息佇列系統 RabbitMQ 安裝使用
RabbitMQ 是最流行的開源訊息佇列系統,它是在在 AMQP (一個提供統一訊息服務的應用層標準高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計) 基礎上完成的,可複用的企
linux修改POSIX訊息佇列(msgqueue)的各項限制(最大記憶體、msg_max、msgsize_max、queues_max)
1.進入 目錄 /proc/sys/fs/mqueue/,檢視各項訊息佇列的預設max設定: [[email protected] ~]# ls -l /proc/sys/fs/mqueue/ total 0 -rw-r--r-- 1 root root 0 Au
Linux系統下-程序間通訊(訊息佇列-詳解)
Linux下程序間通訊方式: # 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。 # 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序
52.Linux/Unix 系統程式設計手冊(下) -- POSIX 訊息佇列
1.概述 fork() 子程序會接收其父程序的訊息佇列描述符的副本,並且這些描述符會引用同樣的開啟著的訊息佇列的描述。子程序不會 繼承其父程序的任何訊息通知註冊。 當一個程序執行了 exec() 或終止時,所有其開啟的訊息佇列描述符會被關閉。關閉訊息佇列描述符的結
Linux下程序間通訊方式之管道、訊號、共享記憶體、訊息佇列、訊號量、套接字
/* 1,程序間通訊 (IPC ) Inter-Process Communication 比較好理解概念的就是程序間通訊就是在不同程序之間傳播或交換資訊。 2,linux下IPC機制的分類:管道、訊號、共享記憶體、訊息佇列、訊號量、套接字 3,這篇主要說說管
Linux-程序通訊-訊息佇列/訊號燈/共享記憶體
訊息佇列 訊息佇列提供了程序間傳送資料塊的方法,每個資料塊都可以被認為是有一個型別,接受者接受的資料塊可以有不同的型別;我們可以通過傳送訊息來避免命名管道的同步和阻塞問題;訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制;我們可以將每個資料塊當作是一
RabbitMQ如何在命令列下清除訊息佇列中的所有資料
最近在研究 RabbitMQ 訊息佇列, 安裝好進行測試的時候發覺在一個名為 MyRabbitMQ 的訊息佇列中已經插入了大量的資料。 最後不得不找方法清除。 首先定位到 rabbitMQ 安裝目錄的sbin 目錄下。 然後shift+右鍵 。 調出右鍵選單。 選擇在此處開啟
C++封裝Linux訊息佇列
訊息佇列是Linux程序間通訊方式之一,在面向物件程式設計中,需要對其封裝。 一、訊息佇列的特點 1、非同步通訊,訊息佇列會儲存程序傳送的訊息,其他程序不一定要及時取走訊息。 2、可以傳送不同型別的訊息,訊息的頭部用long型別的欄位標記。 3、取訊息時,不一定按先進
Linux:程序間通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)
目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 | 命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲
Linux訊息佇列與執行緒例項理解
相較於程序,執行緒不僅擁有程序的併發性,相互獨立等特點,更有佔用資源較少,效率高等特點。 建立執行緒 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)
linux c程式設計:Posix訊息佇列
Posix訊息佇列可以認為是一個訊息連結串列. 有足夠寫許可權的執行緒可以往佇列中放置訊息, 有足夠讀許可權的執行緒可以從佇列中取走訊息 在某個程序往一個佇列寫入訊息前, 並不需要另外某個程序在該佇列上等待訊息的到達. 這跟管道和FIFO是相反的, 因為