15

LinuxのIPCメカニズムの1つであるメッセージキューの読み取りを開始しました。しかし、最初のステップで、いくつかの非常に基本的な質問があります。

  1. を使用しftok()て一意のID(キー)を生成し、生成される一意のIDとは何ですか。

  2. 使用するのではなく、単純な数字を使用してキーを取得することはできませんftok()か?

  3. 関数の引数keyの目的は何ですか?msget

    #include "sys/msg.h"
    key = ftok("/home/beej/somefile", 'b');
    msqid = msgget(key, 0666 | IPC_CREAT);
    
  4. msqidとの違いは何keyですか?

4

3 に答える 3

34

このftok関数は、System V IPC関数(、、)で使用される一種の識別子を作成semgetshmgetますmsgget。これをファイル記述子のように考えてください。ファイルを開くと、パスを渡してopen番号を取得し、その番号を使用しreadwriteファイルを識別します。このftok関数は同様の目的を果たしますが、ファイル記述子のスコープは呼び出されたプロセスopen(およびその子)のみに制限されますが、ftokトークンはシステム全体で有効です。

システムスコープの理由は、2つ以上の独立したプロセスが同じIPCリソースにアクセスできるようにするためです。したがって、2つのプログラムがあり、どちらも実行key = ftok("/home/beej/somefile", 'b');される場合、両方が同じトークンを取得するため、同じリソース(セマフォ、共有メモリ、メッセージキュー)にアクセスできます。それがプロセス間通信の要点です。

トークンが、たとえばシステム内部テーブルへのインデックスであるかどうかがわからないため、単に「単純な数値」を使用することはできません。つまり、そのトークンが内部でどのように使用されているかわからないため、を使用する必要がありますftok

マニュアルページには、「指定されたパスは、呼び出しプロセスにアクセスできる既存のファイルを指定する必要があります。指定しないと、呼び出しは失敗します。また、ファイルへのリンクは、同じIDを指定すると同じキーを返すことに注意してください。」このことから、少なくともいくつかの実装では、パスftokで指定されたファイルのiノード番号を検索してトークンを作成し、それを2番目の引数と組み合わせてトークンを作成すると仮定します。2番目の引数は、IPCリソースの束を作成できるようにするために存在します(さまざまなリソースを保護するためのいくつかのセマフォなど)。

key_t(によって返される値ftok)とによって返される値の違いについてはmsgget、前者は一連のIPCリソース(セマフォ、共有メモリ、メッセージキュー)にアクセスでき、後者は特定のメッセージキューを識別します。

于 2011-09-09T07:44:20.210 に答える
1
  1. 私はあなたの質問を完全には理解していませんが、与えられたファイルパスに基づいて(プロセスではなく)システムに一意の識別子を生成します。この一意の識別子(パスに関連付けられている)により、異なるプロセスが同じメッセージキューにバインドできます。

  2. はい、彼らがそのようにそれを設計したならば、あなたはそうすることができました。ただし、ファイルパスは、複数のプロセスが簡単にアクセスできる共通の決定論的キー生成メカニズムに到達するためのより普遍的な方法です。

  3. 1と2を参照

  4. msqidはファイルハンドルに類似しており、そのハンドルとの間でメッセージを送受信できます。キーは、フックを関心のあるメッセージキューに関連付けることができるものです。類推として、キーがグローバルファイルシステムのファイルパスに対するものである場合、msqidはプロセスの読み取り/書き込みハンドルになります。 。

于 2011-09-09T07:45:59.497 に答える
-1
  1. 何?

  2. それはうまくいくかもしれませんが、あなたはどちらを選び、他のプログラム(またはシステム自体)が同じ番号を使用しないことを誰が保証しますか?それは混乱につながるでしょう。

  3. 目的は、メッセージキューを識別するために、システム全体で一意の値を提供することです。マンページに記載されているように、

    通常、ベストエフォートの試みは、指定されたproj_idバイト、iノード番号の下位16ビット、およびデバイス番号の下位8ビットを組み合わせて32ビットの結果にします。たとえば、/ dev/hda1上のファイルと/dev/ sda1上のファイルの間では、衝突が簡単に発生する可能性があります。

    したがって、ファイルを取得してIDを計算するだけで、同じファイルとプロジェクトIDを使用する別のプログラムが同じ結果を取得することがわかっています。

  4. keyは一意であるが他の目的に使用できる単なる識別子であり、msqidは実際に存在するキューのID(ハンドルの種類)です。

于 2011-09-09T07:41:54.927 に答える