如果给定类型为0,则C消息队列为只读

yacmzcpb  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(110)

我创建了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放在中间,但似乎没有任何效果。你能帮个忙吗?谢谢。

cuxqih21

cuxqih211#

Linux manual page for msgsnd and msgrcv规定消息类型字段(消息结构的第一个成员)是long
在一个普通的64位Linux系统上,int是32位,而long是64位,这种类型不匹配会导致 undefined behavior
手册页还指出消息id需要大于零。
因此,您的tipo字段需要使用long类型,并且它必须始终大于0

相关问题