mmap errno 22 в c чтение описания типа данных openmpi

Я использую mmap для чтения из файла.
mmap возвращает errno 22, недопустимый аргумент.
stat.st_size в данном случае - 400, что я не считаю «слишком большим».
Я не думаю, что сталкиваюсь с «нам не нравятся адрес, длина или смещение».
Я запускаю эту программу на Intel Xeon E5 (что, на мой взгляд, не имеет отношения к этому).
Что такое Я здесь скучаю?

if( argc > 1 ) {
    struct stat stat;

    for( int i = 1; i < argc; i++ ) {
        if( access(argv[i], R_OK) == -1 ) {
            printf("\n Cannot access datatype description file %s\n", argv[i]);
            continue;
        }
        int fd = open(argv[i], O_RDONLY);
        if( fd == -1 ) {
            printf("\n Cannot open datatype description from file %s\n", argv[i]);
            continue;
        }
        if( fstat(fd, &stat) == -1 ) {
            printf("\n Cannot stat the %s file\n", argv[i]);
            continue;
        }

        void* addr = mmap(NULL, stat.st_size, PROT_READ, MAP_FILE, fd, 0);

        if( MAP_FAILED == addr ) {
            printf("\nCannot map the datatype description file %s\n", argv[i]);
            printf("%s %d stat.st_size %d\n", strerror(errno), errno, stat.st_size );
            perror("mmap");
            close(fd);
            continue;
        }

        munmap(addr, stat.st_size);
        free(addr);
        close(fd);
    }
}

person Yicheng Li    schedule 13.02.2020    source источник


Ответы (1)


От 1_:

       MAP_FILE
              Compatibility flag.  Ignored.
...
       EINVAL flags  contained neither MAP_PRIVATE or MAP_SHARED, or contained
              both of these values.

Вам нужно передать один из MAP_PRIVATE или MAP_SHARED, и вы должны прекратить передачу MAP_FILE. (Что вы вообще думали?)

person Joseph Sible-Reinstate Monica    schedule 13.02.2020
comment
@YichengLi Если вы записываете в память с помощью MAP_SHARED, то ваши изменения записываются обратно в файл, но с MAP_PRIVATE - нет. - person Joseph Sible-Reinstate Monica; 13.02.2020