プロが教える店舗&オフィスのセキュリティ対策術

shmget関数のサイズ指定について質問があります。

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

shmget(1234,0,IPC_ALLOC)
shmget(1234,sizeof(int),IPC_ALLOC)

A 回答 (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 は使わないほうがいいと思いますけれど…^^

レスがあまりないので、表示通りに「困って」る風には思えないので、まあいいんでしょうけど(笑)参考までに^^
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/03 23:46

お使いの環境は solaris(なつかしい^^)ですか?今は、どのUnix OSでも存在するのかな?



http://search.luky.org/linux-users.0/msg00218.html

でもまあ、移植性を重要視するなら、IPC_CREAT と IPC_EXCL その他モード指定マクロのみ使ったほうがいいような感じもします。
    • good
    • 0

そうなんですか。

じゃあ、IPC_ALLOC は、単に 0 と定義されてるマクロですかね。POSIX でも規定されてるのかしら?^^
『IPC_ALLOCは既に存在するものを使うこと』を意味するなら、size 引数は 0 にしないといけないんじゃないですかね?^^

わたしは、IPC_CREAT | IPC_EXCL というのは使ったことはありますけど^^ これは、存在しなければ作るが、存在すればエラーにする、という意味だったと思います。
    • good
    • 0

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

    • good
    • 0

すみません。

ankomoti「さん」が抜けてました^^;
    • good
    • 0

shmget(key, size, shmflg) の第2引数の size は、共有メモリ領域の最小サイズを指定します。

新たな領域(たとえば、サーバ側で)を作成する場合は、実際に取りたい領域のサイズ以上のものを指定しないといけない。既存の領域(たとえば、クライアント側で)を参照する場合は、size に 0 を指定するんだと思いますよ。なので、ankomoti のおっしゃるとおり、アタッチしたいだけなら、0 と指定すべきだと思います。  

ところで、IPC_ALLOC なんてのはありましたっけ?^^; IPC_CREAT ですか??

この回答への補足

早速のコメントありがとうございます。

IPC_ALLOCは既に存在するものを使うことを指示します。存在し
なければエラーらしいです。

補足日時:2007/08/31 02:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!