Linux进程间通信-基于内存(共享队列)

写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!

如果发现一些笔记的说法完全是错误的请建议我删除!


使用共享队列机制实现进程间通信的过程
1.使用msgget创建共享队列/得到队列
2.使用msgsnd发送消息,使用msgrcv接收消息

3.使用msgctl删除队列


通过ipcs -q命令查看系统中的共享队列


代码中使用到struct msgbuf{};



这个结构体里边定义了一个char mtext[1]使用起来好像……

下面代码以这个结构体为模板自定义一个结构体

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

struct msgbuff
{
    long type;
    char data[32];
};

int main()
{
    key_t key;
    int msgid;
    
    key = ftok(".",256);
    
    if(key == -1)
    {
        printf("ftok error:%m\n");
        exit(-1);
    }
    
    msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);
    
    if(msgid == -1)
    {
        printf("error:%m\n");
        exit(-1);
    }
    
    struct msgbuff msg;
    
    for(int i = 1;i<=10;i++)
    {
        bzero(msg.data,sizeof(msg.data));
        msg.type = 1;
        sprintf(msg.data,"Message:%d",i);
        msgsnd(msgid,&msg,sizeof(msg.data),0);
    }
    
    for(int i = 1;i<=10;i++)
    {
        bzero(msg.data,sizeof(msg.data));
        msg.type = 2;
        sprintf(msg.data,"Message:%d",i);
        msgsnd(msgid,&msg,sizeof(msg.data),0);
    }
    return 0;
}

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

struct msgbuff
{
    long type;
    char data[32];
};

int main()
{
    struct msgbuff msg;
    key_t key = ftok(".",256);
    if(key == -1)
    {
        printf("ftok error:%m\n");
        exit(-1);
    }
    
    int msgid = msgget(key,0);
    if(msgid == -1)
    {
        printf("get errpr:%m\n");
        exit(-1);
    }
    
    while(1)
    {
        bzero(&msg,sizeof(msg));
        msg.type = 2;
        msgrcv(msgid,&msg,sizeof(msg.data),2,0);
        printf("%s\n",msg.data);
    }
    return 0;
}
第一段代码发送了两种类型的消息,第二段代码指定了接收到的消息的类型,所以只能接收显示相应类型的消息。


总结:

进程间通信机制虽然看完,但是很多函数的参数还要详细看man手册。总之,没那么简单,没那么复杂!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值