Unix file types

Short description: File types in Unix operating systems

The seven standard Unix file types are regular, directory, symbolic link, FIFO special, block special, character special, and socket as defined by POSIX.[1] These types are implemented in the file systems of Unix and Unix-like operating systems (OSs). Different OS-specific implementations allow more types than what POSIX requires (e.g. doors in Solaris).[citation needed] A file's type can be identified by the `ls -l` command, which displays the type in the first character of the file-system permissions field.

For regular files, Unix does not impose or provide any internal file structure (this may be called file format);[2] therefore, their structure and interpretation is entirely dependent on the software using them.[3] However, the `file` command can usually be used to determine what type of data they contain.[4]

## Contents

* 1 Representations
* 1.1 Numeric
* 1.2 Symbolic
* 2 Examples
* 3 References

## Representations

### Numeric

The type of a file is specified by the file's mode, which consists of the file type and access permissions. The stat() system call returns information about a file in a `stat` structure that includes the file mode in a field named `st_mode`. The file types and access permissions are typically defined as macros that expand to octal integer literals, and the `st_mode` field of the `stat` structure is typically defined as an unsigned integer variable, which normally has a size of 32 bits, although the C language standard allows it to be implementation-specific. However, commonly on Unix-like systems, only 16 bits (6 octal digits) of the `st_mode` field are used by the octal integer literals that represent different file types and access permissions, where the most significant 4 bits (2 octal digits) are used for the file type, and the remaining 12 bits for the access permissions, which consist of the higher-order 3 bits (1 octal digit) that are used for the setuid, setgid, and sticky attributes, which are commonly referred to as the special permissions, followed by the 9 bits (3 octal digits) that are used for the normal permissions. POSIX specifies the 12 least significant bits of a file's mode to be access permissions, and leaves the file type bits to be an 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.[5]

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]

### Symbolic

POSIX specifies the long format of the `ls` command to represent the Unix file type as the first letter for an entry.[6]

Unix file type indicators  type | symbol

|

regular | \-
directory | d
symbolic link | l
FIFO special | p
block special | b
character special | c
socket | s

The GNU coreutils version of `ls` calls the gnulib function `filemode()`[7] to format the mode string. FreeBSD uses a simpler approach but allows a smaller number of file types.[8]

## Examples

The command `ls -l` reports the file mode string as the first column of output for each file. This string starts with the Unix file type indicator. The following output is for the root directory, from the command `ls -l /`, which starts with `d` to indicate that it is a directory. The rest of the first column (`rwxr-xr-x`) indicates permissions.

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:[6]

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:[6]

prw-rw
- ... mypipe

A socket filepath is a type of Unix domain socket, 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:[6]

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:[6]

crw-rw-rw- ... /dev/null
brw-rw
- ... /dev/sda

## References

1. ↑ 1.0 1.1 1.2 "<sys/stat.h>". The Open Group. 14 June 2024. http://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_stat.h.html.
2. ↑ e.g. MW; MKD; Kaufman, Lar (October 2002). "Compressing Files to Save Space". Unix Power Tools (3 ed.). O'Reilly. p. 408. ISBN 9780596003302. "many audio and graphics file formats (such as MP3 and JPEG) are already well compressed"
3. ↑ 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"
4. ↑ "`file`". IEEE Std 1003.1-2017 (POSIX). The Open Group. 2018. https://pubs.opengroup.org/onlinepubs/9699919799/utilities/file.html.
5. ↑ Kitt, Stephen. "What file mode is a symlink?". https://unix.stackexchange.com/a/193468.
6. ↑ 6.0 6.1 6.2 6.3 6.4 "`ls`". IEEE Std 1003.1-2008 (POSIX). The Open Group. 11 March 2017. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html.
7. ↑ "filemode function in GNU coreutils". GNU. 11 March 2017. https://github.com/coreutils/gnulib/blob/master/lib/filemode.c.
8. ↑ "printtype function from FreeBSD". FreeBSD. 11 March 2017. https://github.com/freebsd/freebsd/blob/8e401abc421060406354c05d494b887f91849b6d/bin/ls/print.c#L557.

0.00

(0 votes)

Original source: https://en.wikipedia.org/wiki/Unix file types. Read more

|

Retrieved from "https://handwiki.org/wiki/index.php?title=Unix_file_types&oldid=4152208"