Unix file types
The Unix file types are the categories of file formats that a Unix-based system uses to provide context-sensitive behavior of file system items – all of which called files in Unix-based systems. POSIX defines categories: regular, directory, symbolic link, FIFO special, block special, character special, and socket.[1] An operating system may define additional categories (e.g. Solaris doors).
A regular file is any file format that the file system does not know and relies on applications to manipulate.[2] The other categories are for file formats that the file system inherently knows and can manipulate.
The ls -l
command reports a file's category via the character before the permissions field. The file
command reports file format information; even for regular files.[3]
Representations
[edit]Numeric
[edit]The stat() system call reports Unix file type in the st_mode
(mode) bit field of a struct stat
parameter. Generally, the mode field is 16 bits wide with the Unix file type represented in the first 4 bits, setuid, setgid, and sticky in the next 3 bits and then 9 bits for permissions. POSIX only defines the 9 least significant bits for access permissions; leaving the rest as implementation detail.[1]
When written as octal, a mode value shows the Unix file type separately – as the first two digits. For example, mode of octal 100644 indicates a regular file since the Unix file type bit-field is octal 10. This format is used in git, tar, ar, and other contexts.[4]
A program can test a mode value to determine Unix file type via macros provided in standard C headers. For example, a program can mask a mode value with S_IFMT
(octal 170000 for the first 4 bits convention) to obtain the Unix file type and then test that value against S_IFDIR
to determine whether the file is a directory. Alternatively, a program can use the S_ISDIR
macro. S_IFMT
is not a core POSIX concept, but a X/Open System Interfaces (XSI) extension. Systems conforming to only POSIX may use some other methods.[1]
Text
[edit]POSIX specifies the long format of the ls
command to represent the Unix file type as the first letter for an entry.[5]
type | text |
---|---|
regular | - |
directory | d |
symbolic link | l |
FIFO special | p |
block special | b |
character special | c |
socket | s |
Consider example output for command ls -l
:
drwxr-xr-x 2 root root 0 Jan 1 1970 home
The first output field, the file mode string is drwxr-xr-x
. Its first character identifies the Unix file type, here d
for directory. The rest of this string indicates permissions.
The GNU coreutils version of ls
calls the glibc function filemode()
[6] to format the mode string. FreeBSD uses a simpler approach but allows a smaller number of file types.[7]
Examples
[edit]Output for the root directory, command ls -dl /
[5], includes a leading d
to indicate that it's a directory:
drwxr-xr-x 26 root root 4096 Sep 22 09:29 /
Output from command stat /
includes the full Unix file type name:
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) ...
Output for a symbolic link file starts with an initial l
(lower case 'L') and identifies the referenced file path as in this example ls -l
output:[5]
lrwxrwxrwx ... termcap -> /usr/share/misc/termcap lrwxrwxrwx ... S03xinetd -> ../init.d/xinetd
A named pipe is a special file that can be created via the command mkfifo name
. A named pipe is identified as p
as in this example ls -l
output:[5]
prw-rw---- ... mypipe
A socket is a special file for inter-process communication that unlike named pipes allows for full duplex. A socket is marked with s
as in this example ls -l
output:[5]
srwxrwxrwx /tmp/.X11-unix/X0
Block and character files represent hardware devices. A device file can be used to control access to a device and to allow file-like operations on the connected device. A character device (serial access) is marked with a c
and a block device (random access) is marked with a b
as in this example ls -l
output:[5]
crw-rw-rw- ... /dev/null brw-rw---- ... /dev/sda
References
[edit]- ^ a b c "<sys/stat.h>". The Open Group Base Specifications Issue 6. The Open Group. 21 July 2019. Archived from the original on 27 November 2016. Retrieved 10 February 2017.
- ^ Loukides, Mike (October 2002). "When Is a File Not a File?". Unix Power Tools (3 ed.). O'Reilly. p. 80. ISBN 9780596003302.
A file is nothing more than a stream of bytes ...
- ^ "
file
". IEEE Std 1003.1-2017 (POSIX). The Open Group. 2018. Archived from the original on 2018-10-12. Retrieved 2023-10-26. - ^ Kitt, Stephen. "What file mode is a symlink?". Unix & Linux Stack Exchange.
- ^ a b c d e f "
ls
". IEEE Std 1003.1-2008 (POSIX). The Open Group. 11 March 2017. Archived from the original on 3 August 2017. Retrieved 10 February 2017. - ^ "filemode function in GNU coreutils". GNU. 11 March 2017.
- ^ "printtype function from FreeBSD". FreeBSD. 11 March 2017.