Linux共有メモリと反発ロック


Linux共有メモリ
共有メモリは、システムの空きメモリプールから割り当てられ、アクセスする各プロセスに接続されます.接続のプロセスをマッピングと呼びます.マッピング後、各プロセスは、自分のメモリにアクセスすることによって共有メモリ領域にアクセスし、他のプロセスと通信することができます.
共有メモリ関連関数
共有メモリファイルの作成を開く
int shm_open(const char *name, int oflag, mode_t mode)
共有メモリを削除
int shm_unlink(const char *name)
共有メモリファイルサイズをリセット
int ftruncate(int fd, off_t length)
共有メモリマッピングの確立(接続)void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
//addr:Linuxカーネルによって指定されたマッピング領域のヘッダアドレスを確立します.使用するのは、NULLを直接渡すことです.
//length:マッピング領域を作成するサイズ
//prot:マッピングエリア権限PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
//flags:フラグビットパラメータ(物理領域の更新、共有の設定、匿名マッピング領域の作成によく使用されます)
       MAP_SHARED:マッピング領域の動作を物理デバイス(ディスク)に反映し、血縁関係のないプロセス通信
       MAP_PRIVATE:マッピング領域の変更は物理デバイスに反映されません
       MAP_ANONYMOUS:匿名マッピングエリア
//fd:マッピング領域を確立するためのファイル記述子
//offset:マッピングファイルのオフセット(4 kの整数倍)
マッピング解除int munmap(void *addr, size_t length)
プロセス間同期反発ロック相関関数
初期化反発ロックint pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
反発ロックを解除するint pthread_mutex_destroy(pthread_mutex_t *mutex)
ロックの試行
int pthread_mutex_trylock(pthread_mutex_t *mutex)
ロックint pthread_mutex_lock(pthread_mutex_t *mutex)
ロック(時間制限あり)int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespc *restrict abstime)
ロック解除int pthread_mutex_unlock(pthread_mutex_t *mutex)
mutexロックのプロパティを定義するpthread_mutexattr_t mattr
mutexプロパティオブジェクトを初期化
int pthread_mutexattr_init(pthread_mutexattr_t *attr)
mutexプロパティオブジェクトの破棄(非破棄ロック)int pthread_mutexattr_destory(pthread_mutexattr_t *attr)
mutexプロパティの変更int pthread_mutexattr_setshared(pthread_mutexattr *attr, int pshared)
//psharedの値は次のとおりです.
//スレッドロック:PTHREAD_PROCESS_PRIVATE(mutexのデフォルト属性はスレッドロック、プロセス間プライベート)
//プロセスロック:PTHREAD_PROCESS_SHARED
共有メモリテスタ
// test1.cpp
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main() {
        int fd = shm_open("/test-shm", O_CREAT|O_RDWR|O_EXCL, 0777);
        if (fd < 0) {
                fd = shm_open("/test-shm", O_RDWR, 0777);
                printf("open ok
");                 if (fd < 0) {                         printf("error open shm object
");                         return 0;                 }           }           else {                 printf("create ok
");                 ftruncate(fd, 1024);         }         char *ptr = (char *)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);         close(fd);         strcpy(ptr, "write by t08");         return 0; }

プログラムのコンパイル:
gcc -lrt -o test1 test1.cpp
// test2.cpp
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main() {
        int fd = shm_open("/test-shm", O_RDWR, 0777);
        if (fd < 0) {
                printf("error open shm object
");                 return 0;         }           char *ptr = (char *)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);         close(fd);         getchar();         printf("%s
", ptr);         return 0; }

プログラムのコンパイル:
gcc -lrt -o test2 test2.cpp
プログラム実行:
./test 1および./test 2後、関連結果が表示されます