プロセス間通信の一つである共有メモリについて、RaspberryPi でテストしてみました。
shmr.c (読み込み側)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH) unsigned char* shm_init() { int i, fd; struct stat stat; unsigned char *ptr; fd = shm_open("/shm_test", O_RDWR|O_CREAT, FILE_MODE); ftruncate(fd, 16); fstat(fd, &stat); ptr = mmap(NULL, stat.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); close(fd); return(ptr); } int main(int argc, char *argv[]) { if(argc != 1){ shm_unlink("/shm_test"); } unsigned char *p = shm_init(); while(1){ usleep(1000000); for (int i = 0; i < 16; i++) { printf("%02x ", *(p+i)); } printf("\n"); } return 0; } |
ビルド
cc -o shmr shmr.c -lrt
shmw.c (書き込み側 差分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int main(int argc, char *argv[]) { int cnt = 0, offs = 0; unsigned char *p = shm_init(); if(argc != 2) return 1; offs = atoi(argv[1]); while(1){ usleep(1000000); *(p+offs) = cnt ++; } return 0; } |
サイズは16バイトのみで、書き込み側は、複数のプロセスを起動しやすいよう、”shmw 0″ や “shmw 8” などとメモリに書き込む位置を指定できるようにしてあります。
読み込み側は、表示のみをしますが、パラメータがあるときリセットをします。
(排他やエラー処理等、省いています)
これまであまり使う機会がありませんでしたが、とてもシンプルで使いやすいことがわかりました。
参考: http://s-kita.hatenablog.com/entry/20080727/1217123139