c语言编程用消息队列实现两个进程间的互相读写,用sys/msg.h里的函数
时间: 2023-06-15 08:06:42 浏览: 120
Linux-interProcessCommunication:Linux进程间通信(消息队列信号量+共享内存)
好的,下面给出一个简单的例子。
首先,我们需要定义一个消息的结构体,包含消息的类型和内容:
```c
struct message {
long type;
char content[1024];
};
```
然后,我们需要创建两个进程,一个用来发送消息,一个用来接收消息。在这两个进程中,我们都需要创建一个消息队列,用来存储消息。
```c
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int msgid;
struct message msg;
// 创建消息队列
msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(1);
}
// 发送消息
msg.type = 1; // 消息类型为1
sprintf(msg.content, "%s", "Hello, world!");
if (msgsnd(msgid, &msg, sizeof(msg.content), 0) == -1) {
perror("msgsnd");
exit(1);
}
// 接收消息
if (msgrcv(msgid, &msg, sizeof(msg.content), 0, 0) == -1) {
perror("msgrcv");
exit(1);
}
printf("Received message: %s\n", msg.content);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
```
上面的代码中,我们首先创建了一个消息队列,然后在发送进程中,将消息的类型设为1,内容为"Hello, world!",并发送到消息队列中。在接收进程中,我们从消息队列中读取消息,并打印出来。最后,我们删除消息队列。
注意,在创建消息队列时,我们使用了IPC_PRIVATE作为键值,这意味着这个消息队列只能被创建进程和其子进程访问。如果我们想要在两个独立的进程中使用同一个消息队列,我们需要使用一个已知的键值,比如ftok函数生成的键值。另外,我们还需要注意消息的大小,要确保发送和接收进程中使用的消息大小一致。
阅读全文