首页软件新闻工具软件操作系统办公软件聊天工具多媒体网页制作网页设计网站运营平面设计作品欣赏数据库程序组网
Ghost | Kugoo | 遨游 | Xp | Dw | Fw | Flash | Ps | 迅雷 | CD | ill | CAD | 五笔 | Word | Excel | Wps | Msn | QQ | 学电脑 | Asp | Php | Jsp | 3Dmax | 海报 | 包装 | 标志 | 地产 | 插画

Linux操作系统内核和设备文件对话

来源:天极(读取中...) 2006-11-17 【字体: 】 切换为

/* This function is called whenever a process which  
* has already opened the device file attempts to  
* read from it. */  
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)  
static ssize_t device_read(  
struct file *file,  
char *buffer, /* The buffer to fill with the data */  
size_t length, /* The length of the buffer */  
loff_t *offset) /* offset to the file */  
#else  
static int device_read(  
struct inode *inode,  
struct file *file,  
char *buffer, /* The buffer to fill with the data */  
int length) /* The length of the buffer  
* (mustnt write beyond that!) */  
#endif  
{  
/* Number of bytes actually written to the buffer */  
int bytes_read = 0;  

#ifdef DEBUG  
printk("device_read(%p,%p,%d)\n",  
file, buffer, length);  
#endif  

/* If were at the end of the message, return 0  
* (which signifies end of file) */  
if (*Message_Ptr == 0)  
return 0;  

/* Actually put the data into the buffer */  
while (length && *Message_Ptr) {  

/* Because the buffer is in the user data segment,  
* not the kernel data segment, assignment wouldnt  
* work. Instead, we have to use put_user which  
* copies data from the kernel data segment to the  
* user data segment. */  
put_user(*(Message_Ptr++), buffer++);  
length --;  
bytes_read ++;  
}  

#ifdef DEBUG  
printk ("Read %d bytes, %d left\n",  
bytes_read, length);  
#endif  

/* Read functions are supposed to return the number  
* of bytes actually inserted into the buffer */  
return bytes_read;  
}

  

/* This function is called when somebody tries to  
* write into our device file. */  
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)  
static ssize_t device_write(struct file *file,  
const char *buffer,  
size_t length,  
loff_t *offset)  
#else  
static int device_write(struct inode *inode,  
struct file *file,  
const char *buffer,  
int length)  
#endif  
{  
int i;  

#ifdef DEBUG  
printk ("device_write(%p,%s,%d)",  
file, buffer, length);  
#endif  

for(i=0; i  
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)  
get_user(Message, buffer+i);  
#else  
Message = get_user(buffer+i);  
#endif  

Message_Ptr = Message;  

/* Again, return the number of input characters used */  
return i;  
}

  

上一页  [1] [2] [3] 下一页

    相关新闻
    用户评论
数据载入中,请稍后……
评论内容:不能超过250字,不需审核,请自觉遵守互联网相关政策法规。
发表评论: 匿名发表 用户名: loading 位网友发表了评论 查看评论
(0/250)
    推广服务
IT部落推荐阅读
·生活服务
·精彩图文
·赞助商链接