このftok
関数は、System V IPC関数(、、)で使用される一種の識別子を作成semget
しshmget
ますmsgget
。これをファイル記述子のように考えてください。ファイルを開くと、パスを渡してopen
番号を取得し、その番号を使用しread
てwrite
ファイルを識別します。このftok
関数は同様の目的を果たしますが、ファイル記述子のスコープは呼び出されたプロセスopen
(およびその子)のみに制限されますが、ftok
トークンはシステム全体で有効です。
システムスコープの理由は、2つ以上の独立したプロセスが同じIPCリソースにアクセスできるようにするためです。したがって、2つのプログラムがあり、どちらも実行key = ftok("/home/beej/somefile", 'b');
される場合、両方が同じトークンを取得するため、同じリソース(セマフォ、共有メモリ、メッセージキュー)にアクセスできます。それがプロセス間通信の要点です。
トークンが、たとえばシステム内部テーブルへのインデックスであるかどうかがわからないため、単に「単純な数値」を使用することはできません。つまり、そのトークンが内部でどのように使用されているかわからないため、を使用する必要がありますftok
。
マニュアルページには、「指定されたパスは、呼び出しプロセスにアクセスできる既存のファイルを指定する必要があります。指定しないと、呼び出しは失敗します。また、ファイルへのリンクは、同じIDを指定すると同じキーを返すことに注意してください。」このことから、少なくともいくつかの実装では、パスftok
で指定されたファイルのiノード番号を検索してトークンを作成し、それを2番目の引数と組み合わせてトークンを作成すると仮定します。2番目の引数は、IPCリソースの束を作成できるようにするために存在します(さまざまなリソースを保護するためのいくつかのセマフォなど)。
key_t
(によって返される値ftok
)とによって返される値の違いについてはmsgget
、前者は一連のIPCリソース(セマフォ、共有メモリ、メッセージキュー)にアクセスでき、後者は特定のメッセージキューを識別します。