
構成:
- ホスト:Ubuntu:20.04オペレーティングシステム
- ゲスト:Ubuntu20.04オペレーティングシステム
- これら2つのファイルは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; }