为什么mq_timedreceive忽略了timespec结构?

问题描述 投票:0回答:1

我试图让mq_timedreceive工作,等待一秒钟的消息到达,失败时打印一个字符,成功时打印消息。不幸的是,它忽略了timepec结构,只是立即打印chars。首先我试着声明一个const结构,像这样。

const struct timespec time = {1, 0}; // being {seconds, nanoseconds}

然后我想,也许它忽略了秒数,而用了纳秒,所以我找到了这个例子:

示例 mq_timedreceive

不幸的是,它也不工作,mq_timereceive返回。Resource tempoarily unavailable. 但是,这正是我想要的,但是一秒钟之后......

这是我的代码。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <mqueue.h>
#include <errno.h>
#include <signal.h>
#include <time.h>

#define MAX_SIZE 1024

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

char msg_ptr[MAX_SIZE]; // Buffer for mq_receive
char msq_name[] = "/mymsq";
unsigned int msg_prio = 1;
size_t msg_size;
mqd_t mqd; // POSIX message queue descriptor

int main() {


    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = MAX_SIZE;

    struct timespec time;
    clock_gettime(CLOCK_REALTIME, &time);
    time.tv_sec += 1000;


    mqd = mq_open(msq_name, O_RDONLY | O_CREAT | O_NONBLOCK, 0664, &attr);

    if(mqd == (mqd_t) -1)
        errExit("mq_open");
    else
        printf("Message queue with mqd: %d opened!\n", mqd );

    if(mq_getattr(mqd, &attr) == -1)
        errExit("mq_getattr");

    while(1) {
        msg_size = mq_timedreceive(mqd, msg_ptr, sizeof(msg_ptr), &msg_prio, &time);
        if(msg_size != -1) {
            printf("Received message: %s\n", msg_ptr);
            printf("Message size: %d\n", (int) msg_size);
        }
        if(msg_size == -1) 
            errExit("mq_timedreceive");

    }


    return 0;
}
c linux posix
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.