操作系统msg实现生产者消费者C语言代码
时间: 2023-10-26 12:25:00 浏览: 136
下面是一个简单的生产者消费者模型的C语言代码,使用消息队列实现进程间通信:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <sys/wait.h>
#define MAX_MSG_SIZE 64
#define MAX_MSG_NUM 10
struct msgbuf {
long mtype;
char mtext[MAX_MSG_SIZE];
};
int main() {
int msgid;
pid_t pid;
// 创建消息队列
msgid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
if (msgid == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
// 创建生产者进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 生产者进程
int i;
struct msgbuf msg;
for (i = 0; i < MAX_MSG_NUM; i++) {
// 构造消息
msg.mtype = 1;
sprintf(msg.mtext, "Message %d from producer", i + 1);
// 发送消息
if (msgsnd(msgid, &msg, MAX_MSG_SIZE, 0) == -1) {
perror("msgsnd");
exit(EXIT_FAILURE);
}
printf("Producer sent: %s\n", msg.mtext);
}
exit(EXIT_SUCCESS);
}
// 创建消费者进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 消费者进程
int i;
struct msgbuf msg;
for (i = 0; i < MAX_MSG_NUM; i++) {
// 接收消息
if (msgrcv(msgid, &msg, MAX_MSG_SIZE, 0, 0) == -1) {
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("Consumer received: %s\n", msg.mtext);
}
exit(EXIT_SUCCESS);
}
// 等待子进程退出
wait(NULL);
wait(NULL);
// 删除消息队列
if (msgctl(msgid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(EXIT_FAILURE);
}
return 0;
}
```
以上代码中,首先使用`msgget`系统调用创建一个消息队列,然后创建一个生产者进程和一个消费者进程。生产者进程循环发送10条消息到消息队列中,消费者进程循环从消息队列中接收消息并输出。最后等待子进程退出,然后使用`msgctl`系统调用删除消息队列。
需要注意的是,在实际生产环境中,需要考虑更复杂的情况,如多个生产者或消费者同时访问消息队列,需要使用信号量等机制进行进程间同步和互斥。
阅读全文