C言語で共有メモリを扱う方法です!
コレを使えば複数プロセスでデータを共有する事ができます!
環境
項目 | 内容 |
---|---|
OS | Ubuntu 16.4 |
コンパイラ | gcc |
流れ
共有メモリを取り扱う、大筋の流れです。
- ファイルディスクリプタを開く
- マッピング
- 読み書き
- アンマッピング
- ファイルディスクリプタを閉じる
サンプル
共有メモリへアクセスするサンプルです。
#include <stdio.h> #include <math.h> #include <fcntl.h> #include <sys/types.h> #include <unistd.h> #include <sys/mman.h> #include <stdlib.h> #define SHM_FILE "/home/<user-name>/work/test/shm" // fdを開く int openFD(char* path) { // 作成ファイル名, R/W可&なければ作成, パーミッション const int fd = open(path, O_RDWR | O_CREAT, 0666); if (fd < 0) { perror("ERROR] cant open file "); exit(EXIT_FAILURE); } return fd; } // fdを閉じる void closeFD(int fd) { if (fd >= 0) { close(fd); } } // 共有メモリを開く void *mapping(int fd, int size) { void *ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { perror("ERROR] mmap failed "); exit(EXIT_FAILURE); } return ptr; } // 共有メモリを閉じる void unmapping(void *map, int size) { munmap(map, size); } // メイン int main() { const int fd = openFD(SHM_FILE); int size = 4; int *map = mapping(fd, size); map = (int*)mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (map == MAP_FAILED) { perror("ERROR] mmap failed "); return EXIT_FAILURE; } printf("*1 %X\n", map); // 書き込み *map = 1; msync(map, size, 0); // 値の反映 // 読み込み printf(">> %d\n", *map); unmapping(map, size); closeFD(fd); return EXIT_SUCCESS; }
参考
コチラを参考にしました。ありがとうございました。
あとがき
C言語で共有メモリを扱う方法でした!