配置:
- 主机:Ubuntu:20.04 操作系统
- 来宾:Ubuntu20.04操作系统
- 这两个文件使用9p文件系统进行互通。
挂载命令如下,
mount -t 9p -o trans=virtio tmp_shared /mnt -oversion=9p2000.l
目前进展如下:
- C语言中的函数
mmap
用于通过9p文件系统映射同一个文件的内存。 - 目前,Host可以写入文件的内存,但Guest无法实时读取变化。
- Host端:(
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; }
- Guest端:(
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; }