Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
在cygwin中重新实现mremap,新空间不可写_C_Cygwin_Memory Mapped Files - Fatal编程技术网

在cygwin中重新实现mremap,新空间不可写

在cygwin中重新实现mremap,新空间不可写,c,cygwin,memory-mapped-files,C,Cygwin,Memory Mapped Files,我试图复制mremap的工作,以生成一个mmap的内存/文件。我大致遵循了这一点,但它是用于匿名映射的,而我希望它是一个命名文件这是一个编程语言解释器,因此该文件相当于解释器状态的核心转储 由于if块嵌套,原稿难以阅读。所以这是提取的,但是我正在调试的编译路径的真实代码。可以查看完整的源代码,但它不包含有问题的代码,因为它尚未提交,因为它不工作:不过,mremap版本以及malloc回退都在那里 unsigned pgsz /*= getpagesize()*/ = 4096; typedef

我试图复制mremap的工作,以生成一个mmap的内存/文件。我大致遵循了这一点,但它是用于匿名映射的,而我希望它是一个命名文件这是一个编程语言解释器,因此该文件相当于解释器状态的核心转储

由于if块嵌套,原稿难以阅读。所以这是提取的,但是我正在调试的编译路径的真实代码。可以查看完整的源代码,但它不包含有问题的代码,因为它尚未提交,因为它不工作:不过,mremap版本以及malloc回退都在那里

unsigned pgsz /*= getpagesize()*/ = 4096;

typedef struct {
    int fd;
    unsigned char *base;
    unsigned used;
    unsigned max;
} mfile;

/* reallocate and possibly move mem->base */
mfile *growmem(mfile *mem,
               unsigned sz)
{
    void *tmp;
    int newfd;

    printf("growmem: %p %u + %u\n", mem->base, mem->max, sz);
    if (sz < pgsz) sz = pgsz;
    else sz = (sz/pgsz + 1) * pgsz;
    sz += mem->max;
    printf("growmem: new size: %u\n", sz);

    msync(mem->base, mem->used, MS_SYNC);
    newfd = dup(mem->fd);
    tmp = mmap(NULL, sz, 
            PROT_READ|PROT_WRITE,
            MAP_SHARED | (mem->fd == -1? MAP_ANONYMOUS : 0), 
            newfd, 0); 

    if (tmp == MAP_FAILED)
        error(VMerror, "unable to grow memory");

    memcpy(tmp, mem->base, mem->used);
    munmap(mem->base, mem->max);
    mem->fd = newfd;

    mem->base = tmp;
    mem->max = sz;
    return mem;
}
我做错了什么

另外,在错误调用之前,我已经暂停了调试器。如果任何变量值有用,我都可以得到它们。mem->fd是12,因此我们没有遇到与此代码以前遇到的完全相同的SHARED/ANON错误,但是在mmap调用中需要进行一些调整以避免这种组合


编辑:它似乎可以轻松访问内存/文件的旧内容。这是一个不能使用的新空间。现有的打开文件是否会阻止较大的连续映射?嗯。也许我应该先用msync,然后是munmap,然后是fdclose,再重新打开和mmap。。。这将需要一些重新设计来测试它,因为mfile结构将需要存储文件名

如果地图请求的大小更大,Cygwin的mmap似乎不会自动增加文件大小。所以,首先,这是标准行为。

公平地说,这是标准行为;在这种情况下,所有的实现都应该发送一个SIGBUS信号。但是debian和Ubuntu让我得以逃脱。直到移植代码的时候。
Breakpoint 2, eval (ctx=0x80049a70) at src/bin/itp.c:482
482         object t = top(ctx->lo, ctx->es, 0);
(gdb) 
Continuing.
evalload <name "dict">
eval
Executing: <operator 24>
Stack: 0:<integer 1>1:<integer 0>2:<integer 0>3:<integer 1>4:<integer 0>5:<integer 0>6:<array L 229 100 78 0>7:<integer 1>8:<dict L 102 16 658 0>9:<integer 8>
Dict Stack: 0:<dict G 358 10 10 0>1:<dict G 358 100 188 0>2:<dict L 102 100 9 0>3:<dict G 486 24 310 0>4:<dict L 102 6 80 0>
Exec Stack: 0:<operator 60>1:<array G 357 2 387 6>2:<boolean false>3:<array G 325 17 416 14>4:<operator 54>5:<operator 63>6:<array G 453 18 414 0>7:<array G 325 1 414 17>8:<array G 325 4 413 5>9:<boolean false>10:<file>11:<file>12:<array L 101 3 103 16>13:<array L 101 1 113 4>14:<operator 24>
   2929 [main] itp 613952 exception::handle: Exception: STATUS_ACCESS_VIOLATION
  10097 [main] itp 613952 open_stackdumpfile: Dumping stack trace to itp.exe.stackdump





Program received signal SIGSEGV, Segmentation fault.
0x61129ab9 in memset () from /usr/bin/cygwin1.dll
(gdb) 
Continuing.
warning: SuspendThread failed. (winerr 6)
[Inferior 1 (process 613952) exited with code 0105400]
(gdb) 
unsigned mfalloc(mfile *mem,
                 unsigned sz) 
{
    unsigned adr = mem->used;

    if (sz) {
        if (sz + mem->used >= mem->max)
            mem = growmem(mem,sz);
        mem->used += sz; 
        memset(mem->base+adr, 0, sz);  //bzero(mem->base+adr, sz);
        /* bus error with mremap(SHARED,ANON)! */
    }   
    return adr;
}