私は現在ubuntoでアプリケーションを開発しており、shm_openを呼び出しています。現在、デフォルトのパスは/ var / run/shm内にあります。ただし、これを/tmpに変更する必要があります。以下を試してみても機能しません。
fd = shm_open( "/ tmp / test"、O_RDWR | O_CREAT、0777);
誰かアドバイスしてもらえますか?
私は現在ubuntoでアプリケーションを開発しており、shm_openを呼び出しています。現在、デフォルトのパスは/ var / run/shm内にあります。ただし、これを/tmpに変更する必要があります。以下を試してみても機能しません。
fd = shm_open( "/ tmp / test"、O_RDWR | O_CREAT、0777);
誰かアドバイスしてもらえますか?
のマニュアルページからshm_open(3)
:
name
作成または開く共有メモリ オブジェクトを指定します。/somename
ポータブルに使用する場合、共有メモリ オブジェクトは;という形式の名前で識別される必要があります。NAME_MAX
つまり、最初のスラッシュとそれに続く 1 つ以上の文字で構成される、最大 (つまり 255) 文字の null で終わる文字列で、いずれもスラッシュではありません。
のname
パラメータはshm_open(3)
、ファイル パスではなく、オブジェクト名です! GLIBC がすべての共有メモリ オブジェクトを、/dev/shm
または/var/run/shm
オブジェクト名の前にパスを追加し、結果の名前を呼び出すことによって配置することがありopen()
ます。共有オブジェクト名として指定する/tmp/test
と、Linux は を開いたり作成したりしようとします/var/run/shm/tmp/test
。Open withO_CREAT
は新しいファイルを作成しますが、新しいディレクトリは作成しません。
/var/run/shm/tmp
を呼び出す前に最初にディレクトリを作成すると、テストが機能しますshm_open("/tmp/test", ...)
。共有メモリ オブジェクトの操作が終了したら、忘れずに削除してください。また、内部に 2 つのスラッシュを含むオブジェクト名を使用すると、他の Unix システムに移植できない可能性があることにも注意してください。
tmpfs
これにはファイルシステムをマウントする必要があります/tmp
:
mihai@keldon:~$ mount | grep shm
shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)
そうでなければ、それは不可能です。