n 個のセマフォ (argv[] から n 個) を開きたいと思います。私は sem_t* の配列を実行し、それらをループで sem_open しようとしました。ただし、セマフォごとに const char* 固有の名前が必要です。それを行う方法はありますか?助けてください :)
sem_t *sem[n];
int i;
for(i=0; i<n; i++)
sem[i] = my_sem_open("XXXXXX",0);
これは、一意のセマフォ名を取得する方法のアイデアの非常に簡単な図です。実際のシステムでは、フリーIDの配列を使用したセマフォの作成/削除の周りにいくつかのラッパーが存在する可能性があります。すべての操作は、この配列からIDを取得するか(sem_open())、そのうちの1つを解放する(sem_close())ことができます。
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#define N 10
int next_sema_id()
{
static int seq_number = 0;
return seq_number++;
}
int main()
{
int n = N;
sem_t *sem[n];
int i;
pid_t pid = getpid();
for (i = 0; i < n; i++)
{
char buf[12];
sprintf(buf, "sem%05d%03d", pid, next_sema_id());
sem[i] = sem_open(buf,0);
}
for (i = 0; i < n; i++)
{
sem_close(sem[i]);
}
return 0;
}
これは、POSIX 標準からの引用が長すぎて単一のコメントに収まらないことを除いて、Roman Nikitchenkoの回答に対するコメントになります。
へのパスに関する POSIX の記述に注意してくださいsem_open()
。
name 引数は、セマフォ オブジェクトを指定する文字列を指します。名前がファイル システムに表示されるかどうかは指定されておらず、パス名を引数として受け取る関数に表示されます。
<slash>
name 引数は、nameの先頭文字以外の文字の解釈<slash>
が実装定義であり、name 引数の長さ制限が実装定義であり、パス名と同じである必要がないことを除いて、パス名の構築規則に従います。パス名は {PATH_MAX} と {NAME_MAX} を制限します。名前が文字で始まる場合、その名前が削除されていない限り、名前と同じ値で<slash>
呼び出すプロセスは同じセマフォ オブジェクトを参照する必要があります。sem_open()
name が文字で始まらない場合<slash>
、効果は実装定義です。
/some-unique-name-without-slashes
これは、移植可能なセマフォの名前が の形式であり、最大長が明確に定義されていないことを示していると思います。他の名前 (先頭のスラッシュなし、または追加のスラッシュ付き) は機能する場合と機能しない場合があります — 使用している実装のマニュアルを読む必要があります (実装は何が許可されるかを定義する必要があります)。