进程间的通信《消息对列篇》

一 、SYSTEM-V IPC

        1. 分类

                消息对列

                共享内存

                信号量

        2. 套路(API调用的顺序)

               

        3. ftok函数----创建SYSTEM -V IPC 的 key值             

 

                ①形参:

                       项目环境( pathname):  项目文件夹

                              在一个项目里面,所有的文件都在同一个路径里,pathname是一个路径

                       proj_id

                              IPC 的标识,表示的是key值

                              当路径和IPC的路径一致时,创建出来的key值是一样的。

                ② key的作用:

                           申请对应传输机制的空间资源和确定传输机制

                           消息对列:消息对列需要空间,确定传输机制

                           共享内存:共享内存需要空间,确定传输机制

                ③注意:

                            当要重复创建不同的但是有时相同IPC时,需要不同key才行。

                ④:

                            不同的key值,就可以创建多个共同的SYSTEM-V IPC

                             相同的key值,操作的就是一个消息对列

        4.例子:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <errno.h>

#define IPC_MASK_A 1
#define IPC_MASK_B 2

int main()
{
    key_t key_a = tok("./",IPC_MASK_A)
    key_t key_b = tok("./",IPC_MASK_B)
    if(key_a ==-1 || key_b ==-1)
    {
        perror("tok");
        exit(1);
    }
    else
    {
        printf("%d-----%d",key_a,key_b);
    }
    return 0;
}

二、消息对列

        1. 用key值创建消息对列           

 

                 ①:msgflg是一个位屏蔽字,参数可以叠加使用,mode指的是文件的权限,例如:0666和0777一样的,因为执行权限是无效的。

        2. 使用

int msg_queue_data = msgget(key_a,IPC_CREAT | 0666);
if(msg_queue_data  == -1)
{
    perror("msgget");
    exit(-1);
}

        3. 关于消息的命令

        查看:ipcs -q

        删除:ipcrm -q msg_id      \   ipcrm -Q key

三、消息对列的发送和接受

        1. 函数结构

        2. 参数含义

                msqid:指的是消息队列的ID号(在创建消息对列时出现,是int型) 

                msgp : 数据存放的地址或指针

                msgsz: 大小

                msgtyp: long型的标识,用来甄别信息。一般的表示方法是:1L

                msgflg:将要读取和发送的信息的方式,一般为 0

四、msgctl 函数:设置消息对列相关函数

        1. 图示

    

五、代码

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


#define MSG_LENGTH 24
#define IPC_MASK_A 1
#define IPC_MASK_B 2
#define MSG_MASK   1L

struct msgbuf 
{
        long mtype;      
        char mtext[MSG_LENGTH]; 
}msg_inf_send,msg_inf_rev;

int main()
{
   key_t key_a = ftok("./",IPC_MASK_A);
   key_t key_b = ftok("./",IPC_MASK_B);
   if(key_a == -1 || key_b == -1)
   {
       perror("ftok");

       return -1;
   }
   else
   {
       printf("%d---%d\n",key_a,key_b);
   }

    int msg_queue_id_a = msgget(key_a,IPC_CREAT | 0666);
    int msg_queue_id_b = msgget(key_b,IPC_CREAT | 0666);
    if(msg_queue_id_a == -1 || msg_queue_id_b == -1)
    {
        perror("msgget");
        return -1;
    }
    else
    {
        printf("%d---%d\n",msg_queue_id_a,msg_queue_id_b);
    }

    /*调用msgsnd函数发送消息*/
    memset(&msg_inf_send,0,sizeof(msg_inf_send));
    memset(&msg_inf_rev,0,sizeof(msg_inf_rev));

    msg_inf_send.mtype = MSG_MASK;

    while(1)
    {
        memset(msg_inf_send.mtext,0,MSG_LENGTH);
        memset(msg_inf_rev.mtext,0,MSG_LENGTH);
        
        printf("请输入要发送的消息:");
        scanf("%s",msg_inf_send.mtext);

        int msgsnd_ret = msgsnd(msg_queue_id_a,&msg_inf_send,strlen(msg_inf_send.mtext),0);
        if(msgsnd_ret == -1)
        {
            perror("msgsnd");
            return -1;
        }
        else
            printf("发送消息成功!!!!\n");
        sleep(1);
        /*调用msgrcv读取消息*/
        int msgrcv_ret = msgrcv(msg_queue_id_a,&msg_inf_rev,MSG_LENGTH,MSG_MASK,0);
        if(msgrcv_ret == -1)
        {
            perror("msgrcv");
            return -1;
        }
        else
            printf("消息是:%s\n",msg_inf_rev.mtext);
    }

    return 0;
}

     

                        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值