????????在linux中使用posix中的消息隊列時遇到了一個問題,就是在發送消息時,如果隊列滿了,mq_send接口會一直阻塞,經過查找資料后才發現,該接口默認是阻塞的,也就是說,當隊列滿了以后,接口會一直等待,一直等到隊列中有空間后才返回。
避免阻塞的方式有以下幾種:
1、設置為非阻塞模式
在打開隊列時,設置指定為O_NONBLOCK的標志,如下所示:
mqd_t mq = mq_open("/myqueue", O_WRONLY | O_CREAT | O_NONBLOCK, 0644, &attr);
如果隊列滿了,該接口會立即返回-1,errno=11,也就是EAGAIN;
我使用的就是這種方式;
2、使用超時返送函數mq_timedsend(),參考代碼如下所示:
#include <mqueue.h>
#include <time.h>struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts); // 獲取當前時間
ts.tv_sec += 5; // 設置 5 秒超時int ret = mq_timedsend(mq, msg_ptr, msg_len, msg_prio, &ts);
if (ret == -1) {if (errno == ETIMEDOUT) { /* 處理超時 */ }
}
注意,這個接口中的時間是系統絕對時間,表示相對時間,所以需要先獲取當前的系統時間,再加上超時的時間;
這種方式我沒有使用,是deepseek提供的方式;
3、增加消息隊列容量
這種方式不解決根本問題,隊列滿了,依然是阻塞;
????????有一點兒需要注意,posix的消息隊列時系統級的,如果隊列滿了,也沒有消費者去讀取隊列里面的數據,這個時候,只能重啟系統,才能將隊列數據清空;