[Linux学习]Linux下进程通讯之消息队列
2012-03-27 22:22
399 查看
本文做了一个简单的示例来介绍Linux下消息队列,共有两段代码,模拟阻塞式聊天,下面看代码吧!
msgServer.c
msgclient.c
msgServer.c
#include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/stat.h> #define BUF_SIZE 256 #define PROJ_ID 32 #define PATH_NAME "/tmp" #define SERVER_MSG 1 #define CLIENT_MSG 2 int main(void){ /*用户自定义消息缓冲区*/ struct mymsgbuf{ long msgtype; char ctrlstring[BUF_SIZE]; } msgbuffer; int qid; int msglen; key_t msgkey; /*获取键值*/ if((msgkey=ftok(PATH_NAME,PROJ_ID))==-1) { perror("ftok error!\n"); exit(1); } /*获取消息队列标识符*/ if ((qid = msgget(msgkey,IPC_CREAT|0660)) == -1) { perror("msgget error!\n"); exit(1); } while(1) { printf("server:"); fgets(msgbuffer.ctrlstring,BUF_SIZE, stdin); if(strncmp("exit",msgbuffer.ctrlstring,4)==0) { msgctl(qid,IPC_RMID,NULL); break; } msgbuffer.ctrlstring[strlen(msgbuffer.ctrlstring) - 1] = '\0'; msgbuffer.msgtype = SERVER_MSG; if (msgsnd(qid,&msgbuffer,strlen(msgbuffer.ctrlstring) + 1,0) == -1) { perror("Server msgsnd error!\n"); exit(1); } if (msgrcv(qid,&msgbuffer,BUF_SIZE,CLIENT_MSG,0) == -1) { perror("Server msgrcv error!\n"); exit(1); } printf("Client: %s\n",msgbuffer.ctrlstring); } exit(0); }
msgclient.c
#include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/stat.h> #define BUF_SIZE 256 #define PROJ_ID 32 #define PATH_NAME "/tmp" #define SERVER_MSG 1 #define CLIENT_MSG 2 int main(void) { /*用户自定义消息缓冲区*/ struct mymsgbuf{ long msgtype; char ctrlstring[BUF_SIZE]; }msgbuffer; int qid;/*消息队列标识符*/ int msglen; key_t msgkey; /*获取键值*/ if ((msgkey = ftok(PATH_NAME,PROJ_ID)) == -1) { perror("ftok error!\n"); exit(1); } if ((qid = msgget(msgkey,IPC_CREAT|0660)) == -1) { perror("msgget error!\n"); exit(1); } while(1) { if (msgrcv(qid,&msgbuffer,BUF_SIZE,SERVER_MSG,0) == -1) /*if queue is empty, block here*/ { perror("Server msgrcv error!\n"); exit(1); } printf("server: %s\n",msgbuffer.ctrlstring); printf("client:"); fgets(msgbuffer.ctrlstring,BUF_SIZE,stdin); if (strncmp("exit",msgbuffer.ctrlstring,4) == 0) { break; } msgbuffer.ctrlstring[strlen(msgbuffer.ctrlstring)-1] = '\0'; msgbuffer.msgtype = CLIENT_MSG; if (msgsnd(qid,&msgbuffer,strlen(msgbuffer.ctrlstring) + 1,0) == -1) { perror("client msgsnd error!\n"); exit(1); } } exit(0); }
相关文章推荐
- Linux进程间通讯之消息队列
- 【linux高级环境编程学习笔记四】消息队列进程通信
- linux 进程学习笔记-消息队列messagequeue
- Linux进程间通讯之消息队列
- UNIX/LINUX编程学习之进程通信--消息队列
- Linux进程间通讯三--消息队列
- Linux进程间通讯之消息队列
- linux-基础-进程通讯(二)-消息队列/信号量
- linux 进程间消息队列通讯
- 学习笔记——操作系统_Linux进程通信之消息队列
- Linux进程通讯:消息队列
- Linux进程间通讯之消息队列
- Linux笔记_进程通讯——消息队列
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
- LINUX_C编程实战—第十章《进程间的通信》-消息队列
- Linux C程序练习(3)进程通信之pipe、fifo、消息队列
- Linux进程通信IPC--消息队列MessageQueue
- linux消息队列进程通信
- Linux程序设计学习笔记----System V进程通信之消息队列
- APUE学习之----进程通信实现消息队列