明らかにO_CREAT
、O_EXCL
既存のセマフォを開くときには、 と は必要ありません。
O_CREAT
新しいセマフォを作成するときに必要です。
O_EXCL
は、 と OR 演算する場合にのみ意味を持ちO_CREAT
、指定された名前のセマフォがすでに存在する場合はエラーが返されることを指定します。
sem_open の Linux マニュアル ページと言いました
フラグ値の定義は、<fcntl.h>をインクルードすることで取得できます。
しかし、私は旗を見つけられなかったfcntl.h既存のセマフォを開く方法がわかりました。
答え1
次の例を考えてみましょう。
#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
const char* const sem_name = "lock.sem";
if (argc == 1) {
sem_t* const sem = sem_open(sem_name, O_CREAT, 0644, 0);
if (sem == NULL) {
perror("sem_open");
return 1;
}
sem_wait(sem); // Will block
sem_close(sem);
sem_unlink(sem_name);
} else {
sem_t* const sem = sem_open(sem_name, 0);
if (sem == NULL) {
perror("sem_open");
return 1;
}
sem_post(sem); // Will unblock the other process
sem_close(sem);
}
return 0;
}
引数の数を使用してプログラムの動作を制御しています。
パラメータを指定しない場合(つまり、 の場合argc == 1
)、プログラムはセマフォを開き、まだ存在しない場合はそれを作成します。セマフォの値を に初期化します0
。次に、オブジェクトsem_wait()
に対してを実行しますsem
。セマフォは に初期化されているため0
、これによりプロセスがブロックされます。
ここで、同じプログラムの 2 番目のインスタンスを実行しますが、今回は引数の数が 0 以外の場合 (つまり、 の場合argc != 1
)、プログラムはセマフォを開きますが、セマフォがまだ存在しない場合は作成しません。ここで、パラメータ0
に を渡していることに注意してくださいoflag
(つまり、フラグは渡していません)。次に、プログラムは を実行しsem_post()
、セマフォを から に増分します0
。1
これにより、最初のプロセスのブロックが解除されます。両方のプロセスは、セマフォへの参照を閉じて終了します。
あなたの質問を正しく理解していれば、あなたが探しているのは 2 番目のケースです。
最初に 2 番目のケースを実行しようとすると (つまり、最初のケースの実行中のインスタンスがない場合)、次のようになります。
$ ./a.out foo
sem_open: No such file or directory
perror()
これは、指定された名前のセマフォが存在しないために呼び出されたものです。