iov_iter操作
2023-12-21 16:43:21
iov_iter操作
struct iovec
{
void __user *iov_base; /* BSD uses caddr_t (1003.1g requires void *) */
__kernel_size_t iov_len; /* Must be size_t (1003.1g) */
};
struct iov_iter {
/*
* Bit 0 is the read/write bit, set if we're writing.
* Bit 1 is the BVEC_FLAG_NO_REF bit, set if type is a bvec and
* the caller isn't expecting to drop a page reference when done.
*/
unsigned int type; /*type字段描述迭代器的类型,是一个位掩码描述其中包含READ/WRITE,这取决于将数据读入迭代器还是从迭代器写入数据*/
size_t iov_offset; /*在数组中第几个元素*/
size_t count; /*数组总数*/
union {
const struct iovec *iov;
const struct kvec *kvec;
const struct bio_vec *bvec;
struct pipe_inode_info *pipe;
};
union {
unsigned long nr_segs;
struct {
unsigned int head;
unsigned int start_head;
};
};
};
使用示例
#include <linux/uio.h>
#include <linux/kernel.h>
void example_usage(void) {
struct iov_iter iter;
struct iovec iov[2];
char buffer1[10] = "Hello";
char buffer2[10] = ", world!";
size_t total_count = strlen(buffer1) + strlen(buffer2);
char copy_buffer[20];
iov[0].iov_base = buffer1;
iov[0].iov_len = strlen(buffer1);
iov[1].iov_base = buffer2;
iov[1].iov_len = strlen(buffer2);
iov_iter_init(&iter, WRITE, iov, 2, total_count);/*先初始化iter*/
ssize_t copied = copy_to_iter(iov[0].iov_base, iov[0].iov_len, &iter);
if (copied < iov[0].iov_len) {
printk(KERN_ERR "Failed to copy buffer1 to iter\n");
return;
}
copied = copy_to_iter(iov[1].iov_base, iov[1].iov_len, &iter);
if (copied < iov[1].iov_len) {
printk(KERN_ERR "Failed to copy buffer2 to iter\n");
return;
}
// Reset iter for reading
iov_iter_init(&iter, READ, iov, 2, total_count);
ssize_t copied_bytes = copy_from_iter(copy_buffer, total_count, &iter);
if (copied_bytes < total_count) {
printk(KERN_ERR "Failed to copy from iter to copy_buffer\n");
return;
}
// Data copied successfully
printk(KERN_INFO "Copied data: %s\n", copy_buffer);
}
首先,定义了一个 struct iov_iter
对象 iter
和一个包含两个 struct iovec
元素的数组 iov
。然后,将两个缓冲区的地址和长度分别赋值给 iov
数组的元素。接下来,使用 iov_iter_init
函数将 iter
迭代器初始化为写入方向,并传递 iov
数组的地址、数组元素数量和总长度。
然后,使用 copy_to_iter
函数将 buffer1
和 buffer2
中的数据逐个复制到迭代器 iter
中。在每次调用 copy_to_iter
之后检查返回的复制字节数,以确保数据被完整复制。
接下来,重新初始化 iter
为读取方向,以准备从迭代器中读取数据。然后,使用 copy_from_iter
函数将数据从迭代器 iter
复制到 copy_buffer
中。同样,在每次调用 copy_from_iter
之后检查返回的复制字节数,以确保数据被完整复制。
最后,打印出复制到 copy_buffer
的数据,从而验证数据的正确性。
参考:
https://blog.csdn.net/qq_22418329/article/details/107689443
文章来源:https://blog.csdn.net/qq_45698138/article/details/135131851
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!