项目场景:
在写消息队列的过程中,问题代码如下:
#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!");
}