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
本文介绍消息队列的基本概念及其实现方法,通过一个简单的C语言程序示例,展示了如何创建消息队列、发送消息及接收消息的过程。此外,还涉及了线程支持的相关操作。
573

被折叠的 条评论
为什么被折叠?



