码迷,mamicode.com
首页 > 系统相关 > 详细

linux第10天

时间:2016-03-10 23:21:40      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:

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

  

 

linux第10天

标签:

原文地址:http://www.cnblogs.com/c-slmax/p/5263891.html

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