消息队列练习

打印 上一主题 下一主题

主题 2050|帖子 2050|积分 6150

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出。
  1. /********************************************************************************
  2. *
  3. *
  4. * 消息队列和信号结合
  5. * author:jindouliu2024@163.com
  6. * date:2025.5.8
  7. *
  8. *
  9. * Copyright (c)  2024-2025   jindouliu2024@163.com   All right Reserved
  10. ********************************************************************************/
复制代码
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/msg.h>
  6. #include <unistd.h>
  7. int key;
  8. int msg_id,id,x;
  9. struct msgbuf {
  10.                long mtype;       /* message type, must be > 0 */
  11.                int  mtext[1];    /* message data */
  12.            };
  13. struct msgbuf msg1;         
  14. //信号处理函数
  15. void sig_handler(int signal)
  16. {
  17.         //如果是接受到的信号是SIGUSR1,则执行
  18.         if(signal == SIGUSR1){
  19.                 msg1.mtype = 1;
  20.                 x = getpid();
  21.                 msg1.mtext[0] = x;
  22.                 printf("id = %d",x);
  23.                 msgsnd(msg_id,&msg1,sizeof(msg1.mtext[0]),IPC_NOWAIT);
  24.                 printf("请输入进程id:");
  25.                 scanf("%d",&id);
  26.                 kill(id,SIGUSR2);
  27.         }
  28. }
  29. int main()
  30. {
  31.        
  32.         //获取键值
  33.         key = ftok(".",1);
  34.         //创建消息队列
  35.         msg_id = msgget(key,IPC_CREAT|IPC_EXCL|0644);
  36.         if(msg_id == -1){
  37.                 printf("msgget error \n");
  38.                 //如果队列存在则直接打开
  39.                 msg_id = msgget(key,IPC_EXCL|0644);
  40.         }
  41.         printf("running\n");
  42.         signal(SIGUSR1,sig_handler);
  43.        
  44.         while(1);
  45.         return 0;
  46. }
复制代码
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include <sys/types.h>
  4. #include <sys/ipc.h>
  5. #include <sys/msg.h>
  6. #include <unistd.h>
  7. int key;
  8. int msg_id,id;
  9. struct msgbuf {
  10.                long mtype;       /* message type, must be > 0 */
  11.                int  mtext[1];    /* message data */
  12.            };
  13. struct msgbuf msg1;         
  14. //信号处理函数
  15. void sig_handler(int signal)
  16. {
  17.         //如果是接受到的信号是SIGUSR1,则执行
  18.         if(signal == SIGUSR2){
  19.                 printf("22\n");
  20.                 msgrcv(msg_id,&msg1,sizeof(msg1.mtext[0]),0,0);
  21.                        
  22.                 printf("process A id is %d\n",msg1.mtext[0]);
  23.         }
  24. }
  25. int main()
  26. {
  27.        
  28.         //获取键值
  29.         key = ftok(".",1);
  30.         //创建消息队列
  31.         msg_id = msgget(key,IPC_CREAT|IPC_EXCL|0644);
  32.         if(msg_id == -1){
  33.                 printf("msgget error \n");
  34.                 //如果队列存在则直接打开
  35.                 msg_id = msgget(key,IPC_EXCL|0644);
  36.         }
  37.         printf("running2\n");
  38.         printf("请输入进程id:");
  39.         scanf("%d",&id);
  40.         //发送消息
  41.         kill(id,SIGUSR1);
  42.         signal(SIGUSR2,sig_handler);
  43.        
  44.         while(1);
  45.         return 0;
  46. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表