問題タブ [ftok]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 複数のインスタンスを持つことができるアプリのメッセージ キューの一意のキーを作成する
Message-quene を介してプロセス間で通信する Linux CUI アプリを作成しました。
シングルインスタンスであれば問題ありません。ただし、同じアプリのインスタンスが複数ある場合、キュー内のメッセージが間違ったインスタンスに送信されます。
これは、msgget 関数に一意のキーを与えることで回避できることを理解しています。ftok() を使用してキーを作成しますが、変数が同じであるため、同じキーが生成されます。
インスタンスごとに一意のキーを設定する方法を教えてもらえますか?
私が今持っている唯一のアイデアは、ftok に与えられた変数をランダム化することであり、それが正しくないことはわかっています。
c - ftok() のパス名引数としてどのファイルを渡す必要がありますか
ftok() マニュアルに記載されています
ftok() 関数は、指定されたパス名(既存のアクセス可能なファイルを参照する必要があります) で指定されたファイルの ID を使用します...
について混乱していconst char *pathname
ます。
そのためのベストプラクティスは何ですか?私の現在のシステムでは合格でき"/home/Andrew/anyfile"
ますが、私のプログラムが動作しなければならない他のシステムがこのファイルを持つことはありえません。
"/etc/hosts/"
または"/etc/inittab"
、そのようなすべてのシステムにこれら2つのファイルがあると確信しているので、使用するのはどうですか? それは良い考えですか?問題を引き起こす可能性はありますか?
実行時にファイル名を入力したり、ファイル名をコマンドライン引数として渡したりするようユーザーに求めたくありません。
他に決定する別のより良い方法はありますpathname
か?
最も信頼性が高く、最適な方法はどれですか?
御時間ありがとうございます。
c - 共有メモリにアクセスするためのキーが shmget() の戻り値である場合、key_t を持つ意味は何ですか?
共有メモリを使用する場合、キーの作成を気にする必要があるのはなぜですか
次のコードで?
私が理解したことから、特定の共有メモリにアクセスするために必要なのはshmid
、キーではなく です。それとも私が間違っていますか?必要なshmid
ものが .
編集
@ Beej's Guide to Unix IPCを読むことができます:
この
key
ナンセンスはどうですか?どのように作成しますか?タイプkey_t
は実際にはただの であるためlong
、任意の数値を使用できます。しかし、番号をハードコードし、別の無関係なプログラムが同じ番号をハードコードしたが、別のキューが必要な場合はどうなるでしょうか? 解決策はftok()
、2 つの引数からキーを生成する関数を使用することです。
これを読むと、共有メモリブロックに何を付けるかが鍵だという印象を受けます。しかし、これは真実ではありませんね。
c - ftok()の衝突
ftok()
Cアプリケーションで使用される共有メモリセグメントの識別子を生成するために使用しています。問題が発生しています。1つのボックスで、rootが使用する識別子との衝突が発生しています。この場合、コードをハッキングすることで修正できますが、より堅牢なソリューションが必要です。
アプリケーションは独自の論理ボリュームにインストールされ、ftokに提供されるパスは、アプリケーションのバイナリディレクトリ(そのlv内)です。提供されるIDは1から始まり、通常は5ダースほどあります。
私はftokが次のようなことをすることを追跡しました:
st.st_dev/st.st_inoの組み合わせは非常にユニークである必要があります。しかし、私はいくつかのボックスを見てきましたが、st_devの最下位ビットは多くの場合0です(つまり、st_devの数値は通常256の倍数です)。また、バイナリディレクトリは論理ボリューム内にあるため、iノード番号がrootが使用するものと異なるという保証はありません。
これを回避する良い方法はありますか?ftokのより良い代替手段、またはst_dev番号がftokにもっと役立つようにマシンを設定する方法はありますか?
c - メッセージキューの目的ftokとは何ですか
LinuxのIPCメカニズムの1つであるメッセージキューの読み取りを開始しました。しかし、最初のステップで、いくつかの非常に基本的な質問があります。
を使用し
ftok()
て一意のID(キー)を生成し、生成される一意のIDとは何ですか。使用するのではなく、単純な数字を使用してキーを取得することはできません
ftok()
か?関数の引数
/li>key
の目的は何ですか?msget
msqid
との違いは何key
ですか?
c - C を使用した共有メモリの理解
C を使用して、共有メモリをセットアップしようとしています。私のコードは次のようになります:
ただし、その最後の行を 2 番目に実行すると、セグメンテーション違反が発生します。デバッグ時に、「sharedval」を出力すると、メモリ アドレスが取得されます。おそらく、取得したメモリ内の場所です。したがって、私がしなければならないことは*sharedval
、それを評価するために使用することだけだと思いますが、どうやらそうではありません。共有メモリから読み取るにはどうすればよいですか? 正しい方向へのプッシュは素晴らしいでしょう。ありがとう!
編集:
another.anon.coward の出力:
c - ftok共有メモリの衝突を判断する方法
いくつかのレガシーコードの問題をデバッグしようとしています。私が見ているものを理解しようとしているときに、を使用して2つの固有の共有メモリスペースを構築していることがわかりましたftok
。私はそれが何をするかを見るためにオンラインで調べました、そして私はこのリンクに出くわしました。深く調べてみると、ftok
一意のキーが保証されておらず、スペースが衝突する可能性がわずかにあることがわかりました。
だから、私はこれが私に当てはまるかどうかを判断しようとして立ち往生しています。それが本当に共有メモリ空間の衝突の問題であるかどうかを判断するにはどうすればよいですか?従来の実行可能ファイルでは、ひどいメモリリークになる可能性があります...
c - msgget() と ftok() のエラー
IPCプログラミングを学んでいます。その一環として、メッセージ キューについて知るために、以下の 2 つのコードを試しました。
メッセージ キュー作成者またはメッセージ送信者
メッセージ受信者
上記のコードはbeej's guide for message queue にあります。
"spock" msgget() を実行しようとすると、エラーがスローされます: No such file or directory. ftok() に何か問題がありますか。file のパーミッションを msgget() 関数に渡すパーミッションに変更しました。しかし、同じエラー。前もって感謝します。前もって感謝します。
c - ftok パス名とファイル名
最初のパラメータにパス名ではなくファイル名を使用するとどうなりますか? たとえば、私のプログラムは次のディレクトリにあります
/afs/edu/id/group/a/ftok_test.c
この場合、私が使用する場合
この2つの違いは何ですか?