11/26(月)
★vsnprintf()とstrings.h
今日は、よその会社にうちのシステムをインストールしに行った。 これが、また、よりによって、AIXなのだ。 うちには、UNIXはSolarisとLinuxの環境しかない。 従って、客先でコンパイルさせてもらった。 予想通りというか、すんなりコンパイルが進みつつも、所々失敗する。 まず、strcasecmp()でお亡くなりである。 プロトタイプ宣言がされていないというのだ。 普通なら、こんなものwarningが出るだけで、defaultの戻り値intで動くはずだ。 それが、この、頑固者はコンパイルを通してくれない。 しかし、不思議なことに、ソースを見ても、「string.h」はincludeされてるのだ。 なんでかなぁ、と思って、/usr/include/string.h の中身を見ると確かに宣言されていない。 わからんので、とりあえず、man strcasecmpすると、なんと、「string.h」ではなく、「strings.h」なのだ。 がーん。 こんなの二つもあるなんて知らなかった・・・。 ちなみに、Linuxでも、Solarisでも、strcasecmp()はstring.hとstrings.hの両方に書かれている。 また、manの内容は、Solarisはstrings.h、Linuxはstring.h だと書いてあった。 まだまだ、知らないことはいっぱいあるものだ。

そして、いろいろして、無事、コンパイルは通ったのだが、なんと、今度は動かない。 追いつめてみると、どうも、vsnprintf()の戻り値があやしい。 Solarisは「The vsnprintf() function returns the number of characters formatted, that is, the number of characters that would have been written to the buffer if it were large enough」なのだ。 つまり、「バッファが十分あったら書き込んだであろう」長さなのだ。 ところが、このAIXめ、実際に書き込んだ文字数を返しているのだ。 まいった・・・。

ちなみに、Linuxだと、「If the output was truncated, the return value is -1」ということで、書き込みきれなかった場合、「-1」なのだ。 また違う・・・。 あーあー、もう、何とかしろよぉ、と思いつつ、もう少し読むと、 「(Thus until glibc 2.0.6. Since glibc 2.1 these functions return the number of characters which would have been written to the final string if enough space had been available.)」 「なぁんていうのは昔の話で、glibc2.1以降は・・・」と意地が悪い。 結局は、Solaisと同じ動きだ。 しかし、まぁ、こうも仕様が違うと怖いねぇ。


内容 名前
・月5万円でAIX機の貸し出しやろかな? ただし3年契約やで [2001/11/27 19:37:43] (by betti)
・AIXなんかいらーーん。(^^; でも、SUNもよー死ぬしなぁ。 [2001/11/29 22:01:43] (by ひらちゃん)
・死ぬのはひらちゃんSUNだけやろ(^^; [2001/11/30 04:58:31] (by betti)
・klark2d4@gmail.com [2015/8/13 12:30:55] (by gordon)
# 戻る