Unix 系统已经长时间支持名为 readv 和 writev 的 2 个系统调用. 这些 read 和 write 的"矢量"版本使用一个结构数组, 每个包含一个缓存的指针和一个长度值. 一个 readv 调 用被期望来轮流读取指示的数量到每个缓存. 相反, writev 要收集每个缓存的内容到一起 并且作为单个写操作送出它们.

如果你的驱动不提供方法来处理矢量操作, readv 和 writev 由多次调用你的 read 和 write 方法来实现. 在许多情况, 但是, 直接实现 readv 和 writev 能获得更大的效率.

矢量操作的原型是:

ssize_t (*readv) (struct file *filp, const struct iovec *iov, unsigned long count, loff_t

*ppos);

ssize_t (*writev) (struct file *filp, const struct iovec *iov, unsigned long count, loff_t

*ppos);

这里, filp 和 ppos 参数与 read 和 write 的相同. iovec 结构, 定义于

<linux/uio.h>, 如同:

struct iovec

{

void   user *iov_base;   kernel_size_t iov_len;

};

每个 iovec 描述了一块要传送的数据; 它开始于 iov_base (在用户空间)并且有 iov_len 字节长. count 参数告诉有多少 iovec 结构. 这些结构由应用程序创建, 但是内核在调用 驱动之前拷贝它们到内核空间.

矢量操作的最简单实现是一个直接的循环, 只是传递出去每个 iovec 的地址和长度给驱动 的 read 和 write 函数. 然而, 有效的和正确的行为常常需要驱动更聪明. 例如, 一个磁 带驱动上的 writev 应当将全部 iovec 结构中的内容作为磁带上的单个记录.

很多驱动, 但是, 没有从自己实现这些方法中获益. 因此, scull 省略它们. 内核使用 read 和 write 来模拟它们, 最终结果是相同的.

最新文章

  1. Laravel大型项目系列教程(二)之用户管理
  2. Mysql如何向存在外键的数据表中插入数据
  3. MVC EF 执行SQL语句
  4. 【VB.NET】类绑定控件,实现文本框快捷键全选
  5. saiku之行速度优化(三)
  6. Ubuntu学习总结-01 用VMware 8安装Ubuntu 12.04详细过程
  7. Android 不同应用通过SharedPreference实现共享数据
  8. ASP连接ACCESS数据库
  9. 第四十三篇、利用NSProxy解决NSTimer内存泄漏问题
  10. CSS三角形广告文字
  11. Cloud Insight!StatsD 系监控产品新宠!
  12. HW4.31
  13. JDBC的超时原理
  14. 第一篇bolg
  15. iptables 学习
  16. rtsp 流媒体服务器,播放器
  17. 分享一个整理Mac储存空间的软件,有效清理xcode的垃圾
  18. 简单ATM机功能实现及感想
  19. MyBatis数据库连接的基本使用
  20. vue.js 的起步

热门文章

  1. 城里城外看SSDT
  2. JavaScript笔记 - Object对象特性的应用
  3. LeetCode 704. Binary Search (二分查找)
  4. django中related_name的作用和用法
  5. TCP之1460MSS和1448负载
  6. Codeforces 166B - Polygon (判断凸包位置关系)
  7. 2019 牛客多校第三场 H Magic Line
  8. 基于三角形与位置指纹识别算法的WiFi定位比较
  9. vue axios springBoot 跨域session丢失
  10. 面试问烂的 MySQL 查询优化,看完屌打面试官!