statfs() - Unix,Linux系统调用
广告
名称
statfs, fstatfs - 获取文件系统统计信息
概要
#include <sys/vfs.h> /* or <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; /* type of filesystem (see below) */
long f_bsize; /* optimal transfer block size */
long f_blocks; /* total data blocks in file system */
long f_bfree; /* free blocks in fs */
long f_bavail; /* free blocks avail to non-superuser */
long f_files; /* total file nodes in file system */
long f_ffree; /* free file nodes in fs */
fsid_t f_fsid; /* file system id */
long f_namelen; /* maximum length of filenames */
};
|
文件系统类型
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 /* orig. minix */
MINIX_SUPER_MAGIC2 0x138F /* 30 char minix */
MINIX2_SUPER_MAGIC 0x2468 /* minix V2 */
MINIX2_SUPER_MAGIC2 0x2478 /* minix V2, 30 char names */
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 引用的打开文件相同的信息。
返回值
成功时,返回零。出错时,返回 -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() 和fstatvfs()。
f_fsid 字段
Solaris、Irix 和 POSIX 具有返回struct statvfs(在<sys/statvfs.h> 中定义)的系统调用statvfs(2),其中包含unsigned long f_fsid。Linux、SunOS、HP-UX、4.4BSD 具有返回struct statfs(在<sys/vfs.h> 中定义)的系统调用statfs(),其中包含fsid_t f_fsid,其中fsid_t 定义为struct { int val[2]; }。FreeBSD 也一样,只是它使用包含文件<sys/mount.h>。
总体思路是f_fsid 包含一些随机内容,以便对 (f_fsid,ino) 唯一地确定一个文件。某些操作系统使用(变化的)设备号,或者设备号与文件系统类型组合在一起。几个操作系统仅将f_fsid 字段的输出限制为超级用户(并将其对非特权用户清零),因为此字段在 NFS 导出时用于文件系统的文件句柄,而将其输出是一个安全问题。
在某些操作系统下,fsid 可以用作sysfs() 系统调用的第二个参数。
参见
广告
|