C语言:用mmap共享数组存储目录文件名时内容重复的问题
解决mmap共享数组存储文件名全重复的问题
这种情况我之前踩过坑!大概率是你只把文件名的指针存进了共享数组,而没有复制字符串本身。举个典型场景:如果你遍历目录时用了同一个缓冲区(比如char filename[256];)来临时存放每次读到的文件名,然后直接把filename的地址塞进共享数组——那数组里所有元素其实都指向同一块内存空间,每次循环这个缓冲区的内容会被新文件名覆盖,最后自然全显示成最后一个读到的file.txt了。
核心修复思路
- 先确认共享内存的空间足够容纳所有文件名的实际内容,而不只是指针。比如每个文件名最长256字节,9个文件就需要至少
9*256字节的空间(还要预留字符串结束符的位置)。 - 遍历目录时,把每个文件名的字符串内容复制到共享内存的对应位置,而非存储临时缓冲区的指针。
简化代码示例
假设共享内存已成功映射为char *shared_array,我们给每个文件名分配固定256字节的存储空间:
#include <dirent.h> #include <string.h> #include <sys/mman.h> #include <stdio.h> #define MAX_FILENAME_LEN 256 #define MAX_FILES 9 int main() { // 省略mmap创建共享内存的代码,假设shared_array已指向大小为MAX_FILES*MAX_FILENAME_LEN的内存区域 DIR *dir = opendir("."); struct dirent *entry; int file_idx = 0; while ((entry = readdir(dir)) != NULL && file_idx < MAX_FILES) { // 跳过当前目录和上级目录的占位符 if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } // 复制文件名到共享内存的对应位置 strncpy(shared_array + file_idx * MAX_FILENAME_LEN, entry->d_name, MAX_FILENAME_LEN - 1); // 手动添加字符串结束符,避免越界导致的乱码 shared_array[file_idx * MAX_FILENAME_LEN + MAX_FILENAME_LEN - 1] = '\0'; file_idx++; } closedir(dir); // 验证共享数组内容 for (int i = 0; i < file_idx; i++) { printf("第%d个文件:%s\n", i+1, shared_array + i * MAX_FILENAME_LEN); } return 0; }
额外注意事项
- 如果文件名长度不确定,可以先遍历一次目录统计总字符数,再创建对应大小的共享内存;或者用
'\0'作为文件名分隔符,读取时逐个查找分隔符来拆分内容。 - 确保共享内存的映射权限(如
PROT_WRITE)和标志位(如MAP_SHARED)设置正确,避免写入失败却没被察觉。
内容的提问来源于stack exchange,提问作者iadducchio3
相关产品推荐
相关产品推荐

