linux进程通信—消息队列

linux进程通信—消息队列

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。
(1)创建消息队列
使用下面的函数来创建消息队列:
在这里插入图片描述
– 参数“key”:消息队列关联的标识符
– 参数“msgflg”:消息队列的建立标志和存取权限。IPC_CREAT 如果内核
中没有此队列则创建它;IPC_EXCL 当和IPC_CREAT 一起使用时,如果
队列已经存在,则失败
– 返回值:执行成功则返回消息队列的标识符,否则返回-1
(2)操作消息队列
消息队列的操作可由下列函数来实现:
在这里插入图片描述
在msgrcv 和 msgsnd 中
–参数msqid:消息队列的标识码
– 参数*msgp:指向消息缓冲区的指针
– 参数msgsz:消息的长短
– 参数msgflg:标志位
– 返回值:成功返回数据长度,错误返回-1
1、第四个参数mtype指定了函数从队列中所取的消息的类型。函数将从队列中搜索类型与之匹配的消息并将之返回。如果mtype 的值是零,函数将不做类型检查而自动返回队列中的最旧的消息。
2、第五个参数msgflg标志位如果取0,则表示忽略标志位,当然还有其他取值,这里不再展开介绍,如果需要用到其他取值可以使用man 2 msgrcv 来进行查看。
3、这里再介绍一下结构体msgp,是一个标准的通用结构

		struct msgstru
				{
				long mtype; //必须大于0
				char mtext[nbyte];
				}

(3)代码展示
发送部分函数:

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

#define MAXSIZE 512
struct msgbuf 
{
	long int mtype;
    char mtext[MAXSIZE];
};

int main()
{
	key_t key = 1234;
	struct msgbuf data;
	int msgfd;
	int flag = 1;
	char buffer[BUFSIZ];//BUFSIZ的大小为8192

	//创建消息队列获取标识码
	msgfd = msgget(key,0666|IPC_CREAT);
	if(msgfd == -1)
	{
		fprintf(stderr,"create messege failed:%d\n",errno);
		exit(EXIT_FAILURE);
	}

	while(flag == 1)
	{
		printf("please input some messege:\n");
		//将键盘上输入的数据读入缓冲区,stdin是标准输入
		fgets(buffer,BUFSIZ,stdin);
		data.mtype = 1;
		strcpy(data.mtext,buffer);//将buffer中的数据复制到data.mtext
		//发送数据
		if((msgsnd(msgfd,(void*)&data,MAXSIZE,0) == -1))
		{
			fprintf(stderr,"messege send failed!\n");
			exit(EXIT_FAILURE);
		}
		if((strncmp(buffer,"end",3)) == 0)
			flag = 0;

			sleep(1);
	}
	exit(EXIT_SUCCESS);
}

接受部分函数:

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

#define MAXSIZE 512
struct msgbuf 
{
	long int mtype;
    char mtext[MAXSIZE];
};

int main()
{
	struct msgbuf data;
	int msgfd;
	int flag = 1;
	long int msgtyp = 0;
	int ret;
	key_t key = 1234;

	//创建消息队列
	msgfd = msgget(key,0666|IPC_CREAT);
	if(msgfd == -1)
	{
		fprintf(stderr,"create messege failed:%d\n",errno);
		exit(EXIT_FAILURE);
	}

	while(flag)
	{
		//读取消息队列中的数据
		if((msgrcv(msgfd,(void*)&data,BUFSIZ,msgtyp,0)) == -1)
		{
			fprintf(stderr,"msgrcv failed with errno: %d\n", errno);
			exit(EXIT_FAILURE);
		}
		printf("you have wrote:%s",data.mtext);
		//判断输入结束程序
		if((strncmp(data.mtext,"end",3)) == 0)
			flag = 0;
	}
	//关闭消息队列
	ret = msgctl(msgfd,IPC_RMID,0);
	if(ret == -1)
	{
		fprintf(stderr,"msgctl failed:%d\n",errno);
		exit(EXIT_FAILURE);
	}

	exit(EXIT_SUCCESS);
}
Linux进程间通信的方式有很多种,其中一种常用的方式是通过消息队列(Message Queue)进行通信。 消息队列是一种进程间通信的机制,它允许一个进程向另一个进程发送消息,而不需要直接的函数调用。在Linux系统中,消息队列是由内核维护的一段共享内存,其中的消息按照一定的顺序进行存储和读取。进程可以通过消息队列发送和接收消息,从而实现进程间的通信。 Linux提供了一组系统调用函数来操作消息队列,主要有以下几个函数: - `msgget(key, flags)`:创建或获取一个消息队列。key是用于标识消息队列的关键字,flags是创建标志。 - `msgsnd(msqid, msgp, msgsz, msgflg)`:向指定的消息队列发送消息。msqid是消息队列标识符,msgp是指向要发送的消息结构体的指针,msgsz是消息的大小,msgflg是发送标志。 - `msgrcv(msqid, msgp, msgsz, msgtyp, msgflg)`:从指定的消息队列中接收消息。msqid是消息队列标识符,msgp是指向接收到的消息结构体的指针,msgsz是消息的大小,msgtyp是消息类型,msgflg是接收标志。 - `msgctl(msqid, cmd, buf)`:对消息队列进行控制操作。msqid是消息队列标识符,cmd是控制命令,buf是用于传递参数的缓冲区。 以上是消息队列的基本操作函数,通过它们可以实现进程间的消息传递和通信。需要注意的是,消息队列的使用需要对消息的格式进行设计,并且发送和接收进程需要约定好消息的类型和大小等参数。 希望以上信息能够对您有所帮助。如果您还有其他问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值