POSIX Semaphore
これも、Cygwinでやろうとしたんだけれど、POSIXリアルタイムライブラリが見つからなかったため、断念。
で、でびあん♪
defs.h
セマフォ名(openするときの素(もと)となるもの)の定義のみ。
はじめ、これを/tmp/sem123 としてしまって、sem_openで、0が返ってきてしまっていた。
openに指定するnameは、
・スラッシュではじまり
・スラッシュはひとつのみ
・そのファイルは実存しなくてよい
#define SEMPATH "/sem123"
wait.c
セマフォの作成とセマフォ待ち(P操作)を行う
既に同じセマフォがあると気持ち悪いので、まずは sem_unlinkで削除し、
次のsem_open内で、
O_CREATを指定し、新規に作成することを決定的にする。
O_RDWRは、今回のアクセスは読み書きモードでオープンすることを示す。
この,O_CREAT,ORDWRの定義を参照するために、fcntl.hをインクルード。
S_IRWXU(0)は、ここで作成するセマフォのアクセス許可を指定している。
(ユーザ、他人の読み書き実行許可)
これは、
#include#include #include #include #include "defs.h" int main(void){ sem_t *semID; sem_unlink(SEMPATH); semID = sem_open(SEMPATH, O_CREAT|O_RDWR, S_IRWXU|S_IRWXO, 1); printf("%d\n",semID); for(;;){ puts("sem_wait...\n"); sem_wait(semID); puts("sem_wait SUCCESS\n); } return 0; }
post.c
セマフォのポスト(V操作)を行う
#include#include #include #include "defs.h" int main(void){ sem_t* semID = sem_open(SEMPATH, O_RDWR); for(;;){ puts("sem_post!!\n"); sem_post(semID); } return 0; }
コンパイル時には、リアルタイムライブラリを読み込むため、gccの場合、 -lrt と指定する。
./wait& ./post
などと実行すると、
waitのメッセージと
postのメッセージが交互に延々と出力されるはずです。