直接提关键点:
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进行捕获处理,不推荐使用该方法进行操作,因为非常鸡肋。