Tag: mmap

如何读取/写入匿名共享映射?

尝试使用子进程将消息写入匿名共享内存,然后终止它。 然后让父母读取消息。 我已经看到了使用通过write调用获得的文件描述符来映射输入和输出文件的示例。 但不知道如何正确处理这个问题。 int main(void) { char *shared; int status; pid_t child; shared = mmap(0, sizeof(int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); if (shared == MAP_FAILED) { perror(“mmap”); return 1; } child = fork(); if ( child == -1 ) { perror(“fork”); return 1; } else if (child == 0) { […]

使用XCode 4.6在MacOSX 10.8.2下编写mmap会导致程序崩溃

我尝试使用XCode 4.6在MacOSX 10.8.2下运行mmap的简单测试。 此程序如下所示,映射为读取的文件是正常的,而对写入指针“target”的访问将使程序崩溃。 错误消息是“EXC_BAD_ACCESS”。 有人和我有同样的情况吗? 非常感谢。 #include #include #include #include #include int main(int argc, const char * argv[]) { int input, output; size_t size; char *source, *target; input = open(“SEK2.txt”, O_RDONLY); if (input == -1) { printf(“Open source file failed”); return -1; } output = open(“test.txt”, O_RDWR|O_CREAT|O_TRUNC); if (output == -1) { printf(“Open Output […]

使用mmap共享结构数组

我正在尝试创建父进程和子进程之间共享的结构数组。 我试图访问arrays数据时遇到分段错误。 我确信这个问题与我使用指针的方式有关,因为这是一个我不太满意的领域。 请注意,我删除了大部分似乎不相关的代码。 /* structure of Registration Table */ struct registrationTable{ int port; char name[MAXNAME]; int req_no; }; main() { /* the registrationTable is to be a shared memory space with each child process able to access and update. No concurrency controls are implemented. The parent process is responsible for cleaning up after the […]

GDB无法访问mmap()’d内核分配的内存?

我遇到了GDB和内核空间中分配的缓冲区问题。 缓冲区由内核模块分配,内核模块应该分配连续的内存块,然后通过mmap()调用将内存映射到用户空间。 但是,GDB似乎无法随时访问这些块。 例如,在GDB中遇到断点后: (gdb) x /10xb 0x4567e000 0x4567e000: Cannot access memory at address 0x4567e000 但是,在/ proc // smaps中查看应用程序当前映射的内存区域显示: 4567e000-456d3000 rwxs 8913f000 00:0d 883 /dev/cmem Size: 340 kB Rss: 340 kB Pss: 0 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 0 kB Referenced: 0 kB Swap: 0 kB 我甚至考虑这个的原因是因为在运行期间的某个时刻,这个缓冲区地址(或以类似方式分配的另一个)会导致SIGSEGV。 Program received […]

如何在C中使用’mmap’命令分配特定的内存区域? (Android NDK)

在C中使用’mmap’分配特定内存区域的正确方法是什么? 我已阅读/ proc / self / maps以确定该区域是否可用。 我尝试了以下内容,但在尝试写入分配的内存时崩溃了: // rdram is defined in header as: #define rdram ((unsigned int *)0x80000000) printf( “rdram=0x%x”, (int)rdram ); printf( “munmapping” ); munmap ((void*)0x80000000, 0x800000); printf( “mmapping” ); if(mmap ((void*)0x80000000, 0x800000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) <= 0) { printf( "mmap(0x80000000) failed" ); } else […]

如何在内存中映射_particular_区域?

我有一个程序。 我希望它能够在不同的运行中映射特定的内存区域。 我有程序的源代码。 C / C ++ 我控制程序的编译方式。 GCC 我控制程序的链接方式。 GCC 我控制程序的运行方式(Linux)。 我只想拥有这个特定的内存区域,比如0xabcdabcd到0xdeadbeef我将mmap映射到一个特定的文件。 无论如何要保证这个吗? (我必须以某种方式确保其他东西没有加载到这个特定的区域)。 编辑: 如何确保在内存中没有其他任何内容?

cuda – 零拷贝内存,内存映射文件

我正在尝试创建一个包含uint32_t的映射内存文件,然后将其用作零拷贝固定内存,如下面针对CUDA所示。 我在获取设备指针时获得了cudaErrorInvalidValue ,具有已分配空间并从文件映射内存。 我知道错误消息(来自API)意味着: 这表明传递给API调用的一个或多个参数不在可接受的值范围内。 但我正在努力弄清楚为什么我遇到这个问题……有什么想法吗? 提前致谢。 #include #include #include #include #include #include … int main(void) { struct stat buf; … uint32_t *data, *dev_data; cudaDeviceProp cuda_prop; cudaGetDeviceProperties(&cuda_prop, 0); if (!cuda_prop.canMapHostMemory) exit(EXIT_FAILURE); cudaSetDeviceFlags(cudaDeviceMapHost); int data_file = open(data_file_name, O_RDONLY); int stat = fstat(sa_file, &buf); int data_file_size = buf.st_size; err = cudaHostAlloc((void**)&data, data_file_size, cudaHostAllocMapped); if (err == cudaErrorMemoryAllocation) […]

mmap vs O_DIRECT用于随机读取(涉及的缓冲区是什么?)

我正在实现一个支持大量密钥(2600万)的基于磁盘的哈希表。 该值被反序列化。 读取在整个文件中基本上是随机的,值小于页面大小,我正在针对SSD进行优化。 安全性/一致性不是那么大的问题(性能问题)。 我目前的解决方案涉及使用带有MADV_RANDOM | MADV_DONTNEED的mmap()文件 MADV_RANDOM | MADV_DONTNEED设置为禁用内核预取,仅根据需要按需加载数据。 我认为内核从磁盘读取到内存缓冲区,我从那里反序列化。 O_DIRECT怎么样? 如果我调用read() ,我仍然会复制到缓冲区(我反序列化),那么我可以获得任何优势吗? 在哪里可以找到有关mmap()文件所涉及的缓冲区的更多信息,并在使用O_DIRECT打开的文件上调用read() ? 我对提前读取或缓存不感兴趣。 它对我的用例没有任何帮助。

在C中使用mmap读取二进制文件时的Segfault

我试图在C中使用mmap只是为了看它是如何工作的。 目前我尝试使用mmap逐字节读取二进制文件。 我的代码是这样的: #include #include #include #include #include #include int main(int argc, char *argv[]) { int fd; char *data; for ( int i = 1; i<argc; i++) { if(strcmp(argv[i],"-i")==0) fd = open(argv[i+1],O_RDONLY); } data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000); int i = 0; notation = data [i]; // …… } 当我尝试使用notation = data […]

C从文件中删除最后n个字符

我需要使用C代码从文件中删除最后n个字符。 首先我试图使用’\ b’,但它返回一个分段错误。 我在这里和这里看到了类似问题的有趣答案,但我更愿意使用mmap函数来做到这一点,如果可能的话。 我知道通过创建临时文件来截断文件,并将chars写入temp直到原始文件的某个偏移量可能更简单。 问题是我似乎不明白如何使用mmap函数来做到这一点,看不出我需要传递给那个函数的参数,特别是address , length和offset 。 从我读过的内容来看,我应该在flags使用MAP_SHARED在PROT_READ|PROT_WRITE使用PROT_READ|PROT_WRITE 。 函数定义说: void * mmap (void *address, size_t length, int protect, int flags, int filedes, off_t offset) 这是我的主要内容: int main(int argc, char * argv[]) { FILE * InputFile; off_t position; int charsToDelete; if ((InputFile = fopen(argv[1],”r+”)) == NULL) { printf(“tdes: file not found: %s\n”,argv[1]); } […]