Developer

未対応ソフト(2010/10/13 現在)

下記は、FreeBSD ではコンパイルしないので作業を行っていません。

  • recvs.c
  • sends.c

対応済みソフト(多分)

  • 2010/10/13 recvnmx, recvts, rawsrv_info, raw_time
  • 2010/10/12 raw_shift, raw_ch, raw_100, ls8tel_STS, ls8tel_STM, ls8tel16_win, ls8tel16_raw, elist, file_older
  • 2010/10/11 ecore2
  • 2010/10/09 ecore
  • 2010/10/08 cormeisei, insert_trg
  • 2010/10/07 wform, winrandsimu6, wintowin, wintosac?, timeout, select_bylatlon, select_stations
  • 2010/10/04 relaym, recvt_LS7000
  • 2010/09/30 relay, recvstatus, resvstatus2, recvstatus3, recvstatus4
  • 2010/09/27 events
  • 2010/09/21 pmon, evdetect, ras2util.c (ras2lips, ras2rpdl)
  • 2010/09/20 extraw, send_raw_old, final2finalb, finalb2final, finalb2seis, find_picks, pick2final, pick2finalb, pick2tseis
  • 2010/09/18 send_raw
  • 2010/09/17 wadd2, rtape, wtime, wck_wdisk
  • 2010/09/16 wadd, wed
  • 2010/06/23 win
  • 2010/04/03 dewin
  • 2010/02/17 fromtape
  • 2010/02/16 wtape, setexb
  • 2010/02/02 insert_raw
  • 2010/01/04 wdiskts
  • 2009/12/21 raw_mon, wdisk
  • 2009/12/18 order
  • 2009/08/01 winadd
  • 2009/07/31 wchch, wch, wchasn, win2raw
  • 2009/07/30 raw2mon
  • 2009/03/06 ls8tel_STM, ls8tel_STS
  • 2009/01/04 shmdump
  • 2008/12/17 recvt
  • 2008/11/14 wck

ディスクの残り容量の取得

events や wdisk は、ディスクの残り容量の情報を、statfs 構造体の f_bavail のメンバから取得している。ただし、Solaris や NetBSD は statvfs 構造体の f_frsizeメンバから取得。

OSstatfs()statfs64()struct statfsstatvfs()備考
FreeBSD
sys/param.h
sys/mount.h
×◯?
sys/statvfs.h
Linux
sys/vfs.h
(or sys/statfs.h)

sys/vfs.h
(or sys/statfs.h)
configureで手動切替
◯?
sys/statvfs.h
NetBSD
ライブラリのみ
HAVE_STATFSが定義される
××
sys/statvfs.h
3.0 以降はstatvfs(2)しかサポートしない(参考URL)。
Solaris
sys/statfs.h
将来削除予定
×
sys/statvfs.h
少なくとも5.9と5.10ではstatfs(2)も動作するが、statvfs(2)の使用を推奨。

問題点は以下の通り。とりあえず、long でプログラミングしておく。

  • int64_t と long の場合、sscanf ではそれぞれ %lld か %ld で読み込まなければならず、条件分岐しないといけない。
  • FreeBSD i386 の場合、int64_t できちんとプログラムは動くのか? 動いていそう。
  • statfs64 との違いは何?  

FreeBSD の場合

RELENG_5 以上

http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/mount.h?f=u&only_with_tag=RELENG_5&logsort=date

  • int64_t f_bavail

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

  • long f_bavail

Linux の場合

良くわからないが、下記のようだ。

  • long f_bavail

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以上確保出来るようになっていた。

リンク集


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-23 (火) 17:23:52