c语言消息队列互相读写
时间: 2023-06-15 12:06:49 浏览: 121
将消息写入消息队列
在 C 语言中,可以使用 POSIX 消息队列(POSIX Message Queues)来实现进程间的通信,包括读写操作。以下是一个简单的例子,展示了两个进程之间的消息队列读写操作:
进程 A:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#define QUEUE_NAME "/my_mq"
#define MAX_MSG_SIZE 2048
#define MSG_BUFFER_SIZE (MAX_MSG_SIZE + 10)
int main(int argc, char **argv) {
mqd_t mq;
char buffer[MSG_BUFFER_SIZE];
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = MAX_MSG_SIZE;
attr.mq_curmsgs = 0;
mq_unlink(QUEUE_NAME);
mq = mq_open(QUEUE_NAME, O_CREAT | O_RDONLY, S_IRUSR | S_IWUSR, &attr);
if (mq == -1) {
perror("mq_open");
exit(1);
}
while (1) {
ssize_t bytes_read;
bytes_read = mq_receive(mq, buffer, MSG_BUFFER_SIZE, NULL);
if (bytes_read == -1) {
perror("mq_receive");
exit(1);
}
buffer[bytes_read] = '\0';
printf("Received message: %s\n", buffer);
}
return 0;
}
```
进程 B:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#define QUEUE_NAME "/my_mq"
#define MAX_MSG_SIZE 2048
#define MSG_BUFFER_SIZE (MAX_MSG_SIZE + 10)
int main(int argc, char **argv) {
mqd_t mq;
char buffer[MSG_BUFFER_SIZE];
mq = mq_open(QUEUE_NAME, O_WRONLY);
if (mq == -1) {
perror("mq_open");
exit(1);
}
while (1) {
printf("Enter a message: ");
fflush(stdout);
fgets(buffer, MSG_BUFFER_SIZE, stdin);
if (mq_send(mq, buffer, strlen(buffer), 0) == -1) {
perror("mq_send");
exit(1);
}
}
return 0;
}
```
在上面的代码中,进程 A 创建了一个消息队列,并不断地等待接收来自进程 B 的消息。进程 B 打开了同样的消息队列,并不断地读取用户的输入,并将输入内容发送给进程 A。
需要注意的是,消息队列的创建和打开需要使用相同的 `mq_open` 函数调用。此外,消息队列的名称需要以斜杠开头,以便被系统识别为全局命名空间下的对象。在消息队列读写时,需要指定消息的大小和具体的消息队列对象。对于读操作,可以调用 `mq_receive` 函数,它会阻塞当前进程直到有消息到达。对于写操作,可以调用 `mq_send` 函数,它会将指定大小的消息发送给消息队列。如果消息队列已满,`mq_send` 函数会阻塞当前进程直到有空间可用。
以上是一个简单的例子,展示了 C 语言中如何使用 POSIX 消息队列进行进程间通信。不过,在实际应用中,还需要考虑更复杂的场景,如多个进程同时读写同一个消息队列、多个消息队列之间的交互、消息队列的安全性等问题。
阅读全文