You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:12:23