国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【Linux】消息隊列

2019-11-08 18:24:49
字體:
來源:轉載
供稿:網友

消息隊列提供了一個進程向另一個進程發送數據塊的方法。消息隊列的結構

linux為參與消息傳遞的進程提供msgsnd來發送消息,提供msgrcv來接受消息

msgsnd

msgrcv

消息隊列就是一個消息的鏈表。可以把消息看作一個記錄,具有特定的格式以及特定的優先級。對消息隊列有寫權限的進程可以向消息隊列中按照一定的規則添加新消息;對消息隊列有讀權限的進程則可以從消息隊列中讀走消息。消息隊列是隨內核持續的。

下面是代碼實現

comm.h

#ifndef _COMM_#define _COMM_#include<stdio.h>#include<sys/types.h>#include<sys/ipc.h>#include<fcntl.h>#include<sys/msg.h>#include<string.h>#define PATHNAME "."#define PROJID 0x6666#define MYSIZE 128#define SERVER_TYPE 1#define CLIENT_TYPE 2struct msgbuf{long mtype;char mtext[MYSIZE];};int creatMsgQueue();int getMsgQUeue();int sendMessage(int msg_id,long type,const char* msg);int recvMessage(int msg_id,int type,char out[]);int destoryMsgQueue(int id);#endifcomm.c

#include"comm.h"static int commMsgQueue(int flag){key_t _k=ftok(PATHNAME,PROJID);if(_k<0)                                                                    {		 perror("ftok");		 return -1;		    }  int msg_id=msgget(_k,flag);	    if(msg_id<0) {			  perror("msgget");return -2;		}    return msg_id;}int creatMsgQueue(){return commMsgQueue(IPC_CREAT|IPC_EXCL|0666);}int getMsgQueue(){return commMsgQueue(IPC_CREAT);}int sendMessage(int msg_id,long type,const char* msg){struct msgbuf buf;buf.mtype=type;strcpy(buf.mtext,msg);int ret=msgsnd(msg_id,&buf,sizeof(buf.mtext),0);printf("Debug ret:%d",ret);if(ret<0){perror("msgsnd");printf("Debug:CLient msgsnd/n");return -1;}return 0;}int recvMessage(int msg_id,int type,char out[]){struct msgbuf buf; int size=msgrcv(msg_id,&buf,sizeof(buf.mtext),type,0); if(size>0) { buf.mtext[size]='/0'; printf("DEBUE:%s SIZE:%d/n",buf.mtext,size); strncpy(out,buf.mtext,size); return 0; } perror("msgrcv"); return -1;}int destoryMsgQueue(int msg_id){if(msgctl(msg_id,IPC_RMID,NULL)<0){perror("msgctl");return -1;}return 0;}server.c

#include"comm.h"int main(){	int msg_id=creatMsgQueue();    char buf[2*MYSIZE];	while(1)	{		if(recvMessage(msg_id,CLIENT_TYPE, buf)<0)  		{		break;		}	printf("client# %s/n",buf);	   if(sendMessage(msg_id,SERVER_TYPE,buf)<0)  		   {		   break;		   }		printf("server# %s/n",buf);	}	destoryMsgQueue(msg_id);return 0;}client.c

#include"comm.h"int main(){	int msg_id=getMsgQueue();    char buf[MYSIZE];    char out[2*MYSIZE];	while(1)	{		printf("please enter: ");		fflush(stdout);	    ssize_t _s=read(0,buf,sizeof(buf)-1);		if(_s>0)		{		  buf[_s]='/0';	      sendMessage(msg_id,CLIENT_TYPE,buf); 		}		if(recvMessage(msg_id,SERVER_TYPE,out)<0)		{		break; 		}		printf("server echo# %s/n",out);	}return 0;}下面是本項目的Makefile

cli=clientser=servercc=gccserSrc=comm.c server.ccliSrc=comm.c client.c.PHONY:allall:$(cli) $(ser)$(cli):$(cliSrc)	$(cc) -o $@ $^$(ser):$(serSrc)	$(cc) -o $@ $^.PHONY:cleanclean:	rm -f $(cli) $(ser)傳送之前

傳送之后


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石首市| 漯河市| 汉川市| 诸暨市| 浦城县| 周至县| 顺昌县| 长沙县| 雅江县| 广元市| 曲水县| 萨嘎县| 洛扎县| 乌兰察布市| 金山区| 高尔夫| 积石山| 淳安县| 酒泉市| 临沧市| 富锦市| 冷水江市| 峡江县| 镇雄县| 华阴市| 云林县| 开鲁县| 新和县| 塘沽区| 海门市| 内乡县| 普陀区| 张家川| 龙川县| 乡宁县| 五常市| 开化县| 柏乡县| 岑溪市| 三都| 邮箱|