亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pipe.c

?? LINUX設備驅動2源代碼
?? C
字號:
/* * pipe.c -- fifo driver for scull (v2.1) * */ #ifndef __KERNEL__#  define __KERNEL__#endif#ifndef MODULE#  define MODULE#endif#define __NO_VERSION__#include <linux/module.h> /* get MOD_DEC_USE_COUNT, not the version string */#include <linux/version.h> /* need it for conditionals in scull.h */#include <linux/kernel.h> /* printk() */#include <linux/malloc.h> /* kmalloc() */#include <linux/fs.h>     /* everything... */#include <linux/proc_fs.h>#include <linux/errno.h>  /* error codes */#include <linux/types.h>  /* size_t */#include <linux/fcntl.h>#include <asm/segment.h>  /* memcpy to/from fs */#include "scull.h"        /* local definitions */typedef struct Scull_Pipe {    struct wait_queue *inq, *outq;  /* read and write queues */    char *buffer, *end;             /* begin of buf, end of buf */    int buffersize;                 /* used in pointer arithmetic */    char *rp, *wp;                  /* where to read, where to write */    int nreaders, nwriters;         /* number of openings for r/w */    struct fasync_struct *async_queue; /* asynchronous readers */} Scull_Pipe;/* * I don't use static symbols here, because register_symtab is called */int scull_p_nr_devs =    SCULL_P_NR_DEVS;  /* number of pipe devices */int scull_p_buffer =  SCULL_P_BUFFER; /* buffer size */Scull_Pipe *scull_p_devices;/* * Open and close */int scull_p_open (struct inode *inode, struct file *filp){    Scull_Pipe *dev;    int num = NUM(inode->i_rdev);    if (num >= scull_p_nr_devs) return -ENODEV;    dev = &scull_p_devices[num];    if (!dev->buffer) { /* allocate the buffer */        dev->buffer = kmalloc(scull_p_buffer, GFP_KERNEL);        if (!dev->buffer)            return -ENOMEM;    }    dev->buffersize = scull_p_buffer;    dev->end = dev->buffer + dev->buffersize;    dev->rp = dev->wp = dev->buffer; /* rd and wr from the beginning */    /* use f_mode,not  f_flags: it's cleaner (fs/open.c tells why) */    if (filp->f_mode & FMODE_READ)        dev->nreaders++;    if (filp->f_mode & FMODE_WRITE)        dev->nwriters++;    filp->private_data = dev;    MOD_INC_USE_COUNT;    return 0;}release_t scull_p_release (struct inode *inode, struct file *filp){    Scull_Pipe *dev = filp->private_data;    int scull_p_fasync (struct inode *inode, struct file *filp, int mode);    /* remove this filp from the asynchronously notified filp's */    scull_p_fasync(inode, filp, 0);    if (filp->f_mode & FMODE_READ)        dev->nreaders--;    if (filp->f_mode & FMODE_WRITE)        dev->nwriters--;    if (dev->nreaders + dev->nwriters == 0) {        kfree(dev->buffer);        dev->buffer = NULL; /* the other fields are not checked on open */    }    MOD_DEC_USE_COUNT;    release_return(0);}/* * Data management: read and write */read_write_t scull_p_read (struct inode *inode, struct file *filp,                char *buf, count_t count){    Scull_Pipe *dev = filp->private_data;    while (dev->rp == dev->wp) { /* nothing to read */        if (filp->f_flags & O_NONBLOCK)            return -EAGAIN;        PDEBUG("\"%s\" reading: going to sleep\n",current->comm);        interruptible_sleep_on(&dev->inq);        if (current->signal & ~current->blocked) /* a signal arrived */          return -ERESTARTSYS; /* tell the fs layer to handle it */        /* otherwise loop */    }    /* ok, data is there, return something */    if (dev->wp > dev->rp)        count = min(count, dev->wp - dev->rp);    else /* the write pointer has wrapped, return data up to dev->end */        count = min(count, dev->end - dev->rp);    copy_to_user(buf, dev->rp, count);    dev->rp += count;    if (dev->rp == dev->end)        dev->rp = dev->buffer; /* wrapped */    /* finally, awake any writers and return */    wake_up_interruptible(&dev->outq);    PDEBUG("\"%s\" did read %li bytes\n",current->comm, (long)count);    return count;}read_write_t scull_p_write (struct inode *inode, struct file *filp,                const char *buf, count_t count){    Scull_Pipe *dev = filp->private_data;    /* left is the free space in the buffer, but it must be positive */    int left = (dev->rp + dev->buffersize - dev->wp) % dev->buffersize;    PDEBUG("write: left is %i\n",left);    while (left==1) { /* empty */        if (filp->f_flags & O_NONBLOCK)            return -EAGAIN;        PDEBUG("\"%s\" writing: going to sleep\n",current->comm);        interruptible_sleep_on(&dev->outq);        if (current->signal & ~current->blocked) /* a signal arrived */          return -ERESTARTSYS; /* tell the fs layer to handle it */        /* otherwise loop, but recalculate free space */        left = (dev->rp + dev->buffersize - dev->wp) % dev->buffersize;    }    /* ok, space is there, accept something */    if (dev->wp >= dev->rp) {        count = min(count, dev->end - dev->wp); /* up to end-of-buffer */        if (count == left) /* leave a hole, even if at e-o-b */            count--;    }    else /* the write pointer has wrapped, fill up to rp-1 */        count = min(count, dev->rp - dev->wp - 1);    PDEBUG("Going to accept %li bytes to %p from %p\n",           (long)count, dev->wp, buf);    copy_from_user(dev->wp, buf, count);    dev->wp += count;    if (dev->wp == dev->end)        dev ->wp = dev->buffer; /* wrapped */    /* finally, awake any reader */    wake_up_interruptible(&dev->inq);  /* blocked in read() and select() */    if (dev->async_queue)        kill_fasync (dev->async_queue, SIGIO); /* asynchronous readers */    PDEBUG("\"%s\" did write %li bytes\n",current->comm, (long)count);    return count;}#ifdef __USE_OLD_SELECT__int scull_p_poll (struct inode *inode, struct file *filp,                  int mode, select_table *table){    Scull_Pipe *dev = filp->private_data;    if (mode == SEL_IN) {        if (dev->rp != dev->wp) return 1; /* readable */        PDEBUG("Waiting to read\n");        select_wait(&dev->inq, table); /* wait for data */        return 0;    }    if (mode == SEL_OUT) {        /*         * the buffer is full if "wp" is right behind "rp",         * and the buffer is circular. "left" can't drop         * to 0, as this would be taken as empty buffer         */        int left = (dev->rp + dev->buffersize - dev->wp) % dev->buffersize;        if (left>1) return 1; /* writable */        PDEBUG("Waiting to write\n");        select_wait(&dev->outq, table); /* wait for free space */        return 0;    }    return 0; /* never exception-able */}#else /* the new poll interface */unsigned int scull_p_poll (struct file *filp, poll_table *wait){    Scull_Pipe *dev = filp->private_data;    unsigned int mask = 0;    /* how many bytes left there to be read? */    int left = (dev->rp + dev->buffersize - dev->wp) % dev->buffersize;    poll_wait(&dev->inq,  wait);    poll_wait(&dev->outq, wait);    if (dev->rp != dev->wp) mask |= POLLIN | POLLRDNORM;  /* readable */    if (left)               mask |= POLLOUT | POLLWRNORM; /* writable */    return mask;}#endifint scull_p_fasync (struct inode *inode, struct file *filp, int mode){    Scull_Pipe *dev = filp->private_data;    return fasync_helper(inode, filp, mode, &dev->async_queue);}lseek_t scull_p_lseek (struct inode *inode, struct file *filp,                 lseek_off_t off, int whence){    return -ESPIPE; /* unseekable */}#ifdef SCULL_USE_PROCint scull_read_p_mem(char *buf, char **start, off_t offset,                   int len, int unused){    int i;    Scull_Pipe *p;    #define LIMIT (PAGE_SIZE-200) /* don't print any more after this size */    len = sprintf(buf, "Default buffersize is %i\n", scull_p_buffer);    for(i = 0; i<scull_p_nr_devs; i++) {        if (len > LIMIT) break;        p = &scull_p_devices[i];        len += sprintf(buf+len, "\nDevice %i: %p\n", i, p);        len += sprintf(buf+len, "   Queues: %p %p\n", p->inq, p->outq);        len += sprintf(buf+len, "   Buffer: %p to %p (%i bytes)\n",                       p->buffer, p->end, p->buffersize);        len += sprintf(buf+len, "   rp %p   wp %p\n", p->rp, p->wp);        len += sprintf(buf+len, "   readers %i   writers %i\n",                       p->nreaders, p->nwriters);    }    return len;}struct proc_dir_entry scull_proc_p_entry = {        0,                 /* low_ino: the inode -- dynamic */        9, "scullpipe",     /* len of name and name */        S_IFREG | S_IRUGO, /* mode */        1, 0, 0,           /* nlinks, owner, group */        0, NULL,           /* size - unused; operations -- use default */        &scull_read_p_mem,   /* function used to read data */        /* nothing more */    };#endif/* * The file operations for the pipe device * (some are overlayed with bare scull) */struct file_operations scull_pipe_fops = {    scull_p_lseek,    scull_p_read,    scull_p_write,    NULL,          /* scull_p_readdir */    scull_p_poll,    scull_ioctl,    NULL,          /* scull_p_mmap */    scull_p_open,    scull_p_release,    NULL,          /* scull_p_fsync */    scull_p_fasync,                   /* nothing more, fill with NULLs */};int scull_p_init(void){    scull_p_devices = kmalloc(scull_p_nr_devs * sizeof(Scull_Pipe),                              GFP_KERNEL);    if (scull_p_devices == NULL)        return -ENOMEM;    memset(scull_p_devices, 0, scull_p_nr_devs * sizeof(Scull_Pipe));#ifdef SCULL_USE_PROC    proc_register_dynamic(&proc_root, &scull_proc_p_entry);#endif    return 0;}void scull_p_cleanup(void) /* called by cleanup_module */{    int i;    for (i=0; i < scull_p_nr_devs; i++) {        if (scull_p_devices[i].buffer)            kfree(scull_p_devices[i].buffer);    }    kfree(scull_p_devices);#ifdef SCULL_USE_PROC    proc_unregister(&proc_root, scull_proc_p_entry.low_ino);#endif    return;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产婷婷色一区二区三区四区 | 免费看欧美女人艹b| 99视频在线精品| 亚洲成人动漫在线观看| 精品国免费一区二区三区| 激情综合一区二区三区| 日本韩国欧美在线| 日本特黄久久久高潮| 欧美日韩一卡二卡| 一区二区三区中文字幕电影| 色综合天天在线| 欧美va亚洲va香蕉在线| 欧美激情一区二区三区不卡| 亚洲日本在线a| 97se亚洲国产综合在线| 中文字幕在线观看不卡| 欧美网站一区二区| 一区二区三区在线观看国产| 午夜不卡av免费| 欧美无人高清视频在线观看| 综合av第一页| 亚洲成人动漫在线免费观看| 欧美色区777第一页| 亚洲青青青在线视频| 欧美日韩一级大片网址| 国产精品灌醉下药二区| 成人h精品动漫一区二区三区| 欧美日韩在线播放一区| 国产精品国产馆在线真实露脸 | 久久蜜臀精品av| 日本视频在线一区| 亚洲三级免费观看| 欧美一区二区视频网站| 日韩福利视频网| 1024亚洲合集| 欧美在线三级电影| 日本不卡的三区四区五区| 中文字幕精品一区二区三区精品| 午夜电影网亚洲视频| 亚洲国产wwwccc36天堂| 久久精品人人爽人人爽| 亚洲自拍都市欧美小说| 欧美日韩国产中文| 欧美日韩视频在线一区二区 | 日本一道高清亚洲日美韩| 亚洲成人久久影院| 日韩精品一卡二卡三卡四卡无卡| 午夜精品影院在线观看| 丝袜脚交一区二区| 日本中文在线一区| 男女性色大片免费观看一区二区| 日韩激情视频在线观看| 美女一区二区三区| 国产精品一级片在线观看| 国产99久久久精品| 91视频免费观看| 欧美吞精做爰啪啪高潮| 日韩欧美久久久| 久久精品亚洲精品国产欧美| 国产精品网站一区| 亚洲人成人一区二区在线观看| 夜夜精品视频一区二区| 性做久久久久久免费观看| 日韩成人伦理电影在线观看| 狠狠色丁香婷婷综合久久片| 成人亚洲一区二区一| 日本韩国视频一区二区| 91精品综合久久久久久| 国产丝袜欧美中文另类| 亚洲理论在线观看| 免费在线一区观看| 成人性生交大片免费看中文| 色av成人天堂桃色av| 日韩精品一区二区三区蜜臀| 日本一区二区三级电影在线观看 | 欧美日韩极品在线观看一区| 91精品国产综合久久香蕉的特点 | 中文字幕欧美日本乱码一线二线| 亚洲精品乱码久久久久久日本蜜臀| 亚洲高清免费视频| 国产真实乱偷精品视频免| 99麻豆久久久国产精品免费| 欧美日韩成人综合天天影院| 久久久久九九视频| 午夜精品久久久久久不卡8050| 极品尤物av久久免费看| 99久久国产免费看| 日韩欧美资源站| 亚洲激情男女视频| 国产高清成人在线| 欧美一区二区视频观看视频| 日韩欧美成人一区| 曰韩精品一区二区| 国产成人午夜99999| 欧美性猛交xxxx黑人交| 日韩亚洲欧美综合| **欧美大码日韩| 国模娜娜一区二区三区| 在线亚洲高清视频| 欧美国产精品久久| 蜜臀av性久久久久蜜臀av麻豆| 91麻豆swag| 日本一区二区三区在线观看| 蜜臂av日日欢夜夜爽一区| 91国偷自产一区二区三区成为亚洲经典 | 久久奇米777| 亚洲va欧美va天堂v国产综合| 高清不卡一二三区| 日韩欧美国产一区二区三区| 国产精品久久久久久久久果冻传媒 | 欧美视频一区在线观看| 亚洲欧洲av色图| 久久99久久99小草精品免视看| 在线欧美日韩国产| 中日韩免费视频中文字幕| 免费高清在线视频一区·| 欧美色欧美亚洲另类二区| 中文字幕精品三区| 韩国精品免费视频| 日韩免费福利电影在线观看| 三级亚洲高清视频| 欧美日韩精品系列| 亚洲国产一区二区三区青草影视| 91免费看片在线观看| 亚洲欧洲精品一区二区三区 | 风间由美一区二区三区在线观看 | 精品美女在线观看| 日本欧美一区二区在线观看| 欧美日韩在线一区二区| 亚洲男人的天堂av| 91麻豆免费在线观看| 欧美国产精品劲爆| 成人丝袜高跟foot| 日本一区二区三区视频视频| 国产.欧美.日韩| 国产午夜精品理论片a级大结局 | 2021中文字幕一区亚洲| 麻豆成人在线观看| 欧美不卡激情三级在线观看| 免费一级片91| 精品国产乱码久久久久久久| 国产美女娇喘av呻吟久久| 久久伊99综合婷婷久久伊| 国产在线精品一区二区夜色| 欧美mv日韩mv亚洲| 国产精品91xxx| 国产精品国模大尺度视频| 成人av免费在线| 亚洲激情自拍偷拍| 欧美三级韩国三级日本一级| 图片区日韩欧美亚洲| 日韩女优av电影| 国产精品一级片| 亚洲色图一区二区| 在线观看日韩av先锋影音电影院| 午夜视频在线观看一区二区| 欧美一区在线视频| 另类小说色综合网站| 国产色综合久久| 色哟哟国产精品免费观看| 亚洲成人7777| www欧美成人18+| 91老司机福利 在线| 亚洲大片在线观看| 精品乱人伦小说| 成人av中文字幕| 亚洲成人午夜影院| 欧美大白屁股肥臀xxxxxx| 国产福利一区在线| 亚洲午夜av在线| 欧美精品一区二区精品网| 9人人澡人人爽人人精品| 亚洲 欧美综合在线网络| 久久久777精品电影网影网 | 欧美老女人第四色| 国产一区中文字幕| 亚洲三级理论片| 精品久久久网站| 色八戒一区二区三区| 极品少妇一区二区| 亚洲一线二线三线视频| 精品国产伦一区二区三区观看体验| 成人国产精品免费观看视频| 婷婷中文字幕一区三区| 欧美经典一区二区三区| 欧美久久一区二区| 成人永久免费视频| 日韩av电影天堂| 亚洲欧美日韩国产一区二区三区| 欧美一区二区高清| 色悠悠亚洲一区二区| 国内偷窥港台综合视频在线播放| 亚洲欧美国产高清| 欧美精品一区二区三区一线天视频 | 亚洲综合视频在线| 欧美极品xxx| 日韩免费高清电影| 欧美日韩亚洲综合在线| proumb性欧美在线观看| 蜜桃av一区二区|