O_CREAT
明らかに、既存のセマフォを開くときはO_EXCL
必要ありません。
O_CREAT
新しいセマフォを作成するときに必要です。
O_EXCL
と OR で連結された場合にのみ意味がありO_CREAT
、指定された名前のセマフォがすでに存在する場合にエラーが返されることを指定します。
フラグ値の定義は、<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;
}
私はプログラムの動作を制御するためにパラメータ計算を使用します。
引数を指定しないと(つまり、when argc == 1
)、プログラムはセマフォを開き、まだ存在しない場合はそれを生成し、セマフォの値をに初期化します0
。その後、オブジェクトに対してsem_wait()
作業を行いますsem
。セマフォがに初期化されるため、0
プロセスはブロックされます。
今度は同じプログラムの2番目のインスタンスを実行しますが、今回はゼロ以外の引数(つまりwhen argc != 1
)を使用して実行すると、プログラムはセマフォを開きますが、セマフォがまだ存在しない場合は生成しません。0
パラメータを渡していることに注意してくださいoflag
(つまり、フラグを渡しません)。その後、プログラムはsem_post()
セマフォを0
増やすことを行います1
。これにより、最初のプロセスのブロックが解除されます。どちらのプロセスもセマフォへの参照を閉じて終了します。
あなたの質問を正しく理解したら、2番目のケースはあなたが探しているものです。
2番目のケースを最初に実行しようとすると(つまり、最初のケースの実行中のインスタンスがない場合)、次の結果が表示されます。
$ ./a.out foo
sem_open: No such file or directory
perror()
その名前のセマフォが存在しないため、呼び出しで発生します。