shmatの仕様が変 - TK's HP

TK's HP ホーム » スポンサー広告 » linux » shmatの仕様が変

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

shmatの仕様が変

shmatのmanpageを見ると、

書式
void *shmat(int shmid, const void *shmaddr, int shmflg);

返り値
shmat() は、成功した場合、付加された共有メモリ・セグメントのアドレスを返す。エラーの場合、 (void *) -1 を返し、 errno にエラーの原因を示す値を設定する。

となっている。


この(void *) -1がすごく気持ちが悪い!

intであろうとcharであろうともちろんvoidであろうと、
ポインタはメモリ空間のアドレスを指し示すので、非負の整数をもつはずである。

つまり普通の環境だとunsigned int の値を持ち、32bitOSだと0~4294967295までの値になるはず。

そこに-1なんて値をつっこんだら0xffffffffとなって最も大きな値として認識されることになる。


もしかしてポインタはunsignedじゃなくてsignedとか思って確認するプログラムを作ってみた。

#include <stdio.h>

void *test(void)
{
return (void *)-1;
}

int main(void)
{
char *p;
p = (char *)test();

if(p < (char *)0){printf("-\n");}
else {printf("+\n");}
return 0;
}


char *に(void *)-1を代入して、それが0以上のときは+,0未満のときは-を表示するだけのプログラムです。

test関数はshmat()の代わりです。

もちろん結果は'+'でした。
やはりsignedではなくunsignedなので負の値を入れると正の値になる。



実用上としてメモリの1番最後をshmatすることは無いので問題は無いが、気持ちの悪い仕様な気がする。

メモリ関連は普通は失敗したらNULL(0)を返すので、それにできなかったのだろうか?
関連記事
コメント
非公開コメント

トラックバック

http://tclip.blog.fc2.com/tb.php/84-68091b8a

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。