首页 > 代码库 > sysv-IPC-消息队列

sysv-IPC-消息队列

#include <sys/ipc.h>#include <sys/msg.h>/*    创建消息队列	key:由ftok创建	msgflg:消息队列访问权限 perm & ~umask			umask:					IPC_CREAT 如果key不存在,则创建,否则返回id					IPC_EXCL 如果key存在,则返回失败					IPC_NOWAIT 如果需要等待则直接放回错误*/int msgget(key_t key, int msgflg);/*	消息队列属性控制	msgqid:消息队列标示符	cmd:要要执行的操作		IPC_STAT			读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中。		IPC_SET			设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。		IPC_RMID			从系统内核中移走消息队列。	buf:是一个临时的msqid_ds结构体类型的变量,用于存储读取的消息队列属性或者需要修改的消息队列属性*/int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>struct msgbuf {	long mtype; /* 消息类型,必须 > 0 */	char mtext[1]; /* 消息文本 */};/*	发送函数	msqid:消息队列标示符	msgp:缓冲区,类型如msgbuf	msgsz:接受信息的大小	msgflg:指定到到达系统为消息队列所定界限(如达到字数限制)时应采取的操作		如果设置成IPC_NOWAIT,如果需要等待,则不发送消息并且调用进程立即返回错误信息EAGRIN		如果设置为0,则阻塞调用进程	成功返回0,否则-1*/int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);/*	发送函数	msqid:消息队列标示符	msgp:缓冲区,类型如msgbuf	msgsz:接受信息的大小	msgtype:指定请求的消息类型		=0 接收队列中第一条消息,任意类型		>0 接受第一条msgtype的消息		<0 接受第一条最低类型的消息(小于或者等于msgtype绝对值)的消息	msgflg:指定到到达系统为消息队列所定界限(如达到字数限制)时应采取的操作		如果设置成IPC_NOWAIT,如果需要等待,则不发送消息并且调用进程立即返回错误信息EAGRIN		如果设置为0,则阻塞调用进程	成功返回0,否则-1*/int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtype, int msgflg);

  一个例子:

//sender#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>struct msgbuf{	long type;char ptr[0];};int main(int argc,char *argv[]){	key_t key;	key=ftok(argv[1],100);	int msgid;	msgid=msgget(key,IPC_CREAT|0666);			while(1){		printf("enter the msg to send:");		char buf[128];fgets(buf,128,stdin);				struct msgbuf *ptr=malloc(sizeof(struct msgbuf)+strlen(buf)+1);		ptr->type=1;		buf[strlen(buf)-1] = ‘\0‘;		strcpy(ptr->ptr,buf);		printf("%s\n",buf);		msgsnd(msgid,ptr,sizeof(struct msgbuf)+strlen(buf)+1,0);		free(ptr);	}}//receiver#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>struct msgbuf{	long type;	char ptr[0];};int main(int argc,char *argv[]){	key_t key;	key=ftok(argv[1],100);	int msgid;	msgid=msgget(key,IPC_CREAT|0666);		pid_t pid;	struct msgbuf{		long type;		char ptr[1024];	};	while(1)	{		struct msgbuf mybuf;		memset(&mybuf,‘\0‘,sizeof(mybuf));		msgrcv(msgid,&mybuf,1024,1,0);	//recv msg type=1		printf("recv msg:%s, %d\n",mybuf.ptr,mybuf.type);	}}