• ベストアンサー

共有メモリについて

shmget関数のサイズ指定について質問があります。 共有メモリ上にキー番号「1234」で作られている状態で、 以下の関数(サイズ指定ありなし)を呼び出した際の違 いは何なのでしょうか? 単純にキー1234にアタッチしたいだけなら、サイズ0指定を 使用するのでしょうか? shmget(1234,0,IPC_ALLOC) shmget(1234,sizeof(int),IPC_ALLOC)

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.6

IPC_ALLOC は、どうやら、単に 0 と定義されているマクロではなさそうですね。 http://www-igm.univ-mlv.fr/~dr/HEVEA/ なので、mode_t mode = SHM_R | SHM_R >> 3 | SHM_R >> 6; (適当に決めたアクセスモード)として、  shmget(1234, 0, mode); と、  shmget(1234, sizeof(int), IPC_ALLOC | mode); の意味は違うかもしれませんね^^ 上の方は単に存在すればよく、下の方は存在してかつ size をチェックし size が同じ(あるいはそれ以上)という意味になるのかもしれません。移植性を考慮するなら、IPC_ALLOC は使わないほうがいいと思いますけれど…^^ レスがあまりないので、表示通りに「困って」る風には思えないので、まあいいんでしょうけど(笑)参考までに^^

ankomoti
質問者

お礼

レスが遅くなり申し訳ありません。 やはりIPC_CREATとかを使った方がよさそうですね。 どうもありがとうございました。

その他の回答 (5)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.5

お使いの環境は solaris(なつかしい^^)ですか?今は、どのUnix OSでも存在するのかな? http://search.luky.org/linux-users.0/msg00218.html でもまあ、移植性を重要視するなら、IPC_CREAT と IPC_EXCL その他モード指定マクロのみ使ったほうがいいような感じもします。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

そうなんですか。じゃあ、IPC_ALLOC は、単に 0 と定義されてるマクロですかね。POSIX でも規定されてるのかしら?^^ 『IPC_ALLOCは既に存在するものを使うこと』を意味するなら、size 引数は 0 にしないといけないんじゃないですかね?^^ わたしは、IPC_CREAT | IPC_EXCL というのは使ったことはありますけど^^ これは、存在しなければ作るが、存在すればエラーにする、という意味だったと思います。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

ただし、key に IPC_PRIVATE を指定していない場合の話だと思いますけど^^

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

すみません。ankomoti「さん」が抜けてました^^;

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

shmget(key, size, shmflg) の第2引数の size は、共有メモリ領域の最小サイズを指定します。新たな領域(たとえば、サーバ側で)を作成する場合は、実際に取りたい領域のサイズ以上のものを指定しないといけない。既存の領域(たとえば、クライアント側で)を参照する場合は、size に 0 を指定するんだと思いますよ。なので、ankomoti のおっしゃるとおり、アタッチしたいだけなら、0 と指定すべきだと思います。   ところで、IPC_ALLOC なんてのはありましたっけ?^^; IPC_CREAT ですか??

ankomoti
質問者

補足

早速のコメントありがとうございます。 IPC_ALLOCは既に存在するものを使うことを指示します。存在し なければエラーらしいです。

関連するQ&A