Everything is a file

From HandWiki
Short description: UNIX philosophy


"Everything is a file" is an idea that Unix, and its derivatives, handle input/output to and from resources such as documents, hard-drives, modems, keyboards, printers and even some inter-process and network communications as simple streams of bytes exposed through the filesystem name space.[1] Exceptions include semaphores, processes and threads.

The advantage of this approach is that the same set of tools, utilities and APIs can be used on a wide range of resources and a number of file types. When a file is opened, a file descriptor is created, using the file path as an addressing system. The file descriptor is then a byte stream I/O interface on which file operations are performed. File descriptors are also created for objects such as anonymous pipes and network sockets - and 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 internal kernel data, such as information about processes, to user space in a hierarchical file-like structure.[4] 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 mount /proc by default due to security or speed concerns, relying on system calls instead.[5] It is, though, used heavily by Linux shell utilities,[6][7] such as procps ps implementation and the widely installed on embedded systems BusyBox.[8] Android Toolbox program depend on it as well.[9]

See also

References

  1. In UNIX Everything is a File
  2. "Linus Torvalds - 'everything is a file descriptor or a process'". http://yarchive.net/comp/linux/everything_is_file.html. 
  3. "Ghosts of Unix Past". https://lwn.net/Articles/411845/. 
  4. Benvenuti, Christian (2006). "3. User-Space-to-Kernel Interface". Understanding Linux network internals (Nachdr. ed.). Beijing Köln: O'Reilly. p. 58. ISBN 9780596002558. https://www.google.co.uk/books/edition/Understanding_Linux_Network_Internals/ALapr7CvAKkC?hl=en&gbpv=1&dq=pseudo+file+system+system+call&pg=PT82&printsec=frontcover. 
  5. "8. procfs: Gone But Not Forgotten". http://www.freebsd.org/doc/en/articles/linux-users/procfs.html. 
  6. Xiao, Yang; Li, Frank Haizhon; Chen, Hui (2011). Handbook of security and networks. Hackensack (NJ): World scientific. p. 160. ISBN 9789814273039. https://www.google.co.uk/books/edition/Handbook_of_Security_and_Networks/yKj8rUxL9JUC?hl=en&gbpv=1. 
  7. "27. Upgrading and customizing the kernel". Red Hat Linux Networking and System Administration. 2007. p. 662. ISBN 9780471777311. https://www.google.co.uk/books/edition/Red_Hat_Linux_Networking_and_System_Admi/PrepsktXgScC?hl=en&gbpv=1&dq=pseudo+file+system+system+call&pg=PA662&printsec=frontcover. 
  8. "busybox - BusyBox: The Swiss Army Knife of Embedded Linux". http://git.busybox.net/busybox/tree/libbb/procps.c. 
  9. "platform_system_core/ps.c at master · android/platform_system_core · GitHub". 2015-03-09. https://github.com/joneschrisg/android-system-core/blob/master/toolbox/ps.c.