FreeFlyOS【十七】:pipe部分详解

这篇博客详细介绍了FreeFlyOS中双向管道的实现,它借鉴了生产者消费者问题的思路。首先,初始化一个包含锁和缓冲区的IO队列用于进程间的通信。接着,管道表现为文件描述符表中的i节点,双向管道包括读管道和写管道,它们被映射到全局文件表,并安装到各自进程的文件描述符表中。最后,父子进程通过文件描述符表访问全局文件表的i节点,实现通信。当缓冲区有数据时,消费者会被唤醒;若无数据,则消费者会等待。
摘要由CSDN通过智能技术生成

ioqueue.c

#include "ioqueue.h"
#include "../task/task.h"
#include "../debug/debug.h"
extern struct task_struct *current;
/* 初始化io队列ioq */
void ioqueue_init(struct ioqueue* ioq) {
   lock_init(&ioq->lock);     // 初始化io队列的锁
   ioq->producer = ioq->consumer = NULL;  // 生产者和消费者置空
   ioq->head = ioq->tail = 0; // 队列的首尾指针指向缓冲区数组第0个位置
}

/* 返回pos在缓冲区中的下一个位置值 */
static int next_pos(int pos) {
   return (pos + 1) % bufsize; 
}

/* 判断队列是否已满 */
char ioq_full(struct ioqueue* ioq) {
   //ASSERT(get_now_intr_status() == INTR_OFF);
   return next_pos(ioq->head) == ioq->tail;
}

/* 判断队列是否已空 */
static char ioq_empty(struct ioqueue* ioq) {
   //ASSERT(get_now_intr_status() == INTR_OFF);
   return ioq->head == ioq->tail;
}

/* 使当前生产者或消费者在此缓冲区上等待 */
static void ioq_wait(struct task_struct** waiter) {
   ASSERT(*waiter == NULL && waiter !=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值