2012-02-19 16 views
3

私は、Cのプログラムで、いくつかのプロセスが埋め込みLinux上の共有メモリにアクセスする必要があることに取り組んでいます。この共有メモリは、作成時に初期化する必要があります。このメモリに接続されているプロセスはクラッシュする可能性があります。再起動すると(linux INITによって)、他のプロセスがそれを使用しているので、共有メモリを再び初期化してはなりません。共有メモリを作成しているプロセスの現在の開始が初めてであるか、再起動されたかを確認する方法。私は、このメモリが初期化されたと主張するために、5678956(ffffffffまたは00000000以外の任意の数)のような数値として書き込まれる共有メモリに整数を割り当てるアイデアを考え出しました。しかし、重要なデータがこのメモリを格納しているので、これがうまくいけばよく分かりません。アドバイスをいただければ幸いです。ありがとう。プロセスが最初に起動するかどうかを確認する方法

答えて

4

共有セマフォと共有メモリセグメントの両方を使用する必要があります。 sem_openでセマフォを開こうとします。O_EXCL|O_CREATと初期値は0です。成功した場合は、共有メモリセグメントを作成して初期化し、セマフォをポストして閉じます。シームフォアを排他モードで開くのに失敗した場合は、それを非排他的に開き、セマフォを待ってから閉じます。

あなたが望むならば、別の解決方法:ファイルシステム内で、mmapMAP_SHAREDという名前の共有ファイルを使用してください。最初に一時的な名前のファイルを作成し、それに含めるべき初期データを入力します。その後、実際の名前にlinkを試してください。 linkEEXISTで失敗した場合は、最初のプロセスではなく、一時ファイルを削除して既存のファイルを開いてマップすることができます。 linkが成功した場合は、最初のプロセスです。

+0

名前付きファイルを 'tmpfs'ファイルシステムに作成して、物理ディスクに触れることさえできません。 – caf

+0

はい、実際には、POSIXが通常のファイルシステムのセマンティクスで '/ dev/shm'を定義するのではなく、醜い' shm_open'インタフェースを指定するのはむしろ面倒です。共有メモリオブジェクトを '名前を変更する'/'リンクする'ことができないと、そうでない場合よりもあまり有用ではありません。 –

+0

あなたの答えをありがとう。 –

関連する問題