码迷,mamicode.com
首页 > 其他好文 > 详细

sysv-IPC-消息队列

时间:2014-08-20 01:20:25      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   数据   ar   2014   div   amp   

#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);

  一个例子:

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

//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);
	}
}

  

 

sysv-IPC-消息队列,布布扣,bubuko.com

sysv-IPC-消息队列

标签:blog   http   io   数据   ar   2014   div   amp   

原文地址:http://www.cnblogs.com/dy-techblog/p/3923619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!