lisz-works

プログラミングと興味を貴方に

C言語 共有メモリで複数プロセスデータ共有!

【スポンサーリンク】

プログラムのソースコード

C言語で共有メモリを扱う方法です!

コレを使えば複数プロセスでデータを共有する事ができます!

環境

項目 内容
OS Ubuntu 16.4
コンパイラ gcc

流れ

共有メモリを取り扱う、大筋の流れです。

  1. ファイルディスクリプタを開く
  2. マッピング
  3. 読み書き
  4. アンマッピング
  5. ファイルディスクリプタを閉じる

サンプル

共有メモリへアクセスするサンプルです。

#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;
}

参考

コチラを参考にしました。ありがとうございました。

www.c-lang.net

あとがき

C言語で共有メモリを扱う方法でした!