※ read和write
ssize_t read(struct file *filp, char _ _user *buff,size_t count, loff_t *offp);
从设备拷贝数据到用户空间
ssize_t write(struct file *filp, const char _ _user *buff,size_t count,
loff_t *offp);
从用户空间拷贝数据到设备上。
※ 参数buff是指向用户空间的缓冲区,这个缓冲区或者保存要写入的数据,或者是一个存放新读入数据的空缓冲区。
unsigned long copy_to_user(void _ _user *to, const void *from,
unsigned long count);
unsigned long copy_from_user(void *to, const void _ _user *from,
unsigned long count);
※ 这两个函数还检测用户空间的指针是否有效。
※ Read方法
n 如果返回值等于最为count参数传递给read系统调用的值,所请求的字节数传输就成功完成了。这是最好的情况。
n 如果返回值是正的,但是比count小,只有部分数据成功传送。这种情况因设备的不同可能有许多原因。大部分情况下,程序会重新读数据。例如,如果你用fread函数读数据,这个库库函数会不断调用系统调用直至所请求的数据传输完成。
n 如果返回值为0,它表示已经到达了文件尾。
n 负值意味着发生了错误。值就是错误编码,错误编码在<linux/errno.h>中定义。
※ 与read相似,根据如下返回值规则,write也可以传输少于请求的数据量:
n 如果返回值等于count,则完成了请求数目的字节传送。
n 如果返回值是正的,但小于count,只传输了部分数据。再说明一次,程序很可能会再次读取余下的部分。
n 如果值为0,什么也没写。这个结果不是错误,而且也没有什么缘由需要返回一个错误编码。再说明一次,标准库会重复调用write。以后的章节会介绍阻塞型write,我们会对这种情形最更详尽的考察。
n 负值意味发生了错误;语义与read相同。