3

私は現在ubuntoでアプリケーションを開発しており、shm_openを呼び出しています。現在、デフォルトのパスは/ var / run/shm内にあります。ただし、これを/tmpに変更する必要があります。以下を試してみても機能しません。

fd = shm_open( "/ tmp / test"、O_RDWR | O_CREAT、0777);

誰かアドバイスしてもらえますか?

4

2 に答える 2

11

のマニュアルページから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 システムに移植できない可能性があることにも注意してください。

于 2012-06-19T14:36:25.180 に答える
2

tmpfsこれにはファイルシステムをマウントする必要があります/tmp:

mihai@keldon:~$ mount | grep shm
shm on /dev/shm type tmpfs (rw,nosuid,nodev,relatime)

そうでなければ、それは不可能です。

于 2012-06-19T14:01:35.567 に答える