最近编写的一个linux 消息队列例子!

所谓消息队列就是指一个消息链表。
int msgget(key_t, int flag):创建和打开队列
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int flag):发送消息,msgid是消息队列的id,msgp是消息内容所在的缓冲区,msgsz是消息的大小,msgflg是标志。

int msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int flag):接受消息,msgtyp是期望接收的消息类型。

msgqueue.c文件内容如下;

#include<sys/types.h> #include<sys/ipc.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<pthread.h> // 增加线程支持 #define BUFSZ 512 struct message{ long msg_type; char msg_text[BUFSZ]; }; #define MSG_SIZE sizeof(struct message) char app_exit = 0; void *thread_funtion(void *parg); int main() { int qid; key_t key; int len; int res; pthread_t a_thread; struct message msg; if((key = ftok(".",'a')) == -1){ // ftok 获得一个key perror("ftok"); exit(1); } if((qid = msgget(key,IPC_CREAT|0666)) == -1){ // 创建一个消息队列 perror("msgget"); exit(1); } printf("opened queue %d\n",qid); puts("Please enter the message to queue:"); if((fgets(msg.msg_text,BUFSZ,stdin)) == NULL){ // 从标准输入获得buffer puts("no message"); exit(1); } msg.msg_type = getpid(); len = strlen(msg.msg_text) + sizeof(msg.msg_type); if((msgsnd(qid,&msg,len,0)) < 0){ // 发送消息 perror("message posted"); exit(1); } /* memset(&msg,0,sizeof(msg)); // 清除内存为0 if(msgrcv(qid,&msg,len,0) < 0){ // 接收消息 perror("message recv"); exit(1); } printf("message is:%s\n",(&msg)->msg_text); if((msgctl(qid,IPC_RMID,NULL))<0){ perror("msgctl"); exit(1); } */ res = pthread_create(&a_thread,NULL,thread_funtion,(void *)&qid); printf("The msgrcv thread is create sucess!\n"); while((app_exit = getchar()) != 'e'){sleep(50);} printf("exit main funtion!\n"); exit(0); } void *thread_funtion(void *parg) { struct message msg; int qid; qid = *((int *)parg); memset(&msg,0,MSG_SIZE); while(app_exit != 'e'){ if(msgrcv(qid,&msg,MSG_SIZE) < 0){ sleep(50); continue; } printf("message is:%s\n",(&msg)->msg_text); if(msgctl(qid,IPC_RMID,NULL) < 0){ perror("msgctl"); } sleep(50); } }

Makefile文件类型如下;

all:msgqueue # which compiler CC = gcc # Where are include file kept INCLUDE = . # Where to install INSTDIR = /usr/local/bin # Options for development CFLAGS = -g -Wall -ansi msgqueue:msgqueue.o $(CC) -D_REENTRANT -o msgqueue msgqueue.o -lpthread msgqueue.o:msgqueue.c # $(CC) -I$(INCLUDE) $(CFLAGS) -c msgqueue.c # $(CC) -D_REENTRANT -c msgqueue.c -lpthread $(CC) -c msgqueue.c clean: -rm msgqueue.o msgqueue install:msgqueue @if [-d $(INSTDIR) ];\ then \ cp msgqueue $(INSTDIR);\ chmod a+x $(INSTDIR)/msgqueue;\ chmod og-w $(INSTDIR)/msgqueue;\ echo "Install in $(INSTDIR)";\ else \ echo "Sorry,$(INSTDIR) does not exist";\ fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值