我创建了2个函数,从一个给定的消息队列中读取一个给定的类型,一开始它工作,但后来只开始阅读消息,如果发送的类型等于0,这些函数:
int sendMessage(int msgQId,int tipo, char *msg) {
my_msg_buf msgBuf;
msgBuf.tipo = tipo;
char *str;
strncpy(msgBuf.testo, msg,MAX_LINE_LENGTH-1);
/* Mando messaggio specificato */
if (msgsnd(msgQId, (void *)&msgBuf, MAX_LINE_LENGTH, 0) == -1) {
fprintf(stderr, "Error sending message: %s\n", strerror(errno));
return -1;
}
str= receiveMessage(msgQId,tipo);
printf("Mess: %s\n",str);
printf("Message sent\n");
return 0;
}
char *receiveMessage(int msgQId, int tipo) {
my_msg_buf msgBuf;
/* Receive message by type */
if (msgrcv(msgQId, (void *)&msgBuf, MAX_LINE_LENGTH, tipo, IPC_NOWAIT) == -1) {
if(errno != ENOMSG)
fprintf(stderr, "Error: %s\n", strerror(errno));
return NULL;
}
return strdup(msgBuf.testo);
}
我使用的结构如下:
typedef struct mymsgbuf {
int tipo;
char testo[MAX_LINE_LENGTH];
} my_msg_buf;
其中,最大线长为256
这些函数在项目的其他地方使用,使用read函数的str变量只是为了测试。当使用tipo调用receiveMessage时,它返回NULL,当用0代替tipo变量时,它返回消息。我甚至试着把sleep放在中间,但似乎没有任何效果。你能帮个忙吗?谢谢。
1条答案
按热度按时间cuxqih211#
Linux manual page for
msgsnd
andmsgrcv
规定消息类型字段(消息结构的第一个成员)是long
。在一个普通的64位Linux系统上,
int
是32位,而long
是64位,这种类型不匹配会导致 undefined behavior。手册页还指出消息id需要大于零。
因此,您的
tipo
字段需要使用long
类型,并且它必须始终大于0
。