首页 > 其他分享 >消息队列练习题

消息队列练习题

时间:2024-05-27 21:44:26浏览次数:21  
标签:练习题 msgbuf 队列 int 消息 printf msg 进程

题目:
要求进程A创建一条消息队列之后向进程B发送SIGUSR1信号,进程B收到该信号之后打开消息队列并把进程的PID作为消息写入到消息队列中,要求进程B在写入消息之后,发SIGUSR2信号给进程A,进程A收到该信号则从消息队列中读取消息并输出消息正文的内容。
进程A的代码:


// 构造用于接收消息队列的结构体
typedef struct msg_buf
{
    long mtype;
    int mtext;
} msgbuf_t;

int msg_id;
struct msg_buf msgbuf;
int a;

// 收到进程B发送的SIGUSR2信号后,从消息队列中读取消息并输出消息正文的内容
void sighandler(int)
{

    bzero(&msgbuf, sizeof(msgbuf_t));

    a = msgrcv(msg_id, &msgbuf, sizeof(msgbuf_t), 0, 0); // 默认阻塞
    printf("a= %d\n", a);
    if (-1 == a)
    {
        fprintf(stderr, "msgrcv fail,error = %d, %s\n", errno, strerror(errno));
    }

    // 输出读取到的值
    printf("this is what I read from message queue:%d\n", msgbuf.mtext);
}

int main()
{
    // 创建一个键值,供消息队列使用
    key_t key = ftok(".", 0xffffff01);

    // 创建一条消息队列
    msg_id = msgget(key, IPC_CREAT | 0644);
    if (-1 == msg_id)
    {
        // printf("here\n");
        fprintf(stderr, "msgget fail,error = %d, %s\n", errno, strerror(errno));
    }

    // 手动输入进程B的PID
    int Bpid = 0;
    printf("please input the PID of processB\n");
    scanf("%d", &Bpid);

    // 向进程B发送SIGUSR1信号
    kill(Bpid, SIGUSR1);

    // 将需要读取的msgbuf缓冲区清零
    bzero(&msgbuf, sizeof(msgbuf_t));

    // 等待进程B发送的SIGUSR2信号
    signal(SIGUSR2, sighandler);

    while (1)
        ;

    return 0;
}

进程B的代码:


// 构造用于接收消息队列的结构体
typedef struct msg_buf
{
    long mtype;
    int mtext;
} msgbuf_t;

int msg_id;
msgbuf_t msgbuf;
int Apid;
int a;

void sighandler(int)
{
    // 创建A创建消息队列所用的键值
    key_t key = ftok(".", 0xffffff01);

    // 打开进程A创建的消息队列
    msg_id = msgget(key, 0644);
    if (-1 == msg_id)
    {
        fprintf(stderr, "msgget fail,error = %d, %s\n", errno, strerror(errno));
    }

    //  将需要读取的msgbuf缓冲区清零
    bzero(&msgbuf, sizeof(msgbuf_t));
    msgbuf.mtype = 1;

    // 获取当前进程pid,并存入缓存区
    msgbuf.mtext = getpid();
    printf("this what I sent%d\n", msgbuf.mtext);
    printf("here111\n");

    // 将缓存区发送到消息队列
    a = msgsnd(msg_id, &msgbuf, sizeof(int), 0); // 默认阻塞
    printf("a= %d\n", a);
    if (-1 == a)
    {
        printf("here\n");
        fprintf(stderr, "msgget fail,error = %d, %s\n", errno, strerror(errno));
    }

    printf("please input the PID of processA\n");
    scanf("%d", &Apid);

    // 发SIGUSR2信号给进程A
    kill(Apid, SIGUSR2);
}

int main()
{

    // 接收进程A发送的SIGUSR1信号
    signal(SIGUSR1, sighandler);

    while (1)
        ;

    return 0;
}

标签:练习题,msgbuf,队列,int,消息,printf,msg,进程
From: https://www.cnblogs.com/Dazz24/p/18216597

相关文章

  • 代码随想录算法训练营第三十七天 | 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多线程的方式可以解决该问题,但引入多线程会导致线程安全的问题。针对某些场景,......
  • 【Azure Stream Analystics】流分析服务执行遇见警告错误消息,导致上游数据堆积,下游无
    问题描述AzureStreamAnalystics服务运行状态正常,测试输出也正常。但是下游没有任何数据产生。只是在概述页面中提示:Message:Encounterederrortryingtodiscovernewreferencedatasnapshot.Error:ThejobhasencounterederrorfromReferenceDatastorage.Error......
  • 互斥锁、进程间通信(IPC)、队列(queue)模块、队列实现进程间通信、生产者和消费者模型
    【一】互斥锁【1】什么是进程同步(互斥锁)互斥锁(Mutex)是一种用于多线程编程中控制对共享资源访问的机制。其作用是保证在同一时刻只有一个线程在访问共享资源,从而避免多个线程同时读写数据造成的问题。互斥锁的基本原理是在对共享资源进行访问前加锁,使得其他线程无法访问该......
  • Android Toast弹出消息在指定位置(setGravity)
    importandroid.widget.Toastimportandroid.view.Gravity默认Toast是显示在底部的,可以通过以下方法让其显示在顶部正中Toasttoast=Toast.makeText(SearchActivity.this,"取消关注失败",Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER,0,0);toast.show();这样......
  • websocket实现消息实时通信
    后端代码实现1、导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>3.2.5</version></dependency>2、创建websocket客户端对象。@Getter@Set......
  • 8. 聚合函数练习题
    【题目】1.where子句可否使用组函数进行过滤?selectmax(salary),min(salary),avg(salary),sum(salary)fromemployeese;2.查询公司员工工资的最大值,最小值,平均值,总和selectmax(salary),min(salary),avg(salary),sum(salary)fromemployeesegroupbyjob_i......
  • windows下mysql修改表名大消息参数lower_case_table_names,需要initialize才生效
    第一步:尝试修改文件my.ini,发现改了重启不管用:C:\ProgramFiles\MySQL\MySQLServer8.0\bin>notepadmy.ini[mysqld]lower_case_table_names=2 第二步:尝试初始化mysql服务,带上参数。注意,会清空数据库,所以务必先备份数据!!!参考:https://blog.csdn.net/cccgo68/article/d......
  • [AIGC] flink sql 消费kafka消息,然后写到mysql中的demo
    这是一个使用FlinkSQL从Kafka中消费数据并写入MySQL的示例。在这个示例中,我们将假设有一个Kafka主题“input_topic”,它产生格式为(user_id:int,item_id:int,behavior:string,timestamp:long)的数据,我们需要把这些数据写入名为"output_table"的MySQL表......