• 嵌入式Linux--进程间通讯--消息队列


    1.需要知道的问题:

            1、如何创建消息队列(A\B使用同一个队列通信)

            2、如何加消息到队列(队列是链表)

            3、如何从队列拿到消息

    消息队列:

            消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

    特点:1、消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

              2、消息队列独立于发送与接收进程。进程终止时,消息队列及其内容不会被删除。

               3、消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

    A:①获取队列②读队列

    B:①获取队列②写队列
     

    2.相关函数

    #include
     
    //创建或打开消息队列:成功返回队列id,失败返回-1
    int msgget(key_t key, int flag);


     
    //添加消息:成功返回0,失败返回-1
    int msgsnd(int msgid, const void *ptr, size_t size, int flag);
     
    //读取消息:成功返回消息数据的长度,失败返回-1
    int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);
     
    //控制消息队列:成功返回0,失败返回-1
    int msgctl(int msgid, int cmd, struct msgid_ds *buf);

    ftok函数:

            系统建立IPC通讯(消息队列、信号量和共享内存)时必须指定一个id值。通常情况下,该id值通过ftok函数得到。

    ftok原型

    #include
    #include
     
    key_t ftok(const char *pathname, int id);
     
    //使用
    key_t key;
    key=ftok(".",1);//将pathname设为当前目录
                    //id是子序号。int型,但是只使用8bit(1-255)

    消息队列的移除:

             msgctl(msgid,IPC_RMID,NULL);
     

    一般要在结尾加上移除。 

     3.代码:

    get.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. //创建或打开消息队列:成功返回队列id,失败返回-1
    8. //int msgget(key_t key, int flag);
    9. //添加消息:成功返回0,失败返回-1
    10. //int msgsnd(int msgid, const void *ptr, size_t size, int flag);
    11. //读取消息:成功返回消息数据的长度,失败返回-1
    12. //int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);
    13. //控制消息队列:成功返回0,失败返回-1
    14. //int msgctl(int msgid, int cmd, struct msgid_ds *buf);
    15. struct msgbuf{
    16. long mtype;
    17. char mtext[99];
    18. };
    19. int main()
    20. {
    21. struct msgbuf sendbuf= {35,"thank your message from get"};
    22. ;
    23. struct msgbuf readbuf ;
    24. key_t key;
    25. key = ftok(".",66);
    26. printf("key = %d\n",key);
    27. int msgid = msgget(key,IPC_CREAT|0777);
    28. if(msgid == -1){
    29. printf("id creat failure\n");
    30. }
    31. msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),25,0);
    32. printf("rcv from send :%s\n",readbuf.mtext);
    33. sleep(5);
    34. msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
    35. msgctl(msgid,IPC_RMID,NULL);
    36. return 0;
    37. }

    send.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. //创建或打开消息队列:成功返回队列id,失败返回-1
    8. //int msgget(key_t key, int flag);
    9. //添加消息:成功返回0,失败返回-1
    10. //int msgsnd(int msgid, const void *ptr, size_t size, int flag);
    11. //读取消息:成功返回消息数据的长度,失败返回-1
    12. //int msgrcv(int msgid, void *ptr, size_t size, long type, int flag);
    13. //控制消息队列:成功返回0,失败返回-1
    14. //int msgctl(int msgid, int cmd, struct msgid_ds *buf);
    15. struct msgbuf{
    16. long mtype;
    17. char mtext[99];
    18. };
    19. int main()
    20. {
    21. struct msgbuf sendbuf = {25,"this message is from sendbuf"};
    22. struct msgbuf readbuf;
    23. key_t key;
    24. key = ftok(".",66);
    25. printf("key = %d\n",key);
    26. int msgid = msgget(key,IPC_CREAT|0777);
    27. if(msgid == -1){
    28. printf("id creat failure\n");
    29. }
    30. msgsnd(msgid,&sendbuf,strlen(sendbuf.mtext),0);
    31. msgrcv(msgid,&readbuf,sizeof(readbuf.mtext),35,0);
    32. printf("rcv from get :%s\n",readbuf.mtext);
    33. msgctl(msgid,IPC_RMID,NULL);
    34. return 0;
    35. }

    结果:

  • 相关阅读:
    OSPF协议
    【愚公系列】2022年10月 微信小程序-优购电商项目-首页设计
    零代码网站开发利器:WordPress
    Linux中用嵌套方式打印
    图划分(Graph Partition&Re-ordering): METIS(5.x)&ParMETIS(4.x)使用实践
    手机号码携号转网API接口,轻松实现用户号码流转
    [python 刷题] 217 Contains Duplicate
    2010-2019年208个地级市城乡收入差距泰尔指数
    ssh基于WEB的农产品销售管理系统
    【办公类-04-03】华为助手导出照片视频分类(根据图片、视频的文件名日期分类导出)
  • 原文地址:https://blog.csdn.net/Herry_z/article/details/133107588