私はLinux 2.6で、奇妙な問題があります。私は、プロセスごとに1つの異なる3つの共有メモリセグメントを取得する必要がある3つの同時プロセス(同じプロセスから分岐)を持っています。プロセスの各、このコードを実行する(「メッセージ」タイプがユーザー定義であることに注意してください)プロセスがshm_open()を使用するとき、Linuxカーネルはどのようにメモリポインタを割り当てますか?
message *m;
int fd = shm_open("message", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(message));
m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
char messagename[16];
snprintf(messagename, sizeof(messagename), "%p", m);
char path[32] = "/dev/shm/";
strcat(path, messagename);
rename("/dev/shm/message", path);
は私が少し説明しましょう:私は、すべてのプロセスがメッセージを含む共有メモリ領域を割り当てたいです。別のプロセス(メッセージ受信者)が同じshmにアクセスできるようにするために、私はshmファイルの名前を "message"から、メッセージポインタの後に付けられた文字列に変更します(これはメッセージを受け取るプロセスがすでにポインタを知っているからです)。
shm_openで得られたfdをmmappingするときに、すべてのプロセスが受け取ったポインタを(デバッグ目的のために)印刷しようとしましたが、すべてがSAMEポインタを持っていることに気付きました。どのように可能ですか?私は他のプロセスがshm_open()を実行した後で、セグメントの名前を変更する前にshm_open()を実行したと思っていたので、これらのコード行をプロセス共有mutexを使ってアトミック操作にしようとしました。
本当にありがとうございました。
おかげさまで、あなたのアイデアpidを使用するのは良いようだと私は確かにそのショットを与えるだろう。しかし、shm_open()を使って私は共有メモリ(とプライベートではない)メモリポインタを尋ねました。共有メモリに関しては、私が考えていたプロセスの仮想メモリ空間にかかわらず、いつも別のポインタを期待していました。 さらに、プロセスによって呼び出されるshm_open()のそれぞれに異なる名前を使用しても、それらはすべて同じアドレスを取得します。 shm_open()+ mmap()が共有メモリポインタを与える場合、shmの名前が異なる場合、どのようにして同じものになりますか? –
プロセスからのメモリへのすべてのアクセスは、そのプロセスの仮想アドレス空間を経由します。基礎となるメモリは共有することができますが、各アプリケーションのビューはプライベートです。したがって、OSの裁量により、各プロセスの同じアドレス、または異なるプロセスの異なるアドレスに表示される可能性があります。 – mhsmith
...逆に、異なるプロセスの同じアドレスに異なる共有メモリブロックが現れることがあります。これがあなたに起こります。 – mhsmith