【linux随记】消息队列

system-V 消息队列
system-V ipc 特点(消息对队列 信号量 共享内存)
  • 独立于进程 //即system-V的ipc不存在于程序内部,程序销毁,ipc任然存在(个人理解)
  • 没有文件名和文件描述符
  • IPC对象具有key和ID ,key用来唯一标识ipc对象(文件名),ID用来控制IPC对象(文件描述符)//IPC对象即 system-V的消息对队列 信号量 共享内存
消息队列用法
  • 定义一个唯一key // ftok(),获取一个key
  • 构造消息对象 // msgget(),创建/获取消息队列ID
  • 发送特定类型消息 // msgsnd(),发送消息到消息队列,阻塞 非阻塞
  • 接收特定类型消息 //msgrcv(),从消息队列中接收消息,阻塞 非阻塞 截断
  • 删除消息队列 // msgctl(),设置或获取消息队列的相关属性
msgsend.c
#include<stdio.h>
#include<sys/ipc.h>
#include <unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include<sys/msg.h>
#include<string.h>

#define BUFFER_SIZE 512
struct message{
    long msg_typ;
    char msg_text[BUFFER_SIZE];
};
int main()
{
    int qid;
    key_t key;
    struct message msg;
    if((key = ftok("../",11)) == -1)
    {
        printf("ftok error\r\n");
        exit(1);
    }
    if((qid = msgget(key,IPC_CREAT|0666)) == -1)
    {
        printf("message error\r\n");
        exit(1);
    }
    printf("open queue %d\r\n",qid);
    while(1)
    {
        printf("enter some message to queue: ");
        if((fgets(msg.msg_text,BUFFER_SIZE,stdin)) == NULL)
        {
            puts("no message");
            exit(1);
        }

        msg.msg_typ = getpid();

        if((msgsnd(qid,&msg,strlen(msg.msg_text),0)) < 0)
        {
            printf("mseeage posted error\r\n");
            exit(1);      
        }

        if(strncmp(msg.msg_text,"quit",4) == 0)
        {
            break;
        }
    }   
    
    return 0;
}

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

#define BUFFER_SIZE 512

struct message{
    long msg_typ;
    char msg_text[BUFFER_SIZE];
};
int main()
{
    int qid;
    key_t key;
    struct message msg;
    if((key = ftok("../",11)) == -1)
    {
        printf("ftok error\r\n");
        exit(1);
    }
    if((qid = msgget(key,IPC_CREAT|0666)) == -1)
    {
        printf("message error\r\n");
        exit(1);
    }
    printf("open queue %d\r\n",qid);
    do{
        memset(msg.msg_text,0,BUFFER_SIZE);
        if(msgrcv(qid,(void*)&msg,BUFFER_SIZE,0,0) < 0)
        {
            printf("msgrcv,error\r\n");
            exit(1);
        }
        printf("the message from msgsend process %ld : %s \r\n",msg.msg_typ,msg.msg_text);
        
    }while(strncmp(msg.msg_text,"quit",4));

    if((msgctl(qid, IPC_RMID, NULL)) < 0)
    {
        printf("msgctl error\r\n");
        exit(1);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值