既存の名前付きセマフォを開く方法は?

既存の名前付きセマフォを開く方法は?

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;
}

私はプログラムの動作を制御するためにパラメータ計算を使用します。

引数を指定しないと(つまり、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()その名前のセマフォが存在しないため、呼び出しで発生します。

おすすめ記事