• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
指尖上的快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

linux第10天 msg消息队列

cat /proc/sys/kernel/msgmax最大消息长度限制

cat /proc/sys/kernel/msgmnb消息队列总的字节数

cat /proc/sys/kernel/msgmni消息条目数

 

 

消息队列综合案例

 

//server





#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

#define ERR_EXIT(m) \
	do \
	{ \
		perror(m); \
	} \
	while(0);


struct msgbuf {
   long mtype;       /* message type, must be > 0 */
   char mtext[1024];    /* message data */
};


int main()
{
	struct msgbuf revbuf;
	int key 	= 0;
	int msgid   = 0;
	int ret 	= 0;
	int pid		= 0;
	
	key = ftok("./", '2');
	if (key < 0)
		ERR_EXIT("ftok");
	
	//获取消息队列	
	ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
	if (ret < 0)
	{
		if (errno == EEXIST) //如果消息队列已存在
			msgid = msgget(key, 0666);
		else 
			ERR_EXIT("msgget:");
	}
	else 
		msgid = ret;
		
	//设置发送buf
	memset(&revbuf, 0, sizeof(revbuf));
	
	revbuf.mtype = 1; //接收方总是接收类型1
	while (1)
	{
		ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), 1, 0);
		if (ret < 0)
			ERR_EXIT("msgrcv:");
			
		fputs(revbuf.mtext + 4, stdout);
			
		pid = *((int *)(revbuf.mtext));
		
		revbuf.mtype = pid;
		ret = msgsnd(msgid, &revbuf, ret, IPC_NOWAIT);
		if (ret < 0)
			ERR_EXIT("msgsnd");
	}
		
	return 0;
}

 

  

//clt





#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

#define ERR_EXIT(m) \
	do \
	{ \
		perror(m); \
	} \
	while(0);


struct msgbuf {
   long mtype;       /* message type, must be > 0 */
   char mtext[1024];    /* message data */
};


int main()
{
	struct msgbuf sndbuf;
	struct msgbuf revbuf;
	int key 	= 0;
	int msgid   = 0;
	int ret 	= 0;
	int pid		= 0;
	
	key = ftok("./", '2');
	if (key < 0)
		ERR_EXIT("ftok");
		
	//获取消息队列
	ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
	if (ret < 0)
	{
		if (errno == EEXIST) //如果消息队列已存在
			msgid = msgget(key, 0666);
		else 
			ERR_EXIT("msgget:");
	}
	else 
		msgid = ret;
		
	//设置发送buf
	memset(&sndbuf, 0, sizeof(sndbuf));
	memset(&revbuf, 0, sizeof(revbuf));

	pid = getpid(); //获取pid作为包头发出去

	while (fgets(sndbuf.mtext + 4, sizeof(sndbuf.mtext), stdin) != NULL)
	{
		sndbuf.mtype = 1; //发送方总是发送类型1
		
		memcpy(sndbuf.mtext, &pid, 4);
		//*((int*)sndbuf.mtext) = pid; //这句话是指将sndbuf.mtext最前面四个字节指向一个int类型指针
		
		ret = msgsnd(msgid, &sndbuf, strlen(sndbuf.mtext + 4) + 4, IPC_NOWAIT);
		if (ret < 0)
			ERR_EXIT("msgsnd");
			
		sleep(1);
		//读取
		ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), pid, IPC_NOWAIT);
		if (ret < 0)
			ERR_EXIT("msgrcv:");
			
		fputs(revbuf.mtext + 4, stdout);
		
		memset(&sndbuf, 0, sizeof(sndbuf));
		memset(&revbuf, 0, sizeof(revbuf));		
	}
	return 0;
}

  

 

posted @ 2016-03-10 22:55  指尖上的快乐  阅读(451)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3