当前位置:   article > 正文

Linux用C语言实现消息队列

Linux用C语言实现消息队列

简单实例,运用消息队列实现两个进程间的通信

sent.c 向get.c发送数字,从0开始。当sent.c接收到数字后进行+10处理,将处理后的数字通过消息队列发送回sent.c。sent.c接收到数字后再次发送给get.c。实现get.c对其他进程出入数据+10的作用。

用于帮助理解进程间通过消息队列通信的方法

以下是代码

sent.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/msg.h>
  6. #define MSG_KEY 1234
  7. typedef struct {
  8. long mtype;
  9. int data;
  10. } Message;
  11. int main() {
  12. int msgid;
  13. Message message;
  14. // 创建消息队列
  15. msgid = msgget(MSG_KEY, IPC_CREAT | 0666);
  16. if (msgid == -1) {
  17. perror("msgget");
  18. exit(1);
  19. }
  20. // 向 get.c 发送消息:0
  21. message.mtype = 1;
  22. message.data = 0;
  23. if (msgsnd(msgid, &message, sizeof(int), 0) == -1) {
  24. perror("msgsnd");
  25. exit(1);
  26. }
  27. printf("id: %d Sent: 0\n\n",msgid);
  28. while (1) {
  29. // 接收来自 get.c 发来的数字
  30. if (msgrcv(msgid, &message, sizeof(int), 3, 0) == -1) {
  31. perror("msgrcv");
  32. exit(1);
  33. }
  34. printf("id: %d Received: %d\n", msgid,message.data);
  35. // 向 get.c
  36. message.mtype = 1;
  37. if (msgsnd(msgid, &message, sizeof(int), 0) == -1) {
  38. perror("msgsnd");
  39. exit(1);
  40. }
  41. printf("id: %d Sent: %d\n\n", msgid,message.data);
  42. sleep(1); // 等待 1 秒后再次发送消息
  43. }
  44. return 0;
  45. }

get.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/msg.h>
  6. #define MSG_KEY 1234
  7. typedef struct {
  8. long mtype;
  9. int data;
  10. } Message;
  11. int main() {
  12. int msgid;
  13. Message message;
  14. // 创建或获取消息队列
  15. msgid = msgget(MSG_KEY, 0666);
  16. if (msgid == -1) {
  17. perror("msgget");
  18. exit(1);
  19. }
  20. while (1) {
  21. // 接收sent.c发来的数字
  22. if (msgrcv(msgid, &message, sizeof(int), 1, 0) == -1) {
  23. perror("msgrcv");
  24. exit(1);
  25. }
  26. printf("id: %d receiced: %d\n", msgid,message.data);
  27. // 加10后发送回sent.c
  28. message.mtype = 3;
  29. message.data += 10;
  30. if (msgsnd(msgid, &message, sizeof(int), 0) == -1) {
  31. perror("msgsnd");
  32. exit(1);
  33. }
  34. // 输出接收到的数字
  35. printf("id: %d sent: %d\n\n",msgid,message.data);
  36. }
  37. return 0;
  38. }

运行结果如下图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/601574
推荐阅读
相关标签
  

闽ICP备14008679号