statfs - システムコールの説明 - Linux コマンド集 一覧表
名前
statfs, fstatfs - ファイル・システムの統計を得る
書式
#include <sys/vfs.h>    
/* または <sys/statfs.h> */
int statfs(const char *
path
, struct statfs *
buf
);
int fstatfs(int 
fd
, struct statfs *
buf
);
書式
関数
statfs
()はマウントされたファイル・システムについての情報を返す。
path
はマウントされたファイル・システムにあるファイルのパス名である。
buf
は
statfs
構造体へのポインターで、およそ以下のように定義される:
struct statfs {
   long    f_type;     /* ファイルシステムの型 (下記参照) */
   long    f_bsize;    /* 最適なブロックサイズ */
   long    f_blocks;   /* ファイルシステムの総データブロック数 */
   long    f_bfree;    /* ファイルシステムの空きブロック数 */
   long    f_bavail;   /* 非スーパーユーザが使用可能な空きブロック数 */
   long    f_files;    /* ファイルシステムの総ファイルノード数 */
   long    f_ffree;    /* ファイルシステムの空きファイルノード数 */
   fsid_t  f_fsid;     /* ファイルシステムの ID */
   long    f_namelen;  /* ファイル名の最大長 */
};
ファイル・システムの型:
   ADFS_SUPER_MAGIC      0xadf5
   AFFS_SUPER_MAGIC      0xADFF
   BEFS_SUPER_MAGIC      0x42465331
   BFS_MAGIC             0x1BADFACE
   CIFS_MAGIC_NUMBER     0xFF534D42
   CODA_SUPER_MAGIC      0x73757245
   COH_SUPER_MAGIC       0x012FF7B7
   CRAMFS_MAGIC          0x28cd3d45
   DEVFS_SUPER_MAGIC     0x1373
   EFS_SUPER_MAGIC       0x00414A53
   EXT_SUPER_MAGIC       0x137D
   EXT2_OLD_SUPER_MAGIC  0xEF51
   EXT2_SUPER_MAGIC      0xEF53
   EXT3_SUPER_MAGIC      0xEF53
   HFS_SUPER_MAGIC       0x4244
   HPFS_SUPER_MAGIC      0xF995E849
   HUGETLBFS_MAGIC       0x958458f6
   ISOFS_SUPER_MAGIC     0x9660
   JFFS2_SUPER_MAGIC     0x72b6
   JFS_SUPER_MAGIC       0x3153464a
   MINIX_SUPER_MAGIC     0x137F /* オリジナルの minix */
   MINIX_SUPER_MAGIC2    0x138F /* 30 文字ファイル名の minix */
   MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
   MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 文字ファイル名 */
   MSDOS_SUPER_MAGIC     0x4d44
   NCP_SUPER_MAGIC       0x564c
   NFS_SUPER_MAGIC       0x6969
   NTFS_SB_MAGIC         0x5346544e
   OPENPROM_SUPER_MAGIC  0x9fa1
   PROC_SUPER_MAGIC      0x9fa0
   QNX4_SUPER_MAGIC      0x002f
   REISERFS_SUPER_MAGIC  0x52654973
   ROMFS_MAGIC           0x7275
   SMB_SUPER_MAGIC       0x517B
   SYSV2_SUPER_MAGIC     0x012FF7B6
   SYSV4_SUPER_MAGIC     0x012FF7B5
   TMPFS_MAGIC           0x01021994
   UDF_SUPER_MAGIC       0x15013346
   UFS_MAGIC             0x00011954
   USBDEVICE_SUPER_MAGIC 0x9fa2
   VXFS_SUPER_MAGIC      0xa501FCF5
   XENIX_SUPER_MAGIC     0x012FF7B4
   XFS_SUPER_MAGIC       0x58465342
   _XIAFS_SUPER_MAGIC    0x012FD16D
f_fsid にどんな値が入るべきなのかは誰も知らない (但し、下記を参照)。
それぞれのファイル・システムにおいて未定義のフィールドには 0 が 設定される。 fstatfs ()はディスクリプター fd によって参照されるオープンされたファイルについて、同じ情報を返す。
返り値
成功すれば 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
エラー
- EACCES
- ( statfs ()の場合) path のディレクトリ部分に検索許可が与えられていない ( path_resolution (2)も参照すること)。
- EBADF
- ( fstatfs ()の場合) fd は有効なオープンされたファイル・ディスクリプターではない。
- EFAULT
- buf または path が不正なアドレスを指している。
- EINTR
- この呼び出しがシグナルで中断された。
- EIO
- ファイル・システムの読み込みの間に I/O エラーが発生した。
- ELOOP
- ( statfs ()の場合) path を解決するのに辿るべきシンボリック・リンクが多すぎる。
- ENAMETOOLONG
- ( statfs ()の場合) path が長過ぎる。
- ENOENT
- ( statfs ()の場合) path によって参照されるファイルが存在しない。
- ENOMEM
- カーネルに十分なメモリがない。
- ENOSYS
- ファイル・システムがこの呼び出しをサポートしていない。
- ENOTDIR
- ( statfs ()の場合) path のディレクトリ部分がディレクトリでない。
- EOVERFLOW
- 値が大き過ぎるため、返り値の構造体で表現できない。
準拠
Linux の statfs ()は 4.4BSD のものに影響を受けている。 (しかし同じ構造体を使用しているわけではない)
注意
このライブラリコールをサポートするため、
カーネルにはシステムコール
statfs
(),
fstatfs
(),
statfs64
(),
fstatfs64
()がある。
<sys/vfs.h> しか持たないシステムもあり、
<sys/statfs.h> も持っているシステムもある。
前者は後者をインクルードするので、
前者をインクルードするのが良いと考えられる。
LSB ではライブラリコール
statfs
(),
fstatfs
()を非推奨として、代わりに
statvfs
(),
statvfs
()を使うように指示している。
f_fsid フィールド
Solaris, Irix, POSIX にはシステムコール
 
statvfs
(2) があり、
"struct statvfs"
を返す
(
<sys/statvfs.h>
で定義されている)。
この構造体には、
"unsigned long"
f_fsid
が含まれている。
Linux, SunOS, HP-UX, 4.4BSD にはシステムコール
statfs
()があり、
"struct statfs"
を返す
(
<sys/vfs.h>
で定義されている)。
この構造体には
fsid_t
f_fsid
,が含まれており、
fsid_t
は
"struct { int val[2]; }"
と定義されている。
FreeBSD でも同じであるが、インクルードファイル
"<sys/mount.h>"
を使う。
f_fsid
はあるランダムな値を持ち、
(
f_fsid
,
ino
)という 1 組の値でファイルを一意に決定できるようにする、
というのが基本的な考え方である。
いくつかの OS では、デバイス番号 (の変種) を使ったり、
デバイス番号とファイル・システムタイプを組み合わせて使ったりしている。
OS の中には
f_fsid
フィールドの取得をスーパーユーザに限定しているものもある
(非特権ユーザが取得すると 0 となる)。
NFS でエクスポートされる場合、
このフィールドがファイル・システムのファイルハンドルで使われており、
この値を提供するとセキュリティ上の問題がある。
いくつかの OS では、 fsid を sysfs ()システムコールの第 2 引き数として使用できる。


 

