Linux 2.6を使用していますが、奇妙な問題があります。プロセスごとに1つずつ、3つの異なる共有メモリセグメントを取得する必要がある3つの並行プロセス(同じプロセスからフォークされた)があります。各プロセスはこのコードを実行します(「メッセージ」タイプはユーザー定義であることに注意してください)
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をmmapするときにすべてのプロセスが受け取ったポインターを(デバッグ目的で)出力しようとしましたが、すべてのプロセスが同じポインターを持っていることに気付きました。どうしてそれは可能ですか?他のプロセスが最初のプロセスの後でセグメントの名前を変更する前にshm_open()を実行したのではないかと思ったので、プロセス共有ミューテックスを使用してこれらのコード行をアトミック操作にしようとしましたが、問題は解決しません。
どんな種類の助けや提案も本当にありがたいです。