複数のプロセスが走って、そこでのパラメータを共有したいとき、 共有メモリを使うのが一番手っ取り早いでしょう。 プロセス間通信よりも簡単でしょう。 違うマシンだったら通信しなけりゃいけないでしょうけど。
sample program(tar.gz) ←これを見ると早いのではないでしょうか。 もちろん、manも大いに活用してください。
web上でみたい方はこちらへ。 sample program
メモリを共有するためには、中心となるプログラム名(KEYFILE_PATH)と 暗証番号(PROJ_CHAR)を決めておきます. これを利用して、keyを作成します。
/* 今後はkeyを使う */ key = ftok(KEYFILE_PATH,PROJ_CHAR);
そして、それを使ってメモリを確保します.
int shm_initialize(key_t shm_key, int shm_size,int *shrd_id,int *shm_ptr) { /* idを取得する */ *shrd_id = shmget(shm_key, shm_size, IPC_CREAT|0666); if( *shrd_id < 0 ){ printf("[shm_initialize]: Can't Access to the Shared Memory !! \n" ); return -1; } /* 共有メモリのアドレスを取得する */ *shm_ptr = (int)shmat( *shrd_id, NULL, 0); /* 共有メモリを0で初期化 */ memset( (void *)*shm_ptr, 0, shm_size ); return *shrd_id; }
すでにメモリを確保したプロセスは、 共有メモリの場所がどこにあるのか知っているのですから, これ以上必要な手順はありません. しかし, これから走り出すプロセスは、 どこにメモリがあるかなんてしりません。
なので、これから共有メモリのアドレスを取得しなければなりません。 方法は上とほとんど同じ。
int shm_access(key_t shm_key, int shm_size, int *shrd_id, int *shm_ptr) { *shrd_id = shmget(shm_key, shm_size, 0444); if( *shrd_id < 0 ){ printf("Can't Access to the Shared Memory !! \n" ); return(-1); } *shm_ptr = (int)shmat( *shrd_id, (const void *)NULL, 0); return *shrd_id; }
これで、param_ptrが共有メモリと関係付けられました。あとはこれを使ってい きましょう。
param_ptr->a を普通に使うことができるようになる。
ただ、ここで問題なのは、競合が起きてしまうということ。 これの対処方法は、そのうち考えるとしましょう。 まあ、とにかく動かせるようになったということでよしとしましょう。
メモリを確保したら、使い終わったあとに解放するのがマナーですね。 ということで、解放しましょう。
int erase_shm(struct SHM_PARAM *param_ptr) { shmctl(param_ptr->shd_param_id, IPC_RMID, 0); return(0); }