簡體   English   中英

mq_timedreceive 報告 EAGAIN 錯誤,但未設置 O_NONBLOCK

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM