草庐IT

Zero-copy

全部标签

c - 使用 sendfile(),是否可以判断 in_fd 何时处于 EOF?

通读manpageoftheLinuxsystemcallsendfile,我想知道调用程序是否有可能知道in_fd何时处于EOF。据推测,这可以通过返回值0来表示,但这导致了返回值0的实际含义的问题。如果sendfile类似于write,那么返回值0就意味着复制了0个字节。但是,如果sendfile类似于read,则返回值0表示EOF。必须事先知道要从in_fd复制多少字节到out_fd才能使用sendfile吗?sendfile返回0是什么意思? 最佳答案 我认为没有任何直接的方法可以知道这一点,但这并不重要。通常,您会通过st

c - 使用 sendfile(),是否可以判断 in_fd 何时处于 EOF?

通读manpageoftheLinuxsystemcallsendfile,我想知道调用程序是否有可能知道in_fd何时处于EOF。据推测,这可以通过返回值0来表示,但这导致了返回值0的实际含义的问题。如果sendfile类似于write,那么返回值0就意味着复制了0个字节。但是,如果sendfile类似于read,则返回值0表示EOF。必须事先知道要从in_fd复制多少字节到out_fd才能使用sendfile吗?sendfile返回0是什么意思? 最佳答案 我认为没有任何直接的方法可以知道这一点,但这并不重要。通常,您会通过st

copy_to_user 一个包含数组(指针)的结构

披露:我是C的新手。如果您能详细解释任何答案,我将不胜感激。我正在编写一个linux内核模块,在我正在编写的其中一个函数中,我需要将一个结构复制到用户空间,如下所示:typedefstruct{uint32_tsomeProperty;uint32_tnumOfFruits;uint32_t*arrayOfFruits;}ObjectCapabilities;我正在实现的API的文档将arrayOfFruits成员描述为“一个大小为numOfFruits的数组,其中每个元素都是一个FRUIT_TYPE常量”。鉴于arrayOfFruits是一个指针,我很困惑如何做到这一点。当我copy

copy_to_user 一个包含数组(指针)的结构

披露:我是C的新手。如果您能详细解释任何答案,我将不胜感激。我正在编写一个linux内核模块,在我正在编写的其中一个函数中,我需要将一个结构复制到用户空间,如下所示:typedefstruct{uint32_tsomeProperty;uint32_tnumOfFruits;uint32_t*arrayOfFruits;}ObjectCapabilities;我正在实现的API的文档将arrayOfFruits成员描述为“一个大小为numOfFruits的数组,其中每个元素都是一个FRUIT_TYPE常量”。鉴于arrayOfFruits是一个指针,我很困惑如何做到这一点。当我copy

c - 使用和不使用 Scatter/Gather 操作的零拷贝

我刚刚读了一篇article这解释了零拷贝机制。它讨论了支持和不支持Scatter/Gather的零拷贝之间的区别。不支持SG的网卡,数据拷贝如下支持SG的网卡,数据副本如下总之,支持SG的零拷贝可以消除一个CPU拷贝。我的问题是为什么内核缓冲区中的数据会分散? 最佳答案 因为Linux内核的映射/内存分配设施默认情况下会创建虚拟连续但可能在物理上不相交的内存区域。这意味着sendfile()在内部执行的从文件系统中读取的内容会转到内核虚拟内存中的缓冲区,DMA代码必须“transmogrify”(因为缺少更好的词)变成网卡的DMA

c - 使用和不使用 Scatter/Gather 操作的零拷贝

我刚刚读了一篇article这解释了零拷贝机制。它讨论了支持和不支持Scatter/Gather的零拷贝之间的区别。不支持SG的网卡,数据拷贝如下支持SG的网卡,数据副本如下总之,支持SG的零拷贝可以消除一个CPU拷贝。我的问题是为什么内核缓冲区中的数据会分散? 最佳答案 因为Linux内核的映射/内存分配设施默认情况下会创建虚拟连续但可能在物理上不相交的内存区域。这意味着sendfile()在内部执行的从文件系统中读取的内容会转到内核虚拟内存中的缓冲区,DMA代码必须“transmogrify”(因为缺少更好的词)变成网卡的DMA

C 在不使用缓冲区的情况下流式传输 : Copy data from one stream to another directly,

我想将数据从一个流复制到另一个流。现在通常,我会这样做:n=fread(buffer,1,bufsize,fin);fwrite(buffer,1,n,fout);有没有一种方法可以将数据直接从fin写入fout,而不需要经过缓冲区,即代替fin->buffer->fout,我想直接做fin->fout(没有缓冲)。在ANSIC中可以这样做吗?如果没有,是否可以使用POSIX函数来实现?还是特定于Linux的解决方案? 最佳答案 2个可能的仅限Linux的解决方案是splice()和sendfile().他们所做的是在不离开内核空间

C 在不使用缓冲区的情况下流式传输 : Copy data from one stream to another directly,

我想将数据从一个流复制到另一个流。现在通常,我会这样做:n=fread(buffer,1,bufsize,fin);fwrite(buffer,1,n,fout);有没有一种方法可以将数据直接从fin写入fout,而不需要经过缓冲区,即代替fin->buffer->fout,我想直接做fin->fout(没有缓冲)。在ANSIC中可以这样做吗?如果没有,是否可以使用POSIX函数来实现?还是特定于Linux的解决方案? 最佳答案 2个可能的仅限Linux的解决方案是splice()和sendfile().他们所做的是在不离开内核空间

linux - copy_from_user() 的返回值

这里是返回值的说明。unsignedlongcopy_from_user(void*to,constvoid__user*from,unsignedlongcount)返回值是还需要复制的内存量。这到底是什么意思?如果返回值为5,是否复制了(count-5)个字节?仅复制(count-5)字节的原因是什么?是不是因为to的大小小于from(那系统应该崩溃了吧)? 最佳答案 copy_from_user函数可能会因各种原因(通常是无效地址)而失败,可能只复制部分请求的数据,甚至不复制任何数据。函数返回0表示成功有一个约定(并未得到普遍

linux - copy_from_user() 的返回值

这里是返回值的说明。unsignedlongcopy_from_user(void*to,constvoid__user*from,unsignedlongcount)返回值是还需要复制的内存量。这到底是什么意思?如果返回值为5,是否复制了(count-5)个字节?仅复制(count-5)字节的原因是什么?是不是因为to的大小小于from(那系统应该崩溃了吧)? 最佳答案 copy_from_user函数可能会因各种原因(通常是无效地址)而失败,可能只复制部分请求的数据,甚至不复制任何数据。函数返回0表示成功有一个约定(并未得到普遍