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 
#include 

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

你可能感兴趣的:(test,linux)