Unix file types
The structure and interpretation thereof is entirely dependent on how the file is interpreted by software.
Unix does however have some special files. These special files can be identified by the
ls -l command which displays the type of the file in the first alphabetic letter of the file system permissions field. A normal (regular) file is indicated by a hyphen-minus '
Take for example one line in the
ls -l output:
drwxr-xr-x 2 root root 0 Jan 1 1970 home
POSIX specifies the format of the output of the long format (
-l option) for every file listed. In particular, the first field (before first space) is dubbed "file mode string" and its first character describes the file type. The rest of this string indicates the file permissions.
Therefore, in the example, the mode string is
drwxr-xr-x: the file type is
d (directory) and the permissions are
ls does is obtaining the
stat structure associated with the file and transforming the
mode_t field into a human-readable format. Note that
mode_t is actually a bit field with two parts: in mask
S_IFMT the file type is stored. It can be tested with some macros like
S_ISDIR (for the
S_IFDIR value with mask
S_IFMT) to get the file type flags.
Examples of implementations
Different OS-specific implementations allow more types than what POSIX requires (e.g. Solaris doors).
FreeBSD uses a simpler approach but allows a smaller amount of file types.
Files are also called "regular files" to distinguish them from "special files". They show up in
ls -l without a specific character in the mode field:
$ ls -l /etc/passwd -rw-r--r-- ... /etc/passwd
The most common special file is the directory. The layout of a directory file is defined by the filesystem used. As several filesystems, both native and non-native, are available under Unix, there is not one directory file layout.
A directory is marked with a
d as the first letter in the mode field in the output of
ls -dl or
$ ls -dl / drwxr-xr-x 26 root root 4096 Sep 22 09:29 / $ stat / File: "/" Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 128 Links: 26 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) ...
A symbolic link is a reference to another file. This special file is stored as a textual representation of the referenced file's path (which means the destination may be a relative path, or may not exist at all).
A symbolic link is marked with an
l (lower case
L) as the first letter of the mode string, e.g.
lrwxrwxrwx ... termcap -> /usr/share/misc/termcap lrwxrwxrwx ... S03xinetd -> ../init.d/xinetd
One of the strengths of Unix has always been inter-process communication. Amongst the facilities provided by the OS are pipes. These pipes connect the output of one process to the input of another. This is fine if both processes are living in the same parent process space, started by the same user. There are however circumstances where the communicating processes must use named pipes. One such circumstance is that the processes have to be executed under different user names and permissions.
These named pipes are special files that can exist anywhere in the file system. These named pipe special files are made with the command
mkfifo as in
A named pipe is marked with a
p as the first letter of the mode string, e.g.
prw-rw---- ... mypipe
A socket is a special file used for inter-process communication. These allow communication between two processes. In addition to sending data, processes can send file descriptors across a Unix domain socket connection using the
Unlike named pipes which allow only unidirectional data flow, sockets are fully duplex-capable.
A socket is marked with an
s as the first letter of the mode string, e.g.
In Unix, almost all things are handled as files and have a location in the file system—even hardware devices like hard drives. The great exception for devices and the files that represent them are network devices that do not turn up in the file system but are handled separately.
Device files are used to apply access rights and to direct operations on the files to the appropriate device drivers.
Unix makes a distinction between character devices and block devices. The distinction is roughly as follows:
- character devices provide only a serial stream of input or output;
- block devices are randomly accessible;
although, for example, disk partitions may have both character devices that provide unbuffered random access to blocks on the partition and block devices that provide buffered random access to blocks on the partition.
A character device is marked with a
c as the first letter of the mode string. Likewise, a block device is marked with a
A door is a special file for inter-process communication between a client and server, currently implemented only in Solaris.
A door is marked with a
D (upper case) as the first letter of the mode string, e.g.
Dr--r--r-- ... name_service_door