[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00199] Re: 巨大ファイルの扱い



潮田です。

>  しらいです。
> 

>  情報提供どうもありがとうございます。しかし、version 依存問
> 題が完全にはクリアされませんね。各々の version を自動判別す
> る術が判って初めて「make 一発」が実現出来るので。
>  一応こちらでも調べてみたのですが、AIX: 4 以降、HP-UX: 11
> 以降、Solaris: 5.6 以降、という状況のようです。この分け目と
> なる version の自動判別が出来ればいいんですけどね。
とりあえず AIX だと _AIX43 が定義されているかで、判定できかと思
います。
今現在 _AIX32,_AIX41,_AIX43,_AIX50,_AIX51,_AIX52 が存在しており、
コンパイルしている OS より前の version の定義をすべての並べて
使用します。
(うちは 5.1 なので -D_AIX32 ... -D_AIX51 のように使用)

ただ、 man stat64 に
>    Note: The stat64, lstat64, and fstat64 subroutines apply
>          to AIX 4.2 and later releases.
と記載されているのですが、そのくぎりの _AIX42 というものは
ないようです。
AIX 4.2 上では AIX 4.1 とまったく同じ定義を使用することは、
コンパイラーの設定ファイルで分かるので、この version を
使用しているユーザーに泣いてもらえれば・・・

>  まとめるとこんな感じでしょうか。
> Linux)
> #define EXTENDCCOPT	"-O -D_FILE_OFFSET_BITS=64"
> 
> AIX)
> #define EXTENDCCOPT	"-O -D_LARGE_FILES -U_LARGE_FILE_API"
> 
> HP-UX)
> #define EXTENDCCOPT	"-D_FILE_OFFSET_BITS=64"
> 
> Solaris)
> #define EXTENDCCOPT	"-O -D_FILE_OFFSET_BITS=64"
HP-UX だけ -O が無いのですが、これはこの OS では -O ですら
危ないのでしょうか。
あと、 HP-UX や Solaris も2種類の define は排他ってことは
無いでしょうか。
(どちらも何の根拠も無く、たんなる疑問です)

>  心配なのは、これらの手段は 32bit OS 用に用意されているとい
> う点ですね。上記のように machine.h を書換えた場合、64bits OS
> 下で compile して支障がないかという懸念があります。
>  Linux 以外は 32bit 環境しか無いんでしたっけ?
多分ご存知で反語的に使用されているとは思いますが、 Linux 以外の
3種の OS すべてに 64 bit 環境もあります。

AIX だと kernel の差し替えだけで 32 -> 64 では再起動さえ必須で
無いらしいです。
(64 -> 32 は必須だそうですが)
自分たちで書いたソースが 32bit 環境に依存したつくりになって
いるので、 64bit 環境にしたことはありません。
(CPU が Power4 なので 32bit ではちっとも速くないです)

この確認のために管理者にはじめて確認したのですが、うちの
 HP-UX や Solaris は 64bit 環境のはずだそうです。
確認方法(コマンド)をしらないが、最低限 install されている
商用のソフト(CA 製の監視ソフト)は 64bit モジュールで動いている
とのこと。
FD(にかぎりませんが) が 32bit で作成されているのは、単に
コンパイルラーが default で 32bit モジュールを作成しているから
みたいです。


>  もし Linux(Alpha) 環境があるんでしたら、上記の対処が Alpha
> 版に対して特に支障をもたらさないかどうか、検証してみて頂けな
> いでしょうか。
2G over のサイズを持つファイルの名前が表示されて、
サイズ順でソート可能なことは確認しました。

簡単に
--- ここから ---
#include <stdio.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
        printf("int[%d], long[%d], void *[%d], size_t[%d],"
               "off_t[%d]\n", sizeof(int), sizeof(long),
               sizeof(void *), sizeof(size_t), sizeof(off_t));

        return 0;
}
--- ここまで ---
のソースで "-O -D_FILE_OFFSET_BITS=64" のある or なしの結果を
みてみましたが変化ありませんでした。

# int[4], long[8], void *[8], size_t[8], off_t[8] となります。

# 便乗   64bit 環境では
# 実害はないと思いますが、custom.c で struct _envtable の def を
# int へキャストしているところはワーニングになります。
# char * > int ですので。

環境は、 Kondara MNU/Linux release 1.2 です。
# 2.0 からは対象外となった古い alpha です。
# 次は suse あたりかな。


# もしかして samba-2.2.8a-ja-1.0 の方でも同じようなことを...