栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Linux 调用 mmap 奇怪的报错:Invalid argument

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux 调用 mmap 奇怪的报错:Invalid argument

背景

在 Linux 上要使用共享内存时,比较常用的是使用 mmap 映射文件的方式:前几天在写一个程序时,执行却出现 mmap 报错:

./test_mmap tmp.txt
mmap: Invalid argument

程序如下:

#include 
#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
    int fd;
    struct stat sb;
    char *mmapped;

    if (argc != 2) {
        return -1;
    }

    fd = open(argv[1], O_RDWR);
    if(fd < 0) {
        perror("open");
        return -1;
    }

    if(fstat(fd, &sb) == -1) {
        perror("fstat");
        return -1;
    }

    mmapped = mmap(NULL, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if (mmapped == MAP_FAILED) {
        perror("mmap");
        return -1;
    }

    close(fd);

    mmapped[0] = '1';

    if(msync((void*)mmapped, sb.st_size, MS_SYNC) == -1) {
        perror("msync");
        return -1;
    }

    munmap((void *)mmapped, sb.st_size);

    return 0;
}

之前也遇到过这个问题,但是忘记了是怎么回事,又花了一点时间找原因。为了避免重蹈覆辙,故写篇文章记录下。

原因

在我的环境上,报这个错的原因是 mmap 映射的文件不是本机上的! 我的 Ubuntu 是在虚拟机里,而宿主机是 macOS,宿主机的一个文件夹共享到虚拟机中,我执行程序时 mmap 的文件正是在这个共享文件夹中的,所以会报这个奇怪的错误。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号