14

ftok() マニュアルに記載されています

key_t ftok(const char *pathname, int proj_id);

ftok() 関数は、指定されたパス名(既存のアクセス可能なファイルを参照する必要があります) で指定されたファイルの ID を使用します...

について混乱していconst char *pathnameます。

そのためのベストプラクティスは何ですか?私の現在のシステムでは合格でき"/home/Andrew/anyfile"ますが、私のプログラムが動作しなければならない他のシステムがこのファイルを持つことはありえません。

"/etc/hosts/"または"/etc/inittab"、そのようなすべてのシステムにこれら2つのファイルがあると確信しているので、使用するのはどうですか? それは良い考えですか?問題を引き起こす可能性はありますか?

実行時にファイル名を入力したり、ファイル名をコマンドライン引数として渡したりするようユーザーに求めたくありません。

他に決定する別のより良い方法はありますpathnameか?
最も信頼性が高く、最適な方法はどれですか?

御時間ありがとうございます。

4

4 に答える 4

15

一般的には、アプリケーション自体に関連付けられたファイルを使用します。

たとえば、構成ファイルを共有メモリにロードするアプリケーションがあり (解析された効率的にアクセス可能な方法で - 高速ポインタなどを使用してメモリ内構造に変換された XML ファイルを考えてください)、共有メモリを作成しました。ftok構成ファイル自体から派生したセグメント。

最悪の場合、アプリケーションの構成ファイルがない場合は、実行可能ファイル自体を使用してみてください。システムのどこかに存在することはかなり確実です(実行しているため)。

また、ファイルに制限されていません。/etcそれ自体を使用すること/tmpも、必要に応じて使用することもでき/ます。

少し危険なので、「必要な場合」と言います。このftok呼び出しにより、ファイル仕様と ID に基づいて一意のキーが提供されます。などの独自のファイルを使用する場合は、他の-returned キー/etc/andrew.confと衝突しないことが合理的に確信できます。ftok

ただし、あなたと他のすべての人が/tmpファイル仕様部分として使用することを決定した場合、唯一の差別化要因は ID です。したがって、他のキーとの衝突がはるかに簡単になります。

私が常に行ってきたことは、ファイル仕様をアプリケーションの真に一意の値として使用し、作成したい特定のものに ID を使用することです。

したがって、27 個のセマフォと 15 個の共有メモリ ブロックが必要な場合、それらはすべて/etc/pax.confファイル仕様と 1 から 42 までの ID として使用されます (アプリケーションは、どの ID がどのオブジェクトに関連しているかを認識します)

于 2010-07-01T05:35:10.977 に答える
3

おそらく最善の方法は、実行可能ファイルの 1 つの argv[0] を使用することです。マニュアルページによると

The resulting value is the same for all pathnames that name the same file, ...

そのため、実行可能ファイルがシンボリック リンクなどを介して呼び出されることがあっても、安全である必要があります。

于 2010-07-01T07:01:03.550 に答える
1

設定ファイルやコマンド ライン パラメータなどに基づいて、パスの char * を動的に作成できます。

その char * を関数に渡すだけです。

于 2010-07-01T05:35:36.250 に答える