首页 > 其他分享 >消息队列

消息队列

时间:2024-05-28 15:25:24浏览次数:25  
标签:队列 msgid pid int 消息 key msg include

img

进程A:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
 #include <errno.h>
#include <string.h>

int msgid;
int msgBpid;

struct {
        long mtype;
        pid_t pid;
    } msg;


void sigusr2_handler(int sig) {
   
   //读取消息
    msgrcv(msgid, &msg, sizeof(msg.pid), 0, 0);
    printf("Received message from process B. PID: %d\n", msg.pid);//打印进程B的pid
    
    // 删除消息队列
    msgctl(msgid, IPC_RMID, NULL); 
   
}

int main() {

    //创建一个消息队列
    key_t key = ftok(".", 10);
    msgid = msgget(key, IPC_CREAT | 0666);

    if(msgid == -1)//判断创建是否出错
    {
        fprintf(stderr,"msgget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }

    //输入进程B的pid
    printf("please input msgB pid:");
    scanf("%d",&msgBpid);
    
    // 发送SIGUSR1信号给进程B
    kill(msgBpid, SIGUSR1); 

    //信号响应接口
    signal(SIGUSR2, sigusr2_handler);

    //获取进程A的pid;创建消息队列的id
    printf("Process A (PID: %d) ", getpid());

    
    while (1);
        

    return 0;
}

进程B:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <string.h>

int msgid;
int msgApid;

struct {
    long mtype;
    pid_t pid;
} msg;

void sigusr1_handler(int sig) {
  
   //发送消息
    msg.mtype = 1;
    msg.pid = getpid();
    msgsnd(msgid, &msg, sizeof(msg.pid), IPC_NOWAIT);

}

int main() {
    //创建消息队列
    key_t key = ftok(".", 10);
    msgid = msgget(key, IPC_CREAT | 0666);

    if(msgid == -1)//判断创建是否出错
    {
        fprintf(stderr,"msgget error,error:%d,%s\n",errno,strerror(errno));
        return -1;
    }
    
    //信号响应接口
    signal(SIGUSR1, sigusr1_handler);

    //输入进程A的pid
    printf("please input msgA pid:");
    scanf("%d",&msgApid);

    // 发送SIGUSR2信号给进程A
    kill(msgApid, SIGUSR2); 


    //打印进程B的pid;打开消息队列的id
   // printf("Process B (PID: %d)", getpid());
    
    while (1);


    return 0;
}

注意:利用ps -ef命令可查看进程中的pid。

标签:队列,msgid,pid,int,消息,key,msg,include
From: https://www.cnblogs.com/lwj294/p/18218097

相关文章

  • 数据结构:队列
    目录队列的概念和结构队列的实现结构定义初始化判空入队列出队列返回队头元素返回队尾元素返回size销毁 队列的概念和结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操......
  • kafka 保证消息有序性
    具体需要从生产者和消费者两个方面来讲:生产者:1.分区机制:Kafka的核心机制之一是分区(Partition)。每个主题(Topic)可以被分割成多个分区,而消息在发布时会被追加到特定的分区中。在每个分区内部,消息是按照它们被追加的顺序来存储的,因此保证了分区内的消息顺序性。 2.分区器:生......
  • FolkMQ v1.5.1 发布(“新式” 国产消息中间件)
    FolkMQ是个“新式”的消息中间件。强调:“小而巧”、“简而强”。功能简表角色功能生产者(客户端)发布普通消息、Qos0消息、定时消息、顺序消息、可过期消息、事务消息、广播消息消费者(客户端)订阅、取消订阅。消费-ACK(自动、手动)服务端发布-Confirm、订......
  • 消息队列练习题
    消息队列练习题进程A/**********************************************************************filename:mesqa.c*author:[email protected]*date:2024/5/28*function:接收进程b的信号,读出消......
  • 如果任务过多,队列积压怎么处理?
    如果任务过多,队列积压怎么处理?1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办如图:大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请......
  • netty建立数万客户端连接,并主动发消息
    @Slf4jpublicclassNettyClientTest{publicstaticvoidmain(String[]args)throwsException{EventLoopGroupworkerEventLoopGroup=newNioEventLoopGroup();try{Bootstrapbootstrap=newBootstrap();boo......
  • 消息队列练习题
    题目:要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内容。进程A的代码://构造用于接收消息......
  • 代码随想录算法训练营第三十七天 | 860.柠檬水找零、406.根据身高重建队列、452.用最
    目录860.柠檬水找零思路代码 406.根据身高重建队列思路代码452.用最少数量的箭引爆气球思路代码860.柠檬水找零本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。代码随想录思路    这题还有什么难不难的,这道题不是非常经典的入门题吗。......
  • 系统编程练习题----使用消息队列实现两个进程之间的通信
    目录题目思路代码展示进程A进程B结果展示题目要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并写入一段信息作为消息写入到消息队列中,要求进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文......
  • 【ROS】-- 自定义回调队列
    在ros中,我们常用的回调处理是ros::spin()或者ros::spinOnce(),但是,这两个是阻塞式单线程处理的,即当不做其他处理的情况下,某一个回调函数堵塞,其他topic或者service的回调函数就无法进入。使用ros多线程的方式可以解决该问题,但引入多线程会导致线程安全的问题。针对某些场景,......