【问题标题】:Random access alternative to named pipes命名管道的随机访问替代方案
【发布时间】:2015-08-14 15:11:19
【问题描述】:

有没有办法创建一个“文件”(即文件系统中的某个点),然后任何程序都可以将其作为常规文件打开,但对其进行读/写将转到程序而不是磁盘?命名管道似乎满足了所有要求,只是它只允许串行文件访问。

我目前对 *nix 类型的系统感兴趣,但很想知道在任何操作系统/文件系统上都有这样的系统。

【问题讨论】:

  • 回答这个问题需要更多信息。如下所述, mmap () 可能是工作人员,但前提是您有固定的文件大小。

标签: operating-system filesystems


【解决方案1】:

我认为提问者指的是提供文件的程序挂钩到程序使用/访问/打开文件的所有访问的特殊情况,因为否则提供程序将无法控制用户程序在何时何地读/写。在这种情况下,提供程序可以简单地以允许任何其他程序同时读取/写入的模式打开标准文件。

在 hook-case 中,研究以下解决方案:libFUSE、BUSE、python-fuse、scriptfs、NBD、NBDkit。

【讨论】:

    【解决方案2】:

    这是一个实现:

    恶魔.c:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/mman.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <assert.h>
    #include <string.h>
    #include <errno.h>
    
    void map_file(const char *f) {
        int fd = open(f, O_CREAT|O_RDWR, 0666);
        if (fd < 0) {
            perror("fd open error\n");
            exit(-1);
        }
        char *addr = (char *)mmap(NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
        if (addr == MAP_FAILED) {
            exit(-1);
        }
        int i;
        for (i = 0; i != 10; ++i) {
            addr[i] = '0' + i;
        }
        while (1) {
            for (i = 0; i != 10; ++i) {
                if (addr[i] != '0' + i) {
                    printf("addr[%d]: %c\n", i, addr[i]);
                }
            }
            sleep(1);
        }
    }
    
    int main()
    {
        map_file("/dev/mem");
        return 0;
     }
    

    cli.c:

    #include <sys/mman.h>
    #include <assert.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main() {
        const char *f = "/dev/mem";
        int fd = open(f, O_RDWR, 0666);
        assert(fd >= 0); 
        lseek(fd, rand() % 10, SEEK_SET);
        write(fd, "X", 1); 
        close(fd);
        return 0;
    }   
    

    我们将 10 字节内存从“/dev/mem”映射到我们的恶魔程序。 cli将此文件作为常规文件打开,并在随机地址中写入一个字节。当然,您可以映射任何其他文件而不是 /dev/mem,但您需要在 mmap 之前从常规文件中“分配”一些字节。例如:

    fd = open("/path/to/myfile", O_CREAT|O_RDWR, 0666);
    write(fd, "0123456789", 10);   // 'allocate' 10 bytes from regular file
    addr = (char *)mmap(NULL, 10, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    

    【讨论】:

      【解决方案3】:

      也许你可以使用 mmap 创建一个共享内存,一个后端程序持有这个内存。其他程序可以打开这个“文件”并随机读/写到后端程序。

      我没试过,但我认为它可以工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 2012-09-09
        • 2017-12-06
        • 1970-01-01
        相关资源
        最近更新 更多