프로세스 메모리에 대한 외부 파일 시스템 읽기 전용 진입점을 만드는 방법은 무엇입니까?

프로세스 메모리에 대한 외부 파일 시스템 읽기 전용 진입점을 만드는 방법은 무엇입니까?

대상 플랫폼은GNU/리눅스.


내가 가지고 있다고 가정 해 봅시다 :

void *p

파일 시스템에 내부 메모리에 대한 진입점을 만들고 싶습니다. 예를 들면 다음과 같습니다.

/tmp/my_entry_point

그 기억을 읽을 수 있었으면 좋겠어다른 프로세스 내에서.

fd = open("/tmp/my_entry_point", ...)
read(fd, ...)

그러한 의사 장치를 만들고 읽는 것이 가능합니까?

답변1

실제로 POSIX 공유 메모리를 설명하는 것처럼 들립니다.

다음은 작동 방식을 보여주는 몇 가지 빠른 예제 프로그램입니다. 내 시스템에서는 /run/shm(tmpfs)에 파일이 생성됩니다. 다른 시스템에서는 /dev/shm을 사용합니다. 귀하의 프로그램은 신경 쓸 필요가 없으며 shm_open이것만 신경 쓸 것입니다.

서버.c:

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
    int fd;
    long pagesize;
    char *region;

    if (-1 == (pagesize = sysconf(_SC_PAGE_SIZE))) {
        perror("sysconf _SC_PAGE_SIZE");
        exit(1);
    }

    if (-1 == (fd = shm_open("/some-name", O_CREAT|O_RDWR|O_EXCL, 0640))) {
        perror("shm_open");
        exit(1);
    }

    if (-1 == ftruncate(fd, pagesize)) {
        perror("ftruncate");
        shm_unlink("/some-name");
        exit(1);
    }

    region = mmap(NULL, pagesize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if (!region) {
        perror("mmap");
        shm_unlink("/some-name");
        exit(1);
    }

    // PAGESIZE is guaranteed to be at least 1, so this is safe.
    region[0] = 'a';

    sleep(60);

    shm_unlink("/some-name");
}

클라이언트.c

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

int main() {
    int fd;
    long pagesize;
    char *region;

    if (-1 == (pagesize = sysconf(_SC_PAGE_SIZE))) {
        perror("sysconf _SC_PAGE_SIZE");
        exit(1);
    }

    if (-1 == (fd = shm_open("/some-name", O_RDONLY, 0640))) {
        perror("shm_open");
        exit(1);
    }

    region = mmap(NULL, pagesize, PROT_READ, MAP_SHARED, fd, 0);
    if (!region) {
        perror("mmap");
        shm_unlink("/some-name");
        exit(1);
    }

    // PAGESIZE is guaranteed to be at least 1, so this is safe.
    printf("The character is '%c'\n", region[0]);
}

파일 생성

LDFLAGS += -lrt

all: server client

관련 정보