クレジットは@nosに送られますが、彼の答えを少し拡張したいと思います。
最後に(わかりやすくするためにエラー処理を除く)、次のようにしました。
1.共有メモリ構造を定義する
これには、プロセス間同期オブジェクトと共有されるデータが含まれます。
typedef struct
{
// Synchronisation objects
pthread_mutex_t ipc_mutex;
pthread_cond_t ipc_condvar;
// Shared data
int number;
char data[1024];
} shared_data_t;
2. 共有メモリの作成とサイズの設定 (Master プロセス)
マスター プロセスで、新しい共有メモリ オブジェクトを作成します。
fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(shared_data_t));
2. OR 共有メモリを開く (スレーブ プロセス)
スレーブでは、既存のオブジェクトにアタッチするだけです:
fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);
3. プロセス空間への Mmap
// Specify addr of calling address, mostly use NULL is most portable way
shared_data_t* sdata = (shared_data_t*)mmap(NULL, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
4. 同期変数の初期化 (マスター プロセスのみ)
pthread_mutexattr_t mutex_attr;
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&sdata->ipc_mutex, &mutex_attr);
pthread_condattr_t cond_attr;
pthread_condattr_init(&cond_attr);
pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&sdata->ipc_condvar, &cond_attr);
それでおしまい。
Mutex と cond を通常どおり使用して、共有データへのアクセスを制御できるようになりました。
唯一の本当の落とし穴は、スレーブ プロセスが開始される前に、マスター プロセスが共有メモリを作成し、同期変数を初期化したことを確認することです。munmap()
そして、必要に応じて片付けてくださいshm_unlink()
。
注: XSI 代替
shmget()
POSIX:XSI 拡張機能には、メモリを共有するための他の関数 (など)があり、それらが利用可能であればより便利ですが、私が使用している LynxOS-SE のバージョンにはありませんshmat()
。