Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mac OSX上的mmapping/dev/zero提供的参数无效_C_Linux_Macos_Mmap - Fatal编程技术网

Mac OSX上的mmapping/dev/zero提供的参数无效

Mac OSX上的mmapping/dev/zero提供的参数无效,c,linux,macos,mmap,C,Linux,Macos,Mmap,所以我尝试将一些代码从Linux移植到MacOSX。在移植过程中,我遇到了这段代码 static void allocZeroMap(unsigned long size, int prot, const char *name) { struct map *newnode; int fd; char buf[11]; fd = open("/dev/zero", O_RDWR); if (fd == -1) { printf("could

所以我尝试将一些代码从Linux移植到MacOSX。在移植过程中,我遇到了这段代码

static void allocZeroMap(unsigned long size, int prot, const char *name)
{
    struct map *newnode;
    int fd;
    char buf[11];

    fd = open("/dev/zero", O_RDWR);
    if (fd == -1) {
        printf("couldn't open /dev/zero\n");
        exit(EXIT_FAILURE);
    }

    newnode = zmalloc(sizeof(struct map));
    newnode->name = strdup(name);
    newnode->size = size;
    newnode->prot = prot;
    newnode->type = INITIAL_MAP;
    newnode->ptr = mmap(NULL, size, prot, MAP_ANONYMOUS | MAP_SHARED, fd, 0);
    if (newnode->ptr == MAP_FAILED) {
        perror("mmap");
        exit(EXIT_FAILURE);
    }

    newnode->name = zmalloc(80);

    sprintf(newnode->name, "anon(%s)", name);

    num_initial_mappings++;

    list_add_tail(&newnode->list, &initial_mappings->list);

    sizeUnit(size, buf);
    printf("mapping[%d]: (zeropage %s) %p (%s)\n",
           num_initial_mappings - 1, name, newnode->ptr, buf);

    close(fd);
}
所以我想我只需要切换
newnode->ptr=mmap(NULL,size,prot,MAP_匿名| MAP_共享,fd,0)
newnode->ptr=mmap(NULL,size,prot,MAP_ANON | MAP_SHARED,fd,0)
因为Mac OSX没有
MAP\u ANONYMOUS
标志,而是使用
MAP\u ANON

但是当我运行程序时,mmap调用失败,参数无效。所以我的下一个想法是检查手册页,看看是什么导致无效参数错误。第一个原因是设置了
MAP\u FIXED
,并且addr参数没有对齐页面,但我没有调用
MAP\u FIXED
。其次,如果您没有指定
MAP\u PRIVATE
MAP\u SHARED
,它将返回无效参数,但我使用的是
MAP\u SHARED
,所以不应该是这样。接下来它说len参数不能是负数,所以我打印了size变量并运行了它,它是一个正值。最后一个原因是offset参数不是页面对齐的,但是我传递的是零,所以这也不应该是问题所在

接下来我检查了堆栈溢出,看到了这个问题。我尝试使用
MAP\u文件
而不是
MAP\u ANON
,但现在我得到了设备不支持的操作,手册页上说这意味着我缺少
MAP\u ANON
。所以我尝试添加
MAP\u ANON
,这样我就有了
mmap(NULL,size,prot,MAP\u FILE | MAP\u ANON | MAP\u SHARED,fd,0)但它也返回无效参数


那么,如何在Mac OSX上创建mmap/dev/zero,或者至少在Mac OSX上创建一个零填充内存映射呢?

根据
mmap()
手册页,您应该传递-1而不是
fd
作为文件描述符的值。另外,正如你所说的,
MAP\u ANON
是MacOS(至少是旧版本)的正确选项,而且不需要
MAP\u文件

有一个例子,上面的注释在OS X上不起作用,因为你不能在/dev/zero上进行mmap如果最终是这样,我将与苹果一起打开一个bug报告,但是如果你不能在Mac OSX上对/dev/zero进行mmap,那么它的另一个使用案例是什么呢?你可以使用
cat/dev/zero
来获取源源不断的(空)数据。