Operating system 命名管道的随机访问替代方案

Operating system 命名管道的随机访问替代方案,operating-system,filesystems,Operating System,Filesystems,有没有一种方法可以创建一个“文件”(即文件系统中的某个点),然后任何程序都可以将其作为常规文件打开,但对它的读/写将转到程序而不是磁盘?命名管道似乎满足所有要求,只是它只允许串行文件访问 我目前对*nix类型的系统感兴趣,但我很想在任何操作系统/文件系统上听到这样的系统。可能是您可以使用mmap创建共享内存,后端程序保存此内存。其他程序可以打开此“文件”并将其随机读/写到后端程序 我还没试过,但我认为它能奏效 下面是一个实现: D.c: #include <stdio.h> #inc

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


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

可能是您可以使用mmap创建共享内存,后端程序保存此内存。其他程序可以打开此“文件”并将其随机读/写到后端程序


我还没试过,但我认为它能奏效

下面是一个实现:

D.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;
 }

回答这个问题需要更多的信息。如下所述,mmap()可能是worker,但只有在文件大小固定的情况下。
#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;
}   
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);