私は現在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)
そうでなければ、それは不可能です。