使用消息队列进行 IPC2025年4月30日 | 阅读 6 分钟 消息队列是一种进程间通信 (IPC) 机制,它允许进程以消息的形式在两个进程之间交换数据。它允许进程通过互相发送消息来进行异步通信,消息会存储在队列中,等待处理,并在处理后删除。 ![]() 消息队列是一种在非共享内存环境中使用的缓冲区,在这种环境中,任务通过传递消息而不是访问共享变量来通信。任务共享一个公共缓冲区池。消息队列是一个无界 FIFO 队列,可以防止不同线程的并发访问。 事件是异步的。当一个类向另一个类发送事件时,它不会直接发送给目标响应类,而是将事件传递给操作系统消息队列。目标类在准备好处理事件时,会从消息队列的头部检索事件。同步事件可以使用触发的操作来传递。 多个任务可以写入消息到队列,但一次只有一个任务可以从队列读取消息。读取者会在消息队列上等待,直到有消息可供处理。消息的大小可以是任意的。 消息队列的功能为了实现使用消息队列的 IPC,我们将使用四个重要的函数。 1. int msgget (key_t key, int msgflg); 我们使用 msgget 函数来创建和访问消息队列。它接受两个参数。
2. int msgsnd (int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); 此函数允许我们将消息添加到消息队列。
消息结构有两个约束。首先,它必须小于系统限制,其次,它必须以 long int 开头。这个 long int 在接收函数中用作消息类型。最佳的消息结构如下所示。 由于 message_type 在消息接收中使用,您不能简单地忽略它。您必须声明您的数据结构以包含它,并且最好将其初始化为一个已知值。 3. int msgrcv (int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); 此函数从消息队列检索消息。
4. int msgctl (int msqid, int command, struct msqid_ds *buf); 最后一个函数是 msgctl,它是控制函数。
msgctl 函数成功时返回 0,错误时返回 -1。如果在进程等待 msgsnd 或 msgrcv 函数时消息队列被删除,发送或接收函数将失败。 使用消息队列执行 IPC 的步骤消息队列是存储在内核中的消息的链表,由消息队列标识符标识。以下是使用消息队列执行通信的步骤。 ![]()
示例程序 1:让我们编写一个使用消息队列进行 IPC 的程序来向消息队列发送数据。 输出 上面的程序输出如下。 ![]() 它是如何工作的? 结构 my_msg 声明了 long int 变量和 char 数组来存储发送到消息队列的数据。然后使用 msgget() 函数创建消息队列。接下来,使用 fgets() 从用户那里读取数据到缓冲区,然后将其复制到结构 some_data 的变量 some_text 中。最后,使用 msgsnd() 函数将数据发送到队列。strcmp 函数用于通过比较数据的前三个字符来停止发送数据。如果数据以“end”开头,则表示不再发送数据。 程序 2:现在,让我们编写一个使用消息队列进行 IPC 的程序来从上面创建的消息队列接收或读取消息。 输出 上述代码给出以下输出。 ![]() 它是如何工作的? 将 msg_to_rec 变量设置为 0,以便按发送的顺序接收数据。while 循环用于使用 mgrcv() 函数连续接收数据,直到接收到的文本为“end”,我们使用 strcmp 函数进行检查。使用 my_msg 结构读取数据。 |
我们请求您订阅我们的新闻通讯以获取最新更新。