内容简介
#include <sys/types.h>%uA0#include <sys/stat.h>%uA0
#include <unistd.h>
int stat(const char *path, struct stat *buf)%uA0
int fstat(int%uA0filedes, struct stat *buf)%uA0
int lstat(const char *path, struct stat *buf)
描述
These functions return information about a file. No permissions are required on the file itself, but — in the case of%uA0stat() and%uA0lstat() — execute (search) permission is required on all of the directories in%uA0path%uA0that lead to the file.
stat() stats the file pointed to by%uA0path%uA0and fills in%uA0buf.
lstat() is identical to%uA0stat(), except that if%uA0path%uA0is a symbolic link, then the link itself is stat-ed, not the file that it refers to.
fstat() is identical to%uA0stat(), except that the file to be stat-ed is specified by the file descriptor%uA0filedes.
All of these system calls return a%uA0stat%uA0structure, which contains the following fields:
struct stat { dev_t st_dev /* ID of device containing file */ ino_t st_ino /* inode number */ mode_t st_mode /* protection */ nlink_t st_nlink /* number of hard links */ uid_t st_uid /* user ID of owner */ gid_t st_gid /* group ID of owner */ dev_t st_rdev /* device ID (if special file) */ off_t st_size /* total size, in bytes */ blksize_t st_blksize /* blocksize for filesystem I/O */ blkcnt_t st_blocks /* number of blocks allocated */ time_t st_atime /* time of last access */ time_t st_mtime /* time of last modification */ time_t st_ctime /* time of last status change */ } |
The%uA0st_dev%uA0field describes the device on which this file resides.
The%uA0st_rdev%uA0field describes the device that this file (inode) represents.
The%uA0st_size%uA0field gives the size of the file (if it is a regular file or a symbolic link) in bytes. The size of a symlink is the length of the pathname it contains, without a trailing null byte.
The%uA0st_blocks%uA0field indicates the number of blocks allocated to the file, 512-byte units. (This may be smaller than%uA0st_size/512, for example, when the file has holes.)
The%uA0st_blksize%uA0field gives the "preferred" blocksize for efficient file system I/O. (Writing to a file in smaller chunks may cause an inefficient read-modify-rewrite.)
Not all of the Linux filesystems implement all of the time fields. Some file system types allow mounting in such a way that file accesses do not cause an update of the%uA0st_atimefield. (See ‘noatime’ in%uA0mount(8).)
The field%uA0st_atime%uA0is changed by file accesses, e.g. by%uA0execve(2),%uA0mknod(2),%uA0pipe(2),utime(2) and%uA0read(2) (of more than zero bytes). Other routines, like%uA0mmap(2), may or may not update%uA0st_atime.
The field%uA0st_mtime%uA0is changed by file modifications, e.g. by%uA0mknod(2),%uA0truncate(2),utime(2) and%uA0write(2) (of more than zero bytes). Moreover,%uA0st_mtime%uA0of a directory is changed by the creation or deletion of files in that directory. The%uA0st_mtime%uA0field is%uA0notchanged for changes in owner, group, hard link count, or mode.
The field%uA0st_ctime%uA0is changed by writing or by setting inode information (i.e., owner, group, link count, mode, etc.).
The following POSIX macros are defined to check the file type using the%uA0st_mode%uA0field:
标签 | 描述 |
---|---|
S_ISREG(m) | is it a regular file? |
S_ISDIR(m) | directory? |
S_ISCHR(m) | character device? |
S_ISBLK(m) | block device? |
S_ISFIFO(m) | FIFO (named pipe)? |
S_ISLNK(m) | symbolic link? (Not in POSIX.1-1996.) |
S_ISSOCK(m) | socket? (Not in POSIX.1-1996.) |
The following flags are defined for the%uA0st_mode%uA0field:
S_IFMT | 0170000 | bitmask for the file type bitfields |
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | symbolic link |
S_IFREG | 0100000 | regular file |
S_IFBLK | 0060000 | block device |
S_IFDIR | 0040000 | directory |
S_IFCHR | 0020000 | character device |
S_IFIFO | 0010000 | FIFO |
S_ISUID | 0004000 | set UID bit |
S_ISGID | 0002000 | set-group-ID bit (see below) |
S_ISVTX | 0001000 | sticky bit (see below) |
S_IRWXU | 00700 | mask for file owner permissions |
S_IRUSR | 00400 | owner has read permission |
S_IWUSR | 00200 | owner has write permission |
S_IXUSR | 00100 | owner has execute permission |
S_IRWXG | 00070 | mask for group permissions |
S_IRGRP | 00040 | group has read permission |
S_IWGRP | 00020 | group has write permission |
S_IXGRP | 00010 | group has execute permission |
S_IRWXO | 00007 | mask for permissions for others (not in group) |
S_IROTH | 00004 | others have read permission |
S_IWOTH | 00002 | others have write permission |
S_IXOTH | 00001 | others have execute permission |
The set-group-ID bit (S_ISGID) has several special uses. For a directory it indicates that BSD semantics is to be used for that directory: files created there inherit their group ID from the directory, not from the effective group ID of the creating process, and directories created there will also get the S_ISGID bit set. For a file that does not have the group execution bit (S_IXGRP) set, the set-group-ID bit indicates mandatory file/record locking.
The ‘sticky’ bit (S_ISVTX) on a directory means that a file in that directory can be renamed or deleted only by the owner of the file, by the owner of the directory, and by a privileged process.
LINUX 注意
Since kernel 2.5.48, the%uA0stat%uA0structure supports nanosecond resolution for the three file timestamp fields. Glibc exposes the nanosecond component of each field using names either of the form%uA0st_atim.tv_nsec, if the _BSD_SOURCE or _SVID_SOURCE feature test macro is defined, or of the form%uA0st_atimensec, if neither of these macros is defined. On file systems that do not support sub-second timestamps, these nanosecond fields are returned with the value 0.For most files under the%uA0/proc%uA0directory,%uA0stat() does not return the file size in the%uA0st_sizefield instead the field is returned with the value 0.
返回值
On success, zero is returned. On error, -1 is returned, and%uA0errno%uA0is set appropriately.错误
标签 | 描述 |
---|---|
EACCES | Search permission is denied for one of the directories in the path prefix of%uA0path. (See also%uA0path_resolution(2).) |
EBADF | filedes%uA0is bad. |
EFAULT | Bad address. |
ELOOP | Too many symbolic links encountered while traversing the path. |
ENAMETOOLONG | |
%uA0 | File name too long. |
ENOENT | A component of the path%uA0path%uA0does not exist, or the path is an empty string. |
ENOMEM | Out of memory (i.e. kernel memory). |
ENOTDIR | |
%uA0 | A component of the path is not a directory. |
遵循于
These system calls conform to SVr4, 4.3BSD, POSIX.1-2001.Use of the%uA0st_blocks%uA0and%uA0st_blksize%uA0fields may be less portable. (They were introduced in BSD. The interpretation differs between systems, and possibly on a single system when NFS mounts are involved.)
POSIX does not describe the S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX bits, but instead demands the use of the macros S_ISDIR(), etc. The S_ISLNK and S_ISSOCK macros are not in POSIX.1-1996, but both are present in POSIX.1-2001 the former is from SVID 4, the latter from SUSv2.
Unix V7 (and later systems) had S_IREAD, S_IWRITE, S_IEXEC, where POSIX prescribes the synonyms S_IRUSR, S_IWUSR, S_IXUSR.
其它系统
Values that have been (or are) in use on various systems:hex | name | ls | octal | description |
f000 | S_IFMT | %uA0 | 170000 | mask for file type |
0000 | %uA0 | %uA0 | 000000 | SCO out-of-service inode, BSD unknown type |
%uA0 | %uA0 | %uA0 | %uA0 | SVID-v2 and XPG2 have both 0 and 0100000 for ordinary file |
1000 | S_IFIFO | p| | 010000 | FIFO (named pipe) |
2000 | S_IFCHR | c | 020000 | character special (V7) |
3000 | S_IFMPC | %uA0 | 030000 | multiplexed character special (V7) |
4000 | S_IFDIR | d/ | 040000 | directory (V7) |
5000 | S_IFNAM | %uA0 | 050000 | XENIX named special file |
%uA0 | %uA0 | %uA0 | %uA0 | with two subtypes, distinguished by st_rdev values 1, 2: |
0001 | S_INSEM | s | 000001 | XENIX semaphore subtype of IFNAM |
0002 | S_INSHD | m | 000002 | XENIX shared data subtype of IFNAM |
6000 | S_IFBLK | b | 060000 | block special (V7) |
7000 | S_IFMPB | %uA0 | 070000 | multiplexed block special (V7) |
8000 | S_IFREG | - | 100000 | regular (V7) |
9000 | S_IFCMP | %uA0 | 110000 | VxFS compressed |
9000 | S_IFNWK | n | 110000 | network special (HP-UX) |
a000 | S_IFLNK | l@ | 120000 | symbolic link (BSD) |
b000 | S_IFSHAD | %uA0 | 130000 | Solaris shadow inode for ACL (not seen by userspace) |
c000 | S_IFSOCK | s= | 140000 | socket (BSD also "S_IFSOC" on VxFS) |
d000 | S_IFDOOR | D> | 150000 | Solaris door |
e000 | S_IFWHT | w% | 160000 | BSD whiteout (not used for inode) |
0200 | S_ISVTX | %uA0 | 001000 | ‘sticky bit’: save swapped text even after use (V7) |
%uA0 | %uA0 | %uA0 | %uA0 | reserved (SVID-v2) |
%uA0 | %uA0 | %uA0 | %uA0 | On non-directories: don’t cache this file (SunOS) |
%uA0 | %uA0 | %uA0 | %uA0 | On directories: restricted deletion flag (SVID-v4.2) |
0400 | S_ISGID | %uA0 | 002000 | set-group-ID on execution (V7) |
%uA0 | %uA0 | %uA0 | %uA0 | for directories: use BSD semantics for propagation of GID |
0400 | S_ENFMT | %uA0 | 002000 | SysV file locking enforcement (shared with S_ISGID) |
0800 | S_ISUID | %uA0 | 004000 | set-user-ID on execution (V7) |
0800 | S_CDF | %uA0 | 004000 | directory is a context dependent file (HP-UX) |
A sticky command appeared in Version 32V AT&T UNIX.