• IO 作业 24/2/26


    1>思维导图

    1> 使用消息队列完成两个进程间相互通信

    1. #include<myhead.h>
    2. //定义一个消息类型
    3. struct msgbuf
    4. {
    5. long mtype; //消息类型
    6. char mtext[1024]; //消息正文
    7. };
    8. //定义一个宏,表示消息正文大小
    9. #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
    10. int main(int argc, const char *argv[])
    11. {
    12. //创建子进程
    13. pid_t pid=fork();
    14. //在父进程实现读功能
    15. if(pid>0)
    16. {
    17. //1、创建key
    18. key_t key = 0;
    19. if((key=ftok("/", 'k')) == -1)
    20. {
    21. perror("ftok error");
    22. return -1;
    23. }
    24. //2、根据key值创建一个消息队列
    25. int msqid = -1;
    26. if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
    27. {
    28. perror("msgget error");
    29. return -1;
    30. }
    31. //定义一个消息
    32. struct msgbuf rbuf;
    33. while(1)
    34. {
    35. //清空容器
    36. bzero(rbuf.mtext, sizeof(rbuf.mtext));
    37. //只接受类型1
    38. msgrcv(msqid, &rbuf, MSGSIZE, 1, 0);
    39. printf("收到消息为:%s\n", rbuf.mtext);
    40. if(strcmp(rbuf.mtext, "quit")==0)
    41. {
    42. break;
    43. }
    44. }
    45. //删除消息队列
    46. if(msgctl(msqid, IPC_RMID, NULL) !=0)
    47. {
    48. perror("msgctl error");
    49. return -1;
    50. }
    51. }
    52. //在子进程实现写功能
    53. if(pid==0)
    54. {
    55. //1、创建key
    56. key_t key = 0;
    57. if((key=ftok("/", 'k')) == -1)
    58. {
    59. perror("ftok error");
    60. return -1;
    61. }
    62. //2、根据key值创建一个消息队列
    63. int msqid = -1;
    64. if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
    65. {
    66. perror("msgget error");
    67. return -1;
    68. }
    69. //定义一个消息
    70. struct msgbuf sbuf;
    71. while(1)
    72. {
    73. //清空正文的容器
    74. bzero(sbuf.mtext, sizeof(sbuf.mtext));
    75. sbuf.mtype=2;
    76. printf("请输入消息正文:");
    77. fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);
    78. sbuf.mtext[strlen(sbuf.mtext)-1] = 0;
    79. //将消息存放入队列中
    80. msgsnd(msqid, &sbuf, MSGSIZE, 0);
    81. printf("发送成功\n");
    82. if(strcmp(sbuf.mtext, "quit")==0)
    83. {
    84. break;
    85. }
    86. }
    87. }
    88. return 0;
    89. }
    1. #include<myhead.h>
    2. //定义一个消息类型
    3. struct msgbuf
    4. {
    5. long mtype; //消息类型
    6. char mtext[1024]; //消息正文
    7. };
    8. //定义一个宏,表示消息正文大小
    9. #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)
    10. int main(int argc, const char *argv[])
    11. {
    12. //创建子进程
    13. pid_t pid=fork();
    14. //在父进程实现读功能
    15. if(pid>0)
    16. {
    17. //1、创建key
    18. key_t key = 0;
    19. if((key=ftok("/", 'k')) == -1)
    20. {
    21. perror("ftok error");
    22. return -1;
    23. }
    24. //2、根据key值创建一个消息队列
    25. int msqid = -1;
    26. if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
    27. {
    28. perror("msgget error");
    29. return -1;
    30. }
    31. //定义一个消息
    32. struct msgbuf rbuf;
    33. while(1)
    34. {
    35. //清空容器
    36. bzero(rbuf.mtext, sizeof(rbuf.mtext));
    37. //只接受类型2
    38. msgrcv(msqid, &rbuf, MSGSIZE, 2, 0);
    39. printf("收到消息为:%s\n", rbuf.mtext);
    40. if(strcmp(rbuf.mtext, "quit")==0)
    41. {
    42. break;
    43. }
    44. }
    45. //删除消息队列
    46. if(msgctl(msqid, IPC_RMID, NULL) !=0)
    47. {
    48. perror("msgctl error");
    49. return -1;
    50. }
    51. }
    52. //在子进程实现写功能
    53. if(pid==0)
    54. {
    55. //1、创建key
    56. key_t key = 0;
    57. if((key=ftok("/", 'k')) == -1)
    58. {
    59. perror("ftok error");
    60. return -1;
    61. }
    62. //2、根据key值创建一个消息队列
    63. int msqid = -1;
    64. if((msqid = msgget(key, IPC_CREAT|0664)) == -1)
    65. {
    66. perror("msgget error");
    67. return -1;
    68. }
    69. //定义一个消息
    70. struct msgbuf sbuf;
    71. while(1)
    72. {
    73. //清空正文的容器
    74. bzero(sbuf.mtext, sizeof(sbuf.mtext));
    75. sbuf.mtype=1;
    76. printf("请输入消息正文:");
    77. fgets(sbuf.mtext, sizeof(sbuf.mtext), stdin);
    78. sbuf.mtext[strlen(sbuf.mtext)-1] = 0;
    79. //将消息存放入队列中
    80. msgsnd(msqid, &sbuf, MSGSIZE, 0);
    81. printf("发送成功\n");
    82. if(strcmp(sbuf.mtext, "quit")==0)
    83. {
    84. break;
    85. }
    86. }
    87. }
    88. return 0;
    89. }

  • 相关阅读:
    基于单片机的自动变速箱电控系统
    Node.js基础知识点
    工资信息管理系统的设计
    C++:二叉搜索树
    Java项目:SSM汽车维修管理系统源码
    【linux编程】linux文件IO的标准函数及其示例(fread,fwrite,fgetc,fputc,fgets,fputs,fprintf,fscanf)
    傻瓜式Java操作MySQL数据库备份
    【02】Spring源码-手写篇-手写DI实现
    上海交大牵手淘宝成立媒体计算实验室:推动视频超分等关键技术发展
    这五个bug,论文绘图时千万别碰!
  • 原文地址:https://blog.csdn.net/2301_81317593/article/details/136289700