Everything is a file

Everything is a file describes one of the defining features of Unix, and its derivatives—that a wide range of input/output resources such as documents, directories, hard-drives, modems, keyboards, printers and even some inter-process and network communications are simple streams of bytes exposed through the filesystem name space.[1]

The advantage of this approach is that the same set of tools, utilities and APIs can be used on a wide range of resources. There are a number of file types. When a file is opened, a file descriptor is created. The file path becoming the addressing system and the file descriptor being the byte stream I/O interface. But file descriptors are also created for things like anonymous pipes and network sockets via different methods. Therefore a more accurate description of this feature is Everything is a file descriptor.[2][3]

Additionally, a range of pseudo and virtual filesystems exists which exposes information about processes and other system information in a hierarchical file-like structure. These are mounted into the single file hierarchy.

An example of this purely virtual filesystem is under /proc that exposes many system properties as files. All of these files, in the broader sense of the word, have standard Unix file attributes such as an owner and access permissions, and can be queried by the same classic Unix tools and filters. However, this is not universally considered a fast or portable approach. Some operating systems do not even mount /proc by default due to security or speed concerns.[4] It is, though, used heavily by both the widely installed BusyBox [5] on embedded systems and by procps, which is used on most Linux systems. In both cases it is used in implementations of process-related POSIX shell commands. It is similarly used on Android systems in the operating system's Toolbox program.[6]

Unix's successor Plan 9 took this concept into distributed computing with the 9P protocol.

See alsoEdit


  1. ^ [1] Archived January 10, 2015, at the Wayback Machine
  2. ^ "Linus Torvalds - "everything is a file descriptor or a process"". Yarchive.net. Retrieved 2015-08-28. CS1 maint: discouraged parameter (link)
  3. ^ "Ghosts of Unix Past". Lwn.net. Retrieved 2015-08-28. CS1 maint: discouraged parameter (link)
  4. ^ "8. procfs: Gone But Not Forgotten". Freebsd.org. Retrieved 2015-08-28. CS1 maint: discouraged parameter (link)
  5. ^ "busybox - BusyBox: The Swiss Army Knife of Embedded Linux". Git.busybox.net. Retrieved 2015-08-28. CS1 maint: discouraged parameter (link)
  6. ^ "platform_system_core/ps.c at master · android/platform_system_core · GitHub". Github.com. 2015-03-09. Retrieved 2015-08-28. CS1 maint: discouraged parameter (link)