トップ
|
未対応ソフト(2010/10/13 現在)下記は、FreeBSD ではコンパイルしないので作業を行っていません。
対応済みソフト(多分)
ディスクの残り容量の取得events や wdisk は、ディスクの残り容量の情報を、statfs 構造体の f_bavail のメンバから取得している。ただし、Solaris や NetBSD は statvfs 構造体の f_frsizeメンバから取得。
問題点は以下の通り。とりあえず、long でプログラミングしておく。
FreeBSD の場合RELENG_5 以上http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/mount.h?f=u&only_with_tag=RELENG_5&logsort=date
FreeBSD 8.1 for i386 でもこのようなっており、sizeof(f_bavail) も 8 と出るので、64ビットの数値となっている。 RELENG_4 以下http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/mount.h?f=u&only_with_tag=RELENG_4&logsort=date
Linux の場合 †良くわからないが、下記のようだ。
statfs64 というのもある。ただ、手持ちの RedHat ? x86-64 マシンではtypedefで定義されており、両者は同じみたい。 共有メモリはどれだけ取れる?WIN システムで共有メモリを確保する時は、shmget(2) を使います。これの書式は、int shmget(key_t, size_t, int) で、メモリの大きさは size_t であることが分かります。FreeBSD-6/amd64 の場合,size_t は、__uint64_t ですので、64 bit の大きさ分確保出来ます。 一方、カーネル上での共有メモリの最大値は、kern.ipc.shmmax で見れます。この値がどこまで取れるかというのを見るためには、最終的に、/usr/src/sys/sys/shm.h の中の struct shminfo という構造体にたどり着きます。この構造体の宣言は、 struct shminfo { int shmmax, /* max shared memory segment size (bytes) */ shmmin, /* min shared memory segment size (bytes) */ shmmni, /* max number of shared memory identifiers */ shmseg, /* max shared memory segments per process */ shmall; /* max amount of shared memory (pages) */ }; となっており、int で宣言されていることが分かります。つまり、FreeBSD-6/amd64 では、2^31-1 byte までしか一括して共有メモリが取れない事がわかります。実際に、2GB 以下のパラメータでないとカーネルのコンパイルが出来ませんでした。 結論として、FreeBSD-6/amd64 では、2GBしか一括して共有メモリが取れない、ということでした。 FreeBSD-7 では、 struct shminfo { u_long shmmax; /* max shared memory segment size (bytes) */ u_long shmmin; /* max shared memory segment size (bytes) */ u_long shmmni; /* max number of shared memory identifiers */ u_long shmseg; /* max shared memory segments per process */ u_long shmall; /* max amount of shared memory (pages) */ }; になっているので、2GB 以上も取れるようになっているでしょう。 FreeBSD 8ではちゃんと2GB以上確保出来るようになっていた。 リンク集 |