玩一下linux下的消息队列

消息队列的特性:

1)消息队列是一个消息链表,用户可以在消息队列中添加消息、读消息

2)调用的进程必须拥有足够的权限才能对消息队列进行读、写操作

3)消息队列可以按照类型来发现或者接收消息

4)消息队列是IPC对象的一种。消息队列中可以通过唯一的ID来标识

    (IPC对象是活动在内核级别的一种,是进程间通信的工具)

 

接收端代码:

​
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#define MSG_SIZE 1024
 
struct msgbuffer 
{
            long m_type;       		/* message type, must be > 0 */
            char m_text[MSG_SIZE];    /* message data */
};
 
int main()
{
    struct msgbuffer msgb;  
    
    key_t key=ftok(".",0);
 
    msgb.m_type=1;
    int msgID=msgget(key,IPC_CREAT|0666);
    
    //接收消息
    msgrcv(msgID,(void*)&msgb,MSG_SIZE,msgb.m_type,0);
 
    printf("m_text=%s m_type=%ld\n",msgb.m_text,msgb.m_type);
 
    //删除消息队列
    if(msgctl(msgID,IPC_RMID,NULL)<0)
    {
        fprintf(stderr,"msgid %d error\n",msgID);
        exit(0);
    }
    
 
    return 0;
}
 
​

发送端代码:

​
​
​
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>

#define MSG_SIZE 1024
//定义一个消息结构体
struct msgbuf 
{
            long m_type;       /* message type, must be > 0 */
            char m_text[MSG_SIZE];    /* message data */
};

int main()
{
		struct msgbuf msgb;
		msgb.m_type = 1;
    
        //因为是测试消息队列,所以把数据量写大点		
		strcpy(msg.m_text,"hello worldhello world jasodoahjshiushduihwudhbsauihgdasoidasoidjslakdjklasjdoiasjhdoiqwhdiouashjkdhskjdhkajshd1234566549789787932yeiu3hjkashdasudhnsajkdhuiashdkjsahdjkshdkjashdijashdkjashdksajhdoiuasydh978yuoisah97dy3hiudhkjwhdiashdjksahdkjsahdjkashdjkashdkjashdkjsahdjk
\n");
		
		key_t key = ftok(".",0);
		
		int msgid = msgget(key,IPC_CREAT|0666);
	
        //发送消息
		if((msgsnd(msgid,(void*)&msgb,sizeof(msgb.m_text),0))==0)
		{ 
			printf("msg send success\n");
		}
		
	return 0;
}

​

​

​

输出:

 

ipcs -q : 显示所有的消息队列

ipcs -qt: 显示消息队列的创建时间、发送和接收最后一条消息的时间

ipcs -qp:显示往消息队列中存消息,和从消息队列中取消息的进程ID

ipcs -q -i msgid: 显示该消息队列结构体中的消息信息:

ipcs -ql : 显示消息队列的限制信息:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值