[英]mq_timedreceive reporting EAGAIN error with O_NONBLOCK not set
所述timespec
發送到mq_timedreceive
被設定為20秒。 20 秒后, errno
返回“資源暫時不可用”( EAGAIN
)。 此外,這會發送一個信號並使進程崩潰。 我期望發生的是ETIMEDOUT
響應和我的代碼繼續執行。 我已經確保隊列不與O_NONBLOCK
一起,所以不應該有理由為什么EAGAIN
event_type get_event_timed(mqd_t channel, struct timespec ts) {
//get timed touch event from devi-atmel-mxt
ssize_t ret = -1;
char Buffer[ASYNC_BUFFER_SIZE] = {0};
event_type *event;
//mq_monotonic will block for duration specfifed by timespec
//will return -1 && ETIMEDOUT if no event withing duration
ret = mq_timedreceive(channel, Buffer, ASYNC_BUFFER_SIZE, NULL, &ts);
if ((-1 == ret) && (errno == ETIMEDOUT)) {
slogf(_SLOGC_INPUT, _SLOG_ERROR, "[ASYNC_LOGGER] %s TIMEDOUT\n", __func__);
//return TIMEDOUT
*event = TIMEDOUT;
}
else if (-1 == ret) {
slogf(_SLOGC_INPUT, _SLOG_ERROR, "[ASYNC_LOGGER] %s error: %s\n", __func__, strerror(errno));
//return ERROR
*event = ERROR;
}
else {
//printf("mq_recieve sucess\n");
slogf(_SLOGC_INPUT, _SLOG_ERROR, "[ASYNC_LOGGER] get_event_timed: mq_recieve success\n");
//casting buffer into event_type
event = (event_type *)Buffer;
}
slogf(_SLOGC_INPUT, _SLOG_ERROR, "[ASYNC_LOGGER] %s buffer is: %d\n", __func__, *event);
return *event;
}
這是 QNX 中的一個已知錯誤。 由於隊列同時也為空,因此 mq 無法知道 ETIMEDOUT 和 O_NONBLOCK 之間的關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.