很难说出这个问题,但我会试试。 我想测试我的usb连接的性能,因此我在一个大气的设备上使用小工具,这样我就可以写一个文件描述符并将数据发送到主机。 但是当我想发送大量数据时,我无法分配尽可能多的数据。
write(int fildes, const void *buf, size_t nbyte);
有没有办法将指针传递到内存中可以实际读取nbyte
字节的位置?
我无法分配一个数组或我想发送的大小的矢量。因为我得到“无法分配内存”错误。
答案 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),并使用循环来完成写入。