当前位置:C++技术网 > 资讯 > Linux中C++程序内清除消息队列并重建消息队列

Linux中C++程序内清除消息队列并重建消息队列

更新时间:2019-03-21 17:54:03浏览次数:1+次

    当一个服务器程序因为某种原因崩溃后,而客户端没有及时收到反馈,进而发了不少的消息,堆积到了系统的消息队列里。如果此时服务器程序启动,必然会去读取消息队列的消息,然后会连续读取大量的消息,疯狂的处理消息。然后会疯狂的给客户端回复,如果客户端是一个单片机或者比较弱的硬件程序,很多时候并没有处理TCP粘包的问题,即多个消息被合并到一个缓存中。很多硬件程序直接将这样的数据丢弃或者只取第一个。另外一个问题就是,当服务器重启后,尽管能继续处理消息,但是实际的应用场景已经不再需要这样的消息了,处理也是白费力气,甚至会造成逻辑错误。
    所以,当服务器程序启动时,我们最好将消息队列删除掉重建一个,这样不会有之前的错误的影响。
    我们获取消息队列使用: 

int id_queue = msgget((key_t)MSG_QUEUE_KEY, 0666 | IPC_CREAT);

    如果不存在消息队列则创建一个,存在则获取到消息队列的ID。MSG_QUEUE_KEY是消息队列的key。我们通过Key值创建或获取一个消息队列,然后返回消息队列的ID。如果成功,则返回ID值,如果失败则返回-1。

    如果我们要清除之前的消息队列,那么我们就这样先获取一下,获取成功后得到消息队列ID值。然后就可以通过这个ID值来删除消息队列了。
    删除消息队列使用:

int ret = msgctl(id_queue, IPC_RMID, 0);

    如果返回值ret为0表示删除消息队列成功,否则表示删除失败。

    重建消息队列让程序在一个全新的环境里运行,比先处理各种无效的脏消息来得更方便。