我试图让mq_timedreceive工作,等待一秒钟的消息到达,失败时打印一个字符,成功时打印消息。不幸的是,它忽略了timepec结构,只是立即打印chars。首先我试着声明一个const结构,像这样。
const struct timespec time = {1, 0}; // being {seconds, nanoseconds}
然后我想,也许它忽略了秒数,而用了纳秒,所以我找到了这个例子:
不幸的是,它也不工作,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;
}