加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

readv 和 writev

发布时间:2020-12-15 21:11:42 所属栏目:安全 来源:网络整理
导读:Unix 系统已经长时间支持名为 readv 和 writev 的 2 个系统调用. 这些 read 和 write 的"矢量"版本使用一个结构数组,每个包含一个缓存的指针和一个长度值. 一个 readv 调 用被期望来轮流读取指示的数量到每个缓存. 相反,writev 要收集每个缓存的内容到一起

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,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 来模拟它们,最终结果是相同的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读