【linux】iov_iter操作

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 函数将 buffer1buffer2 中的数据逐个复制到迭代器 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

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yengi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值