POSIX Semaphore

今度は、POSIX仕様のセマフォ

これも、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のメッセージが交互に延々と出力されるはずです。