=与==的优先级

项目场景:

在写消息队列的过程中,问题代码如下:

#include "message.h"

void send(message *msg, int msg_id);
void main() {
    printf("The sender process id = %d\n", getpid());

    key_t key;
    int msg_id;
    message msg = {
        .type = 100
    };

    if(key = ftok("/home/jinshaomin/Code/os/2/message_queue/", 'r') == -1) {
        perror("ftok error!");
    }

    if (msg_id = msgget(key, IPC_CREAT | 0666)) == -1 
    {
        perror("msgget error!");
    }


    send(&msg, msg_id);

}

void send(message *msg, int msg_id) {
    while (1)
    {

        memset(msg->msg, 0, sizeof(msg->msg));
        fgets(msg->msg, MSG_SIZE, stdin);
        msg->msg[strlen(msg->msg)-1] = 0;
        msgsnd(msg_id, msg, MSG_SIZE, 0);

        if(!strncmp(msg->msg, "quit", 4)) {
            break;
        }
        printf("msg_id = %d is %s \n", msg_id, msg->msg);

    }

    msgctl(msg_id, IPC_RMID, NULL);
    
}

问题描述

在做消息队列的时候,发现发送者发送除了字符,但是接收者始终无法接收到,而且通过日志观察message id始终是0.


原因分析:

从发送到整个流程来看,发送端发出了字符串,但是接收端始终无法接收到。最后问题落在了message id始终为0的地方。最终是以下两行代码中,由于=的优先级低于==,导致ftok和msgget两个函数出现返回值错误的情况。

if(key = ftok("/home/jinshaomin/Code/os/2/message_queue/", 'r') == -1) {

        perror("ftok error!");

    }

    if (msg_id = msgget(key, IPC_CREAT | 0666)) == -1

    {

        perror("msgget error!");

    }


解决方案:

修改以下两处代码:

  if((key = ftok("/home/jinshaomin/Code/os/2/message_queue/", 'r')) == -1) {
        perror("ftok error!");
    }
    if ((msg_id = msgget(key, IPC_CREAT | 0666)) == -1) 
    {
        perror("msgget error!");
    }

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值