• 11月26日:操作系统实验杂记 msgget(创建消息队列) msgsnd(发送消息) msggrcv(接收消息) msgctl(控制消息队列)


    函数语法介绍

    注意:下面介绍的函数都需要导入头文件

    序:消息结构体

    ①“消息”结构体是一个需要用户自行定义的结构体,但是必须满足一定的格式;
    ②该结构体中只能有两个成员,分别是long类型的mtype用于表示消息的类型,以及char[]类型的mtext表示消息的文本,定义方式如下:

    struct msgform
    {
        long mtype;           //消息类型
        char mtext[消息长度] ; //消息文本
    }msg;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.创建消息队列msgget

    函数伪定义:

    int msgqid=msgget(key,flag)
    
    • 1

    ①msgget函数用于创建一个消息队列。
    ②key参数用于区分不同的消息队列,用一个整数表示。

    ③flag是用户设置的标志和访问方式。常用的参数为IPC_CREAT|0400(表示如果该消息队列已经存在则打开这个消息队列,否则创建这个名称的消息队列)。
    ④返回值:表示消息队列的编号,如果返回-1则表示创建消息队列失败。

    2.发送消息msgsnd

    函数伪定义:

    void msgsnd(msgqid,msgp,size,flag)
    
    • 1

    ①msgsnd函数用于向消息队列中发送一条消息,排在消息队列尾部。
    ②msgqid参数表示消息队列的编号(msgget函数的返回值即为生成的消息队列的编号);
    ③msgp参数表示一个指向“消息”结构体的指针。
    ④size表示指向的消息结构体中消息的长度(以字节为单位)。
    ⑤flag一般设置为0。

    3.接收消息msgrcv

    函数伪定义:

    void msgrcv(msgqid,msgp,size,type,flag)
    
    • 1

    ①msgrcv函数用于从消息队列的队头取出一条信息。
    ②msgp表示指向一个消息结构体的指针。
    ③size表示消息结构体中消息的长度(以字节计算)。
    ④type和flag一般都设置为0。

    4.控制消息队列msgctl

    函数伪定义:

    void msgctl(msgqid,cmd,buf)
    
    • 1

    ①msgqid表示需要操作的消息队列编号;
    ②cmd表示操作类型,最常用的参数是删除消息队列参数:IPC_RMID
    ③buf一般置为0。

    函数应用实例

    题目内容:假设有2个用户lucy和peter, 使用消息队列进行通信,Lucy先发言,实现2人之间的聊天功能。当任意一方输入quit时,停止通信,程序结束。

    Lucy进程代码

    #include
    #include
    #include
    struct msgform
    {
        long mtype;
        char mtext[1024];
    }m;
    
    int isQuit(char* p)
    {
        if(p[0]=='q'&&p[1]=='u'&&p[2]=='i'&&p[3]=='t')
        {
            return 1;
        }
        else return 0;
    }
    
    int main(void)
    {
        m.mtype=1;
        int qid=msgget(12345,IPC_CREAT|400);
        while(1)
        {
            printf("Lucy:");
            scanf("%s",m.mtext);
            if(isQuit(m.mtext)==1)
            {
                printf("\n聊天结束。\n");
                msgctl(qid,IPC_RMID,0);
                exit(1);
            }
            msgsnd(qid,&m,1024,0);
            msgrcv(qid,&m,1024,2,0);
            printf("Peter:%s\n",m.mtext);
            m.mtype=1;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    Peter进程代码

    #include
    #include
    #include
    struct msgform
    {
        long mtype;
        char mtext[1024];
    }m;
    
    int isQuit(char* p)
    {
        if(p[0]=='q'&&p[1]=='u'&&p[2]=='i'&&p[3]=='t')
        {
            return 1;
        }
        else return 0;
    }
    
    
    int main(void)
    {
         m.mtype=2;
         int qid=msgget(12345,IPC_CREAT|400);
         while(1)
         {
             msgrcv(qid,&m,1024,1,0);
             printf("Lucy:%s\n",m.mtext);
             m.mtype=2;
             printf("Peter:");
             scanf("%s",m.mtext);
             if(isQuit(m.mtext)==1)
             {
                 printf("\n聊天结束。\n");
                 msgctl(qid,IPC_RMID,0);
                 exit(1);
             }
             msgsnd(qid,&m,1024,0);
         }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    运行效果
    在这里插入图片描述

  • 相关阅读:
    Unity 之 后处理实现界面灰度效果(PostProcessing实现 | Shader实现)
    C++并发编程
    linux获取Mac地址
    Shell脚本中2>&1、>、>>等符号到底是什么含义
    NV080D语音芯片:让智能快递柜取件更便利
    腾讯云文件SDK
    飞天使-学以致用-devops知识点3-安装jenkins
    MyEclipse数据库工具使用教程:使用驱动程序
    初识TypeScript编译器(tsc)
    【设计模式】JAVA Design Patterns——Data Transfer Object(数据传递对象模式)
  • 原文地址:https://blog.csdn.net/hanmo22357/article/details/128057005