static ssize_t fifo_read (struct file *f, char __user *p, size_t n, loff_t *off)
{
int size;
if(FIFO.cursize == 0)
//let this procss go to sleep
wait_event_interruptible(FIFO.readqueue, FIFO.cursize != 0);
size = n>FIFO.cursize?FIFO.cursize:n;
// return 0;
int len1, len2;
if(FIFO.start <= FIFO.end)// copy once
{
if(copy_to_user(p, FIFO.qbuf, size))
{
printk("copy to user fail1\n");
return -EINVAL;
}
}
else
{
len1 = FIFO.maxsize-FIFO.start;
if(copy_to_user(p, &FIFO.qbuf[FIFO.start], len1))
{
printk("copy to user fail2\n");
return -EINVAL;
}
len2 = size-len1;
if(copy_to_user(p+len1, FIFO.qbuf, len2))
{
printk("copy to user fail3\n");
return -EINVAL;
}
}
FIFO.start = (FIFO.start+size)%FIFO.maxsize;
FIFO.cursize -= size;
return size;
}
static ssize_t fifo_write (struct file *f, const char __user *p, size_t n, loff_t *off)
{
int space = FIFO.maxsize - FIFO.cursize;
int size = n>space?space:n;
int len1 = (FIFO.maxsize-1 - FIFO.end);
int len2;
if(!space)
return 0;
// copy_from_user(&FIFO.qbuf[end+1], p, size);
if(len1 >= size)//copy once
{
if(copy_from_user(&FIFO.qbuf[FIFO.end+1], p, size))
{
printk("copy from user fail1\n");
return -EINVAL;
}
}
else
{
if(copy_from_user(&FIFO.qbuf[FIFO.end+1], p, len1))
{
printk("copy from user fail2\n");
return -EINVAL;
}
len2 = size-len1;
if(copy_from_user(FIFO.qbuf, p+len1, len2))
{
printk("copy from user fail3\n");
return -EINVAL;
}
}
FIFO.end = (FIFO.end+size)%FIFO.maxsize;
FIFO.cursize += size;
//woke up processes
wake_up_interruptible(&FIFO.readqueue);
// wake_up(&FIFO.readqueue);
return size;
}
总结:利用等待队列机制构建内核阻塞IO模型
内核阻塞式IO
最新推荐文章于 2022-09-17 21:52:19 发布