The file mode, stored in the st_mode
field of the file attributes,
contains two kinds of information: the file type code, and the access permission bits. This section discusses only the type code, which you can use to tell whether the file is a directory, socket, symbolic link, and so on.
For details about access permissions seePermission Bits.
There are two ways you can access the file type information in a file mode. Firstly, for each file type there is a predicate macro which examines a given file mode and
returns whether it is of that type or not. Secondly, you can mask out the rest of the file mode to leave just the file type code, and compare this against constants for each of the supported file types.
All of the symbols listed in this section are defined in the header file sys/stat.h. The following
predicate macros test the type of a file, given the value m which is thest_mode
field returned by stat
on that file:
This macro returns non-zero if the file is a character special file (a device like a terminal).
This macro returns non-zero if the file is a block special file (a device like a disk).
This macro returns non-zero if the file is a FIFO special file, or a pipe. See Pipes and FIFOs.
This macro returns non-zero if the file is a symbolic link. See Symbolic Links.
This macro returns non-zero if the file is a socket. See Sockets.
An alternate non-POSIX method of testing the file type is supported for compatibility with BSD. The mode can be bitwise AND-ed with S_IFMT
to extract the file type code,
and compared to the appropriate constant. For example,
S_ISCHR (mode)
is equivalent to:
((mode & S_IFMT) == S_IFCHR)
These are the symbolic names for the different file type codes:
S_IFDIR
- This is the file type constant of a directory file.
S_IFCHR
- This is the file type constant of a character-oriented device file.
S_IFBLK
- This is the file type constant of a block-oriented device file.
S_IFREG
- This is the file type constant of a regular file.
S_IFLNK
- This is the file type constant of a symbolic link.
S_IFSOCK
- This is the file type constant of a socket.
S_IFIFO
-
This is the file type constant of a FIFO or pipe.
First:
#include "apue.h" #include "my_err.h" int main(int argc, char* argv[]) { int i; struct stat buf; char *ptr; for ( i = 1; i < argc; i++ ) { printf("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0 ) { err_ret("lstat error", argv[i]); continue; } if ( S_ISREG(buf.st_mode) ) ptr = "regular"; else if ( S_ISDIR(buf.st_mode) ) ptr = "direcotry"; else if ( S_ISCHR(buf.st_mode) ) ptr = "character special"; else if ( S_ISBLK(buf.st_mode) ) ptr = "block special"; else if ( S_ISFIFO(buf.st_mode) ) ptr = "fifo"; else if ( S_ISLNK(buf.st_mode) ) ptr = "symbolic link"; else if ( S_ISSOCK(buf.st_mode) ) ptr = "socket"; else ptr = "** unknow mode **"; printf("%s\n", ptr); } exit(0); }
Second:
#include "apue.h" #include "my_err.h" int main(int argc, char* argv[]) { int i; struct stat buf; char *ptr; for ( i = 1; i < argc; i++ ) { printf("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0 ) { err_ret("lstat error", argv[i]); continue; } switch (buf.st_mode & S_IFMT) { case S_IFREG: ptr = "regular"; break; case S_IFBLK: ptr = "block special"; break; case S_IFCHR: ptr = "character special"; break; case S_IFIFO: ptr = "fifo"; break; case S_IFLNK: ptr = "symbolic link"; break; case S_IFSOCK: ptr = "socket"; break; case S_IFDIR: ptr = "directory"; break; default: ptr = "** unknow **"; } printf("%s\n", ptr); } exit(0); }