Linux生产者消费者模型之阻塞队列
在Linux环境下,可以使用管道(pipe)或者消息队列(message queue)来实现一个简单的生产者消费者模型。以下是使用管道实现的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFFER_SIZE 1024
int main() {
int pipefd[2];
pid_t pid;
char buffer[BUFFER_SIZE];
int bytes_read;
// 创建管道
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
// 子进程作为生产者
if (pid == 0) {
close(pipefd[0]); // 关闭读端
while (1) {
const char* msg = "Hello, Consumer!";
write(pipefd[1], msg, strlen(msg)); // 写入数据到管道
sleep(1); // 生产者休眠,模拟生产速度
}
close(pipefd[1]);
exit(EXIT_SUCCESS);
} else {
close(pipefd[1]); // 关闭写端
while (1) {
bytes_read = read(pipefd[0], buffer, BUFFER_SIZE); // 从管道读取数据
if (bytes_read > 0) {
buffer[bytes_read] = '\0'; // 确保字符串以null结尾
printf("Consumer received: %s\n", buffer);
}
}
close(pipefd[0]);
wait(NULL); // 等待子进程结束
exit(EXIT_SUCCESS);
}
}
这段代码创建了一个管道,并使用了fork()
来创建一个子进程。父进程作为消费者,子进程作为生产者。他们通过管道进行通信。生产者定时往管道里写数据,消费者从管道中读取数据并打印。这个模型演示了同步和互斥的基本概念,是学习操作系统进程同步的一个简单例子。
评论已关闭