boost::interprocess::message_queue 基础类库IPC进程间通信。

直接提关键点:

1、接收消息时必须加上超时时间

2、它是基于共享内存及命名管道实现的

3、必须确保写入消息队列的消息是正常的

4、它不是线程安全的,确保没有并行操作

5、其它进程打开后,无法关闭它创建的消息队列(因为操作系统是按照引用技术管理共享内存及命名管道的)

6、如果出现异常,请确保这种紧急时刻,R/W-IPC的所有操作必须在退出进程前完成

XXDD:

IPC、命名管道式最大的问题是主进程挂了无法立即回收,除非所有进程都关闭了它,但潜在问题是相对容易出现多进程死锁问题,若用作同步间的消息队列且处理不当的话。

Windows下使用MMF、Named Pipe 技术,Linux 使用SHM技术,作为简单可靠的IPC间通信建议使用SOCKET的接口来实现,例:Unix Socket?

创建消息队列:

boost::interprocess::permissions permissions;
permissions.set_unrestricted(); // 设置为允许所有者读写,允许组成员读取
boost::interprocess::message_queue mq(boost::interprocess::create_only, name, max_queue_message_count, max_message_bytes_size, permissions);

set_unrestricted() 函数设置为其他人可读写,Linux 等价于权限 0666。

打开消息队列:

    // 创建命名管道
    boost::interprocess::message_queue::remove("my_named_pipe");  // 确保命名管道不存在
    boost::interprocess::message_queue mq(boost::interprocess::open_only, "my_named_pipe");

    // 写入数据
    int data_to_send = 42;
    mq.send(&data_to_send, sizeof(data_to_send), 0);

    // 读取数据
    unsigned int priority;
    int received_data;
    size_t recvd_size;
    mq.receive(&received_data, sizeof(received_data), recvd_size, priority);

    // 关闭命名管道
    boost::interprocess::message_queue::remove("my_named_pipe");

注意:构造消息队列时可能发生SEH结构化异常处理问题,所以注意自行try-catch进行捕获处理,不推荐使用该方法进行操作,因为非常鸡肋。

你可能感兴趣的:(Extension,linux,运维,服务器)