2016-02-22 91 views
0

我目前正在研究通過Posix消息隊列執行IPC的程序。我現在需要一個刪除該隊列的每條消息的函數。問題是:我的代碼死鎖。目前我正在嘗試以下操作:如何清除POSIX消息隊列?

void clear_mq(std::string queue_name) 
{ 
    struct mq_attr mq_attrs = {0, 10, sizeof(uint8_t), 0}; 

    mqd_t mq = ::mq_open(queue_name.c_str(), O_WRONLY | O_CREAT, 00644, &mq_attrs); 

    if (mq < 0) 
    { 
     std::cout << "Error opening Queue" << std::endl; 
     exit(-1); 
    } 

    struct mq_attr num_messages; 
    if (mq_getattr(mq, &num_messages) == -1) 
    { 
     std::cout << "Error!" << std::endl; 
     exit(-1); 
    } 
    while (num_messages.mq_curmsgs > 0) 
    { 
     uint8_t buf; 
     mq_receive(mq, (char *)&buf, sizeof(uint8_t), NULL); 
     if (mq_getattr(mq, &num_messages) == -1) 
     { 
      std::cout << "Error!" << std::endl; 
      exit(-1); 
     } 
    } 
    mq_close(mq); 
} 

任何人都可以指出我做錯了什麼嗎?我不明白爲什麼接收阻塞...在那一刻,當我撥打clear_mq沒有人在接收塊...

回答

0

你恕我直言,沒有死鎖。但是,mq_receive阻塞,直到它收到一條消息(man mq_receive),因爲該隊列未打開O_NONBLOCK參數,而mq_open

另請確保您不會忽略循環中mq_receive的返回值。

+0

是的,但我確保它只有在消息可用時才通過'mq_receive'調用(通過'mq_getattr')。結果是一個好點,謝謝! – Nidhoegger

1

可能是mq_receive()失敗,你最終在一個無限循環。

mq_receive()由於各種原因可能會失敗,例如,所提供的緩衝區必須至少具有mq-maxsize的大小。

您應該檢查mq_receive()的返回值並在循環失敗時退出。