qidao123.com技术社区-IT企服评测·应用市场

标题: 消息队列练习 [打印本页]

作者: 知者何南    时间: 2025-5-8 13:23
标题: 消息队列练习
进程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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4