如何将缓冲区传递给write()而不为其分配内存

时间:2013-06-06 09:35:21

标签: c++ c memory-management

很难说出这个问题,但我会试试。 我想测试我的usb连接的性能,因此我在一个大气的设备上使用小工具,这样我就可以写一个文件描述符并将数据发送到主机。 但是当我想发送大量数据时,我无法分配尽可能多的数据。

write(int fildes, const void *buf, size_t nbyte);

有没有办法将指针传递到内存中可以实际读取nbyte字节的位置? 我无法分配一个数组或我想发送的大小的矢量。因为我得到“无法分配内存”错误。

2 个答案:

答案 0 :(得分:4)

如果您的操作系统有MAP_ANONYMOUS/dev/zero,那么您可以mmap进入您的虚拟地址空间,直到最大可能的映射并从那里读取。

#include <sys/mman.h>

void * zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

这将分配长度为nbytes的连续映射到单个清零的只读页面,因此实际上不使用任何物理内存。你可以读取整个数组(并且只会得到零),但你不能写它。

由于物理硬件限制,大多数系统会限制最大连续虚拟映射。当前的x86_64 Linux通常支持64TB长映射。

注意:某些系统(例如OS X,可能是其他基于BSD的MAP_ANON而不是MAP_ANONYMOUS,请咨询man 2 mmap以找出确切的一个。

如果您的系统不支持MAP_ANONYMOUS,但/dev/zero是等效的方法:

void * zeroed_memory;
int fd = open("/dev/zero", O_RDONLY);
if (fd > 0) {
    zeroed_memory = mmap(NULL, nbytes, PROT_READ, MAP_PRIVATE, fd, 0);
}

答案 1 :(得分:2)

write函数将采用您提供的任何地址,并(尝试)从该地址开始写入nbyte个字节。只要内存可以读取,这应该可以正常工作。

如果要发送超过几千字节的数据,通常最好将其作为相对较小的多次写入(例如4KB),并使用循环来完成写入。