3.2 File Descriptors
To the kernel all open files are referred to by file descriptors. A file descriptor is a nonnegative integer. When we open an existing file or create a new file, the kernel returns a file descriptor to the process. When we want to read or write a file, we identify the file with the file descriptor that was returned by open or creat as an argument to either read or write.
By convention the Unix shells associate file descriptor 0 with the standard input of a process, file descriptor 1 with the standard output, and file descriptor 2 with the standard error. This is a convention employed by the Unix shells and many Unix applications—it is not a feature of the kernel. Nevertheless, many Unix applications would break if these associations weren't followed.
The magic numbers 0, 1, and 2 should be replaced in POSIX.1 applications with the symbolic constants STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO. These are defined in the <unistd.h> header.
File descriptors range from 0 through OPEN_MAX. (Recall Figure 2.7.) Older versions of Unix had an upper limit of 19 (allowing a maximum of 20 open files per process) but this was increased to 63 by many systems.
With SVR4 and 4.3+BSD the limit is essentially infinite, bounded by the amount of memory on the system, the size of an integer, and any hard and soft limits configured by the system administrator.