2004-11-03 13:51:07 +00:00
|
|
|
'\" t
|
|
|
|
.\" Hey Emacs! This file is -*- nroff -*- source.
|
|
|
|
.\"
|
|
|
|
.\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992
|
|
|
|
.\" Parts Copyright (c) 1995 Nicolai Langfeldt (janl@ifi.uio.no), 1/1/95
|
2007-05-28 11:43:03 +00:00
|
|
|
.\" and Copyright (c) 2007 Michael Kerrisk <mtk-manpages@gmx.net>
|
2004-11-03 13:51:07 +00:00
|
|
|
.\"
|
|
|
|
.\" Permission is granted to make and distribute verbatim copies of this
|
|
|
|
.\" manual provided the copyright notice and this permission notice are
|
|
|
|
.\" preserved on all copies.
|
|
|
|
.\"
|
|
|
|
.\" Permission is granted to copy and distribute modified versions of this
|
|
|
|
.\" manual under the conditions for verbatim copying, provided that the
|
|
|
|
.\" entire resulting derived work is distributed under the terms of a
|
|
|
|
.\" permission notice identical to this one.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2004-11-03 13:51:07 +00:00
|
|
|
.\" Since the Linux kernel and libraries are constantly changing, this
|
|
|
|
.\" manual page may be incorrect or out-of-date. The author(s) assume no
|
|
|
|
.\" responsibility for errors or omissions, or for damages resulting from
|
|
|
|
.\" the use of the information contained herein. The author(s) may not
|
|
|
|
.\" have taken the same level of care in the production of this manual,
|
|
|
|
.\" which is licensed free of charge, as they might when working
|
|
|
|
.\" professionally.
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2004-11-03 13:51:07 +00:00
|
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
|
|
.\"
|
|
|
|
.\" Modified by Michael Haardt <michael@moria.de>
|
|
|
|
.\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
|
|
|
|
.\" Modified 1995-05-18 by Todd Larason <jtl@molehill.org>
|
|
|
|
.\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
|
|
|
|
.\" Modified 1995-01-09 by Richard Kettlewell <richard@greenend.org.uk>
|
|
|
|
.\" Modified 1998-05-13 by Michael Haardt <michael@cantor.informatik.rwth-aachen.de>
|
|
|
|
.\" Modified 1999-07-06 by aeb & Albert Cahalan
|
|
|
|
.\" Modified 2000-01-07 by aeb
|
2004-11-03 14:43:40 +00:00
|
|
|
.\" Modified 2004-06-23 by Michael Kerrisk <mtk-manpages@gmx.net>
|
2007-05-28 11:43:03 +00:00
|
|
|
.\" 2007-06-08 mtk: Added example program
|
2007-06-27 05:46:29 +00:00
|
|
|
.\" 2007-07-05 mtk: Added details on underlying system call interfaces
|
2007-04-12 22:42:49 +00:00
|
|
|
.\"
|
2007-06-27 05:46:29 +00:00
|
|
|
.TH STAT 2 2007-07-05 "Linux" "Linux Programmer's Manual"
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH NAME
|
|
|
|
stat, fstat, lstat \- get file status
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B #include <sys/types.h>
|
|
|
|
.br
|
|
|
|
.B #include <sys/stat.h>
|
|
|
|
.br
|
|
|
|
.B #include <unistd.h>
|
|
|
|
.sp
|
2005-07-18 13:54:59 +00:00
|
|
|
.BI "int stat(const char *" path ", struct stat *" buf );
|
2004-11-03 13:51:07 +00:00
|
|
|
.br
|
|
|
|
.BI "int fstat(int " filedes ", struct stat *" buf );
|
|
|
|
.br
|
2005-07-18 13:54:59 +00:00
|
|
|
.BI "int lstat(const char *" path ", struct stat *" buf );
|
2007-07-07 18:51:10 +00:00
|
|
|
.sp
|
|
|
|
.in -4n
|
|
|
|
Feature Test Macro Requirements for glibc (see
|
|
|
|
.BR feature_test_macros (7)):
|
|
|
|
.in
|
|
|
|
.sp
|
|
|
|
.BR lstat ():
|
|
|
|
_BSD_SOURCE || _XOPEN_SOURCE >= 500
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH DESCRIPTION
|
|
|
|
.PP
|
2005-07-18 13:54:59 +00:00
|
|
|
These functions return information about a file.
|
|
|
|
No permissions are required on the file itself, but \(em in the case of
|
|
|
|
.BR stat ()
|
2007-04-12 22:42:49 +00:00
|
|
|
and
|
2005-07-18 13:54:59 +00:00
|
|
|
.BR lstat ()
|
|
|
|
\(em
|
|
|
|
execute (search) permission is required on all of the directories in
|
|
|
|
.I path
|
|
|
|
that lead to the file.
|
2004-11-03 13:51:07 +00:00
|
|
|
.PP
|
2005-07-18 13:54:59 +00:00
|
|
|
.BR stat ()
|
2007-04-12 22:42:49 +00:00
|
|
|
stats the file pointed to by
|
2005-07-18 13:54:59 +00:00
|
|
|
.I path
|
2004-11-03 13:51:07 +00:00
|
|
|
and fills in
|
|
|
|
.IR buf .
|
|
|
|
|
2005-07-18 13:54:59 +00:00
|
|
|
.BR lstat ()
|
2004-11-03 13:51:07 +00:00
|
|
|
is identical to
|
2005-07-18 13:54:59 +00:00
|
|
|
.BR stat (),
|
|
|
|
except that if
|
|
|
|
.I path
|
|
|
|
is a symbolic link, then the link itself is stat-ed,
|
2004-11-03 13:51:07 +00:00
|
|
|
not the file that it refers to.
|
|
|
|
|
2005-07-18 13:54:59 +00:00
|
|
|
.BR fstat ()
|
2004-11-03 13:51:07 +00:00
|
|
|
is identical to
|
2005-07-18 13:54:59 +00:00
|
|
|
.BR stat (),
|
|
|
|
except that the file to be stat-ed is specified by the file descriptor
|
|
|
|
.IR filedes .
|
2004-11-03 13:51:07 +00:00
|
|
|
.PP
|
2005-07-18 13:54:59 +00:00
|
|
|
All of these system calls return a
|
2004-11-03 13:51:07 +00:00
|
|
|
.I stat
|
|
|
|
structure, which contains the following fields:
|
|
|
|
.PP
|
2005-06-22 08:16:22 +00:00
|
|
|
.RS 0.25i
|
2004-11-03 13:51:07 +00:00
|
|
|
.nf
|
|
|
|
struct stat {
|
2005-07-18 13:54:59 +00:00
|
|
|
dev_t st_dev; /* ID of device containing file */
|
|
|
|
ino_t st_ino; /* inode number */
|
2005-06-22 08:16:22 +00:00
|
|
|
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 */
|
2005-07-18 13:54:59 +00:00
|
|
|
dev_t st_rdev; /* device ID (if special file) */
|
2005-06-22 08:16:22 +00:00
|
|
|
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 */
|
2004-11-03 13:51:07 +00:00
|
|
|
};
|
|
|
|
.fi
|
|
|
|
.RE
|
|
|
|
.PP
|
2005-07-18 13:54:59 +00:00
|
|
|
The
|
2005-07-25 09:55:44 +00:00
|
|
|
.I st_dev
|
2005-07-18 13:54:59 +00:00
|
|
|
field describes the device on which this file resides.
|
|
|
|
|
|
|
|
The
|
|
|
|
.I st_rdev
|
|
|
|
field describes the device that this file (inode) represents.
|
|
|
|
|
|
|
|
The
|
2004-11-03 13:51:07 +00:00
|
|
|
.I st_size
|
2007-04-12 22:42:49 +00:00
|
|
|
field gives the size of the file (if it is a regular
|
|
|
|
file or a symbolic link) in bytes.
|
2005-07-18 13:54:59 +00:00
|
|
|
The size of a symlink is the length of the pathname
|
2006-01-13 02:09:44 +00:00
|
|
|
it contains, without a trailing null byte.
|
2004-11-03 13:51:07 +00:00
|
|
|
|
2005-07-18 13:54:59 +00:00
|
|
|
The
|
2004-11-03 13:51:07 +00:00
|
|
|
.I st_blocks
|
2005-07-19 14:20:38 +00:00
|
|
|
field indicates the number of blocks allocated to the file, 512-byte units.
|
2004-11-03 13:51:07 +00:00
|
|
|
(This may be smaller than
|
2007-06-23 08:19:17 +00:00
|
|
|
.IR st_size /512
|
|
|
|
when the file has holes.)
|
2005-07-18 13:54:59 +00:00
|
|
|
|
|
|
|
The
|
2004-11-03 13:51:07 +00:00
|
|
|
.IR st_blksize
|
2005-07-18 13:54:59 +00:00
|
|
|
field gives the "preferred" blocksize for efficient file system I/O.
|
2004-11-03 13:51:07 +00:00
|
|
|
(Writing to a file in smaller chunks may cause
|
|
|
|
an inefficient read-modify-rewrite.)
|
|
|
|
.PP
|
|
|
|
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
|
|
|
|
.I st_atime
|
2007-04-12 22:42:49 +00:00
|
|
|
field.
|
|
|
|
(See `noatime' in
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR mount (8).)
|
|
|
|
|
|
|
|
The field
|
|
|
|
.I st_atime
|
2007-06-08 11:56:22 +00:00
|
|
|
is changed by file accesses, for example, by
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR execve (2),
|
|
|
|
.BR mknod (2),
|
|
|
|
.BR pipe (2),
|
|
|
|
.BR utime (2)
|
|
|
|
and
|
|
|
|
.BR read (2)
|
2007-05-12 12:58:31 +00:00
|
|
|
(of more than zero bytes).
|
|
|
|
Other routines, like
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR mmap (2),
|
|
|
|
may or may not update
|
|
|
|
.IR st_atime .
|
|
|
|
|
|
|
|
The field
|
|
|
|
.I st_mtime
|
2007-06-08 11:56:22 +00:00
|
|
|
is changed by file modifications, for example, by
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR mknod (2),
|
|
|
|
.BR truncate (2),
|
|
|
|
.BR utime (2)
|
|
|
|
and
|
|
|
|
.BR write (2)
|
|
|
|
(of more than zero bytes).
|
|
|
|
Moreover,
|
|
|
|
.I st_mtime
|
|
|
|
of a directory is changed by the creation or deletion of files
|
|
|
|
in that directory.
|
|
|
|
The
|
|
|
|
.I st_mtime
|
|
|
|
field is
|
|
|
|
.I not
|
|
|
|
changed for changes in owner, group, hard link count, or mode.
|
|
|
|
|
|
|
|
The field
|
|
|
|
.I st_ctime
|
|
|
|
is changed by writing or by setting inode information
|
|
|
|
(i.e., owner, group, link count, mode, etc.).
|
|
|
|
.PP
|
2004-12-16 14:45:45 +00:00
|
|
|
The following POSIX macros are defined to check the file type using the
|
|
|
|
.I st_mode
|
|
|
|
field:
|
2004-11-03 13:51:07 +00:00
|
|
|
.RS
|
|
|
|
.TP 1.2i
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISREG (m)
|
2004-11-03 13:51:07 +00:00
|
|
|
is it a regular file?
|
|
|
|
.TP
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISDIR (m)
|
2004-11-03 13:51:07 +00:00
|
|
|
directory?
|
|
|
|
.TP
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISCHR (m)
|
2004-11-03 13:51:07 +00:00
|
|
|
character device?
|
|
|
|
.TP
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISBLK (m)
|
2004-11-03 13:51:07 +00:00
|
|
|
block device?
|
|
|
|
.TP
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISFIFO (m)
|
2005-07-18 13:54:59 +00:00
|
|
|
FIFO (named pipe)?
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISLNK (m)
|
2004-11-03 13:51:07 +00:00
|
|
|
symbolic link? (Not in POSIX.1-1996.)
|
|
|
|
.TP
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISSOCK (m)
|
2004-11-03 13:51:07 +00:00
|
|
|
socket? (Not in POSIX.1-1996.)
|
|
|
|
.RE
|
|
|
|
.PP
|
|
|
|
The following flags are defined for the
|
|
|
|
.I st_mode
|
|
|
|
field:
|
2007-06-23 07:05:05 +00:00
|
|
|
.RS
|
2004-11-03 13:51:07 +00:00
|
|
|
.TS
|
2007-06-23 07:05:05 +00:00
|
|
|
lB l l.
|
2007-07-01 04:23:34 +00:00
|
|
|
S_IFMT 0170000 bit mask for the file type bit fields
|
2004-11-03 13:51:07 +00:00
|
|
|
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
|
2005-07-18 13:54:59 +00:00
|
|
|
S_IFIFO 0010000 FIFO
|
2004-11-03 13:51:07 +00:00
|
|
|
S_ISUID 0004000 set UID bit
|
2005-07-18 13:54:59 +00:00
|
|
|
S_ISGID 0002000 set-group-ID bit (see below)
|
2004-11-03 13:51:07 +00:00
|
|
|
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
|
2005-04-18 13:35:29 +00:00
|
|
|
S_IWOTH 00002 others have write permission
|
2004-11-03 13:51:07 +00:00
|
|
|
S_IXOTH 00001 others have execute permission
|
|
|
|
.TE
|
2007-06-23 07:05:05 +00:00
|
|
|
.RE
|
2004-11-03 13:51:07 +00:00
|
|
|
.P
|
2007-06-22 19:42:52 +00:00
|
|
|
The set-group-ID bit
|
|
|
|
.RB ( S_ISGID )
|
|
|
|
has several special uses.
|
2004-11-03 13:51:07 +00:00
|
|
|
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,
|
2007-06-22 19:42:52 +00:00
|
|
|
and directories created there will also get the
|
|
|
|
.B S_ISGID
|
|
|
|
bit set.
|
2007-06-23 07:19:07 +00:00
|
|
|
For a file that does not have the group execution bit
|
2007-06-22 19:42:52 +00:00
|
|
|
.RB ( S_IXGRP )
|
|
|
|
set,
|
2005-07-18 13:54:59 +00:00
|
|
|
the set-group-ID bit indicates mandatory file/record locking.
|
2004-11-03 13:51:07 +00:00
|
|
|
.P
|
2007-06-22 19:42:52 +00:00
|
|
|
The `sticky' bit
|
|
|
|
.RB ( S_ISVTX )
|
|
|
|
on a directory means that a file
|
2004-11-03 13:51:07 +00:00
|
|
|
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.
|
|
|
|
.SH "RETURN VALUE"
|
2007-04-12 22:42:49 +00:00
|
|
|
On success, zero is returned.
|
|
|
|
On error, \-1 is returned, and
|
2004-11-03 13:51:07 +00:00
|
|
|
.I errno
|
|
|
|
is set appropriately.
|
|
|
|
.SH ERRORS
|
|
|
|
.TP
|
|
|
|
.B EACCES
|
|
|
|
Search permission is denied for one of the directories
|
|
|
|
in the path prefix of
|
2005-07-18 13:54:59 +00:00
|
|
|
.IR path .
|
2004-11-03 13:51:07 +00:00
|
|
|
(See also
|
2007-05-26 12:41:39 +00:00
|
|
|
.BR path_resolution (7).)
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B EBADF
|
|
|
|
.I filedes
|
|
|
|
is bad.
|
|
|
|
.TP
|
|
|
|
.B EFAULT
|
|
|
|
Bad address.
|
|
|
|
.TP
|
|
|
|
.B ELOOP
|
|
|
|
Too many symbolic links encountered while traversing the path.
|
|
|
|
.TP
|
|
|
|
.B ENAMETOOLONG
|
|
|
|
File name too long.
|
|
|
|
.TP
|
|
|
|
.B ENOENT
|
|
|
|
A component of the path
|
2005-07-18 13:54:59 +00:00
|
|
|
.I path
|
2004-11-03 13:51:07 +00:00
|
|
|
does not exist, or the path is an empty string.
|
|
|
|
.TP
|
|
|
|
.B ENOMEM
|
2007-06-08 11:56:22 +00:00
|
|
|
Out of memory (i.e., kernel memory).
|
2004-11-03 13:51:07 +00:00
|
|
|
.TP
|
|
|
|
.B ENOTDIR
|
|
|
|
A component of the path is not a directory.
|
|
|
|
.SH "CONFORMING TO"
|
2006-08-04 12:39:17 +00:00
|
|
|
These system calls conform to SVr4, 4.3BSD, POSIX.1-2001.
|
2006-08-03 13:57:17 +00:00
|
|
|
.\" SVr4 documents additional
|
|
|
|
.\" .BR fstat ()
|
|
|
|
.\" error conditions EINTR, ENOLINK, and EOVERFLOW. SVr4
|
|
|
|
.\" documents additional
|
|
|
|
.\" .BR stat ()
|
|
|
|
.\" and
|
|
|
|
.\" .BR lstat ()
|
|
|
|
.\" error conditions EINTR, EMULTIHOP, ENOLINK, and EOVERFLOW.
|
|
|
|
|
2004-11-03 13:51:07 +00:00
|
|
|
Use of the
|
|
|
|
.I st_blocks
|
|
|
|
and
|
|
|
|
.I st_blksize
|
2007-04-12 22:42:49 +00:00
|
|
|
fields 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.)
|
2004-11-03 13:51:07 +00:00
|
|
|
.LP
|
2007-06-23 07:05:05 +00:00
|
|
|
POSIX does not describe the
|
2007-06-23 07:19:07 +00:00
|
|
|
.BR S_IFMT ,
|
|
|
|
.BR S_IFSOCK ,
|
|
|
|
.BR S_IFLNK ,
|
|
|
|
.BR S_IFREG ,
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_IFBLK ,
|
2007-06-23 07:19:07 +00:00
|
|
|
.BR S_IFDIR ,
|
|
|
|
.BR S_IFCHR ,
|
|
|
|
.BR S_IFIFO ,
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISVTX
|
|
|
|
bits, but instead demands the use of
|
|
|
|
the macros
|
|
|
|
.BR S_ISDIR (),
|
|
|
|
etc.
|
2007-06-22 18:25:23 +00:00
|
|
|
The
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISLNK ()
|
2007-06-22 18:25:23 +00:00
|
|
|
and
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_ISSOCK ()
|
2007-06-22 18:25:23 +00:00
|
|
|
macros are not in
|
2006-08-03 13:57:17 +00:00
|
|
|
POSIX.1-1996, but both are present in POSIX.1-2001;
|
|
|
|
the former is from SVID 4, the latter from SUSv2.
|
2004-11-03 13:51:07 +00:00
|
|
|
.LP
|
2007-06-23 07:19:07 +00:00
|
|
|
Unix V7 (and later systems) had
|
|
|
|
.BR S_IREAD ,
|
|
|
|
.BR S_IWRITE ,
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_IEXEC ,
|
|
|
|
where POSIX
|
2007-06-23 07:19:07 +00:00
|
|
|
prescribes the synonyms
|
|
|
|
.BR S_IRUSR ,
|
|
|
|
.BR S_IWUSR ,
|
2007-06-23 07:05:05 +00:00
|
|
|
.BR S_IXUSR .
|
2007-05-15 20:53:59 +00:00
|
|
|
.SS "Other Systems"
|
2004-11-03 13:51:07 +00:00
|
|
|
Values that have been (or are) in use on various systems:
|
|
|
|
.TS
|
|
|
|
l l l l l.
|
|
|
|
hex name ls octal description
|
|
|
|
f000 S_IFMT 170000 mask for file type
|
|
|
|
0000 000000 SCO out-of-service inode, BSD unknown type
|
2007-06-23 07:05:05 +00:00
|
|
|
SVID-v2 and XPG2 have both 0 and 0100000
|
|
|
|
for ordinary file
|
2005-07-18 13:54:59 +00:00
|
|
|
1000 S_IFIFO p| 010000 FIFO (named pipe)
|
2004-11-03 13:51:07 +00:00
|
|
|
2000 S_IFCHR c 020000 character special (V7)
|
|
|
|
3000 S_IFMPC 030000 multiplexed character special (V7)
|
|
|
|
4000 S_IFDIR d/ 040000 directory (V7)
|
|
|
|
5000 S_IFNAM 050000 XENIX named special file
|
2007-06-23 07:05:05 +00:00
|
|
|
with two subtypes, distinguished by \fIst_rdev\fP values 1, 2
|
2004-11-03 13:51:07 +00:00
|
|
|
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 070000 multiplexed block special (V7)
|
|
|
|
8000 S_IFREG - 100000 regular (V7)
|
|
|
|
9000 S_IFCMP 110000 VxFS compressed
|
|
|
|
9000 S_IFNWK n 110000 network special (HP-UX)
|
|
|
|
a000 S_IFLNK l@ 120000 symbolic link (BSD)
|
|
|
|
b000 S_IFSHAD 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 001000 `sticky bit': save swapped text even after use (V7)
|
|
|
|
reserved (SVID-v2)
|
|
|
|
On non-directories: don't cache this file (SunOS)
|
|
|
|
On directories: restricted deletion flag (SVID-v4.2)
|
2005-07-18 16:09:29 +00:00
|
|
|
0400 S_ISGID 002000 set-group-ID on execution (V7)
|
2007-06-23 07:05:05 +00:00
|
|
|
for directories: use BSD semantics for
|
|
|
|
propagation of GID
|
2005-07-18 13:54:59 +00:00
|
|
|
0400 S_ENFMT 002000 SysV file locking enforcement (shared with S_ISGID)
|
|
|
|
0800 S_ISUID 004000 set-user-ID on execution (V7)
|
2004-11-03 13:51:07 +00:00
|
|
|
0800 S_CDF 004000 directory is a context dependent file (HP-UX)
|
|
|
|
.TE
|
|
|
|
|
|
|
|
A sticky command appeared in Version 32V AT&T UNIX.
|
2007-05-19 04:30:20 +00:00
|
|
|
.SH NOTES
|
|
|
|
.SS Linux Notes
|
|
|
|
Since kernel 2.5.48, the
|
|
|
|
.I stat
|
|
|
|
structure supports nanosecond resolution for the three
|
|
|
|
file timestamp fields.
|
|
|
|
Glibc exposes the nanosecond component of each field using names either
|
|
|
|
of the form
|
|
|
|
.IR st_atim.tv_nsec ,
|
2007-06-22 17:48:59 +00:00
|
|
|
if the
|
|
|
|
.B _BSD_SOURCE
|
|
|
|
or
|
|
|
|
.B _SVID_SOURCE
|
|
|
|
feature test macro is defined,
|
2007-05-19 04:30:20 +00:00
|
|
|
or of the form
|
|
|
|
.IR st_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
|
|
|
|
.I /proc
|
|
|
|
directory,
|
|
|
|
.BR stat ()
|
|
|
|
does not return the file size in the
|
|
|
|
.I st_size
|
|
|
|
field; instead the field is returned with the value 0.
|
2007-06-27 05:12:36 +00:00
|
|
|
.SS Underlying kernel interface
|
|
|
|
Over time, increases in the size of the
|
|
|
|
.I stat
|
|
|
|
structure have led to three successive implementations of
|
|
|
|
.BR stat ():
|
|
|
|
.IR sys_stat ()
|
|
|
|
(slot
|
|
|
|
.IR __NR_oldstat ),
|
|
|
|
.IR sys_newstat ()
|
|
|
|
(slot
|
|
|
|
.IR __NR_stat ),
|
|
|
|
and
|
|
|
|
.IR sys_stat64()
|
|
|
|
(new in kernel 2.4; slot
|
2007-06-27 05:29:59 +00:00
|
|
|
.IR __NR_stat64 ).
|
|
|
|
The last of these is the most current,
|
|
|
|
but the other interfaces must be maintained so that the
|
|
|
|
behavior of old binaries does not change.
|
|
|
|
The glibc
|
2007-06-27 05:12:36 +00:00
|
|
|
.BR stat ()
|
2007-06-27 05:29:59 +00:00
|
|
|
wrapper function hides these details from applications,
|
2007-06-27 06:06:53 +00:00
|
|
|
ensuring that new applications linked against
|
|
|
|
the current library automatically use the current implementation,
|
|
|
|
and that binary compatibility is not broken for older binaries.
|
2007-06-27 05:12:36 +00:00
|
|
|
Similar remarks apply for
|
|
|
|
.BR fstat (2)
|
|
|
|
and
|
|
|
|
.BR lstat (2).
|
2007-07-07 18:51:10 +00:00
|
|
|
.\"
|
|
|
|
.\" A note from Andries Brouwer, July 2007
|
|
|
|
.\"
|
|
|
|
.\" > Is the story not rather more complicated for some calls like
|
|
|
|
.\" > stat(2)?
|
|
|
|
.\"
|
|
|
|
.\" Yes and no, mostly no. See /usr/include/sys/stat.h .
|
|
|
|
.\"
|
|
|
|
.\" The idea is here not so much that syscalls change, but that
|
|
|
|
.\" the definitions of struct stat and of the types dev_t and mode_t change.
|
|
|
|
.\" This means that libc (even if it does not call the kernel
|
|
|
|
.\" but only calls some internal function) must know what the
|
|
|
|
.\" format of dev_t or of struct stat is.
|
|
|
|
.\" The communication between the application and libc goes via
|
|
|
|
.\" the include file <sys/stat.h> that defines a _STAT_VER and
|
|
|
|
.\" _MKNOD_VER describing the layout of the data that user space
|
|
|
|
.\" uses. Each (almost each) occurrence of stat() is replaced by
|
|
|
|
.\" an occurrence of xstat() where the first parameter of xstat()
|
|
|
|
.\" is this version number _STAT_VER.
|
|
|
|
.\"
|
|
|
|
.\" Now, also the definitions used by the kernel change.
|
|
|
|
.\" But glibc copes with this in the standard way, and the
|
|
|
|
.\" struct stat as returned by the kernel is repacked into
|
|
|
|
.\" the struct stat as expected by the application.
|
|
|
|
.\" Thus, _STAT_VER and this setup cater for the application-libc
|
|
|
|
.\" interface, rather than the libc-kernel interface.
|
|
|
|
.\"
|
|
|
|
.\" (Note that the details depend on gcc being used as c compiler.)
|
2007-05-28 11:43:03 +00:00
|
|
|
.SH EXAMPLE
|
2007-06-21 22:55:04 +00:00
|
|
|
The following program calls
|
2007-05-28 11:43:03 +00:00
|
|
|
.BR stat (2)
|
|
|
|
and displays selected fields in the returned
|
|
|
|
.I stat
|
|
|
|
structure.
|
|
|
|
.nf
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <time.h>
|
|
|
|
#include <stdio.h>
|
2007-06-21 22:55:04 +00:00
|
|
|
#include <stdlib.h>
|
2007-05-28 11:43:03 +00:00
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
struct stat sb;
|
|
|
|
|
|
|
|
if (argc != 2) {
|
|
|
|
fprintf(stderr, "Usage: %s <pathname>\\n", argv[0]);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
2007-06-20 21:39:45 +00:00
|
|
|
if (stat(argv[1], &sb) == \-1) {
|
2007-05-28 11:43:03 +00:00
|
|
|
perror("stat");
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("File type: ");
|
|
|
|
switch (sb.st_mode & S_IFMT) {
|
|
|
|
case S_IFBLK: printf("block device\\n"); break;
|
|
|
|
case S_IFCHR: printf("character device\\n"); break;
|
|
|
|
case S_IFDIR: printf("directory\\n"); break;
|
|
|
|
case S_IFIFO: printf("FIFO/pipe\\n"); break;
|
|
|
|
case S_IFLNK: printf("symlink\\n"); break;
|
|
|
|
case S_IFREG: printf("regular file\\n"); break;
|
|
|
|
case S_IFSOCK: printf("socket\\n"); break;
|
|
|
|
default: printf("unknown?\\n"); break;
|
|
|
|
}
|
|
|
|
|
2007-06-20 21:39:45 +00:00
|
|
|
printf("I\-node number: %ld\\n", (long) sb.st_ino);
|
2007-05-28 11:43:03 +00:00
|
|
|
|
2007-06-21 22:55:04 +00:00
|
|
|
printf("Mode: %lo (octal)\\n",
|
2007-05-28 11:43:03 +00:00
|
|
|
(unsigned long) sb.st_mode);
|
|
|
|
|
|
|
|
printf("Link count: %ld\\n", (long) sb.st_nlink);
|
|
|
|
printf("Ownership: UID=%ld GID=%ld\\n",
|
|
|
|
(long) sb.st_uid, (long) sb.st_gid);
|
|
|
|
|
2007-06-21 22:55:04 +00:00
|
|
|
printf("Preferred I/O block size: %ld bytes\\n",
|
2007-05-28 11:43:03 +00:00
|
|
|
(long) sb.st_blksize);
|
2007-06-21 22:55:04 +00:00
|
|
|
printf("File size: %lld bytes\\n",
|
2007-05-28 11:43:03 +00:00
|
|
|
(long long) sb.st_size);
|
2007-06-21 22:55:04 +00:00
|
|
|
printf("Blocks allocated: %lld\\n",
|
2007-05-28 11:43:03 +00:00
|
|
|
(long long) sb.st_blocks);
|
|
|
|
|
2007-06-11 19:23:43 +00:00
|
|
|
printf("Last inode change: %s", ctime(&sb.st_ctime));
|
2007-05-28 11:43:03 +00:00
|
|
|
printf("Last file access: %s", ctime(&sb.st_atime));
|
|
|
|
printf("Last file modification: %s", ctime(&sb.st_mtime));
|
|
|
|
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
.fi
|
2004-11-03 13:51:07 +00:00
|
|
|
.SH "SEE ALSO"
|
2006-05-29 05:00:05 +00:00
|
|
|
.BR access (2),
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR chmod (2),
|
|
|
|
.BR chown (2),
|
2006-04-21 22:39:00 +00:00
|
|
|
.BR fstatat (2),
|
2004-11-03 13:51:07 +00:00
|
|
|
.BR readlink (2),
|
|
|
|
.BR utime (2),
|
|
|
|
.BR capabilities (7)
|