消息被发送到队列中。“消息队列”是在消息的传输过程当中保存消息的容器。消息队列管理器在将消息从ide
它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;若是发送消息时函数
接收者不可用,消息队列会保留消息,直到能够成功地传递它。spa
msgget()函数被用来建立新的消息队列或获取已有的消息队列。其函数定义以下:指针
系统调用: msgget()
函数声明: int msgget ( key_t key, int msgflg )
返回值: message queue identifier on success
-1 on error: errno = EACCESS (permission denied)
EEXIST (Queue exists, cannot create)
EIDRM (Queue is marked for deletion)
ENOENT (Queue does not exist)
ENOMEM (Not enough memory to create queue)
ENOSPC (Maximum queue limit exceeded)
msgget()函数的第一个参数是消息队列对象的关键字(key),函数将它与已有的消息队
列对象的关键字进行比较来判断消息队列对象是否已经建立。而函数进行的具体操做是由
第二个参数,msgflg 控制的。它能够取下面的几个值:
IPC_CREAT :
若是消息队列对象不存在,则建立之,不然则进行打开操做;
IPC_EXCL:
和IPC_CREAT 一块儿使用(用”|”链接),若是消息对象不存在则建立之,不然产生一个
错误并返回。
若是单独使用IPC_CREAT 标志,msgget()函数要么返回一个已经存在的消息队列对象
的标识符,要么返回一个新创建的消息队列对象的标识符。若是将IPC_CREAT 和IPC_EXCL
标志一块儿使用,msgget()将返回一个新建的消息对象的标识符,或者返回-1 若是消息队列
对象已存在。IPC_EXCL 标志自己并无太大的意义,但和IPC_CREAT 标志一块儿使用可
以用来保证所得的消息队列对象是新建立的而不是打开的已有的对象对象
msgflg:这个参数依然是是控制函数行为的标志,取值能够是:0,表示忽略;IPC_NOWAIT,若是消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。若是不指定这个参数,那么进程将被阻塞直到函数能够从队列中获得符合条件的消息为止。若是一个client 正在等待消息的时候队列被删除,EIDRM 就会被返回。若是进程在阻塞等待过程当中收到了系统的中断信号,EINTR 就会被返回。MSG_NOERROR,若是函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被丢弃了。若是不指定这个参数,E2BIG 将被返回,而消息则留在队列中不被取出。当消息从队列内取出后,相应的消息就从队列中删除了。队列
读进程程序进程
#include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #include "Ccommon.h" #include <sys/msg.h> int main() { bool isRuning = true; struct shared_use_str pshared_use_str; int imsgget; long int msg_to_receive = 0; //建立或者连接一个已经存在的消息队列 imsgget = msgget((key_t)1234,0666|IPC_CREAT); if(-1 == imsgget) { printf("msgget failed\n"); exit(-1); } while(true == isRuning) { //读取消息队列内容 if(msgrcv(imsgget,(void *)&pshared_use_str,BUFSIZ,msg_to_receive,0) == -1) { printf("failed to receive message\n"); return -1; } printf("you enter %s\n",pshared_use_str.somedate); if(strncmp(pshared_use_str.somedate,"end",3) == 0) { isRuning = false; } } //删除消息队列 if(msgctl(imsgget,IPC_RMID,0) == -1) { printf("msgctl failed\n"); exit(-1); } return 0; }
写进程路由
#include <stdlib.h> #include <stdio.h> #include <sys/shm.h> #include <string.h> #include <unistd.h> #include "Ccommon.h" #include <sys/msg.h> #include <errno.h> int main() { bool isRuning = true; struct shared_use_str pshared_use_str; int imsgget; //建立或者连接一个已经存在的消息队列 imsgget = msgget((key_t)1234,0666|IPC_CREAT); if(-1 == imsgget) { printf("msgget failed\n"); exit(-1); } while(true == isRuning) { printf("Enter som data\n"); scanf("%s",pshared_use_str.somedate); //向消息队列发送消息 if(msgsnd(imsgget, (void *) &pshared_use_str , 1000,0) == -1) { printf("failed to msgsnd message\n"); return -1; } if(strncmp(pshared_use_str.somedate,"end",3) == 0) { isRuning = false; } } return 0; }