구성:
- 호스트: Ubuntu:20.04 운영 체제
- 게스트: Ubuntu20.04 운영 체제
- 이 두 파일은 9p 파일 시스템을 사용하여 서로 통신합니다.
마운트 명령은 다음과 같습니다.
mount -t 9p -o trans=virtio tmp_shared /mnt -oversion=9p2000.l
현재 진행상황은 다음과 같습니다.
- C 언어의 함수는
mmap
9p 파일 시스템을 통해 동일한 파일의 메모리를 매핑하는 데 사용됩니다. - 현재 호스트는 파일 메모리에 쓸 수 있지만 게스트는 변경 사항을 실시간으로 읽을 수 없습니다.
- 호스트 측:
write.c
(이 코드는 파일 메모리를 수정하는 것입니다)#include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #define _GBU_SOURCE #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define FILE_PATH "/tmp/shared/test.txt" //file path int main() { int fd; struct stat fa; char *mapped; // open if ((fd = open(FILE_PATH, O_CREAT | O_RDWR)) < 0){ perror("open"); exit(1); } // attr if ((fstat(fd, &fa)) == -1){ perror("fstat"); exit(1); } // map if ((mapped = (char *)mmap(NULL, fa.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, 0)) == (void *)-1){ perror("mmap"); exit(1); } // close close(fd); printf("before :\n%s\n", mapped); mapped[3] = 'P'; printf("\nafter:\n%s\n", mapped); if (munmap(mapped, fa.st_size) == -1) { perror("munmap"); exit(1); } return 0; }
- 손님 측: (
read.c
이 코드는 파일을 계속 읽기 위한 것입니다)#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <error.h> #define FILE_PATH "/mnt/test.txt" // file path int main() { int fd; struct stat fa; char *mapped; // open if ((fd = open(FILE_PATH, O_RDWR)) < 0) { perror("open"); exit(1); } // attr if ((fstat(fd, &fa)) == -1) { perror("fstat"); exit(1); } // map if ((mapped = (char *)mmap(NULL, fa.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void *)-1) { perror("mmap"); exit(1); } // close close(fd); // read while (1) { printf("%s\n", mapped); sleep(2); } return 0; }