= Solution
A <file descriptor table> belongs to a process: its small nonnegative <integer> indices are <file descriptors>, and each occupied entry points to an <open file description>. It also holds descriptor-specific information, such as whether the descriptor closes on a successful program replacement. There is \b[one logical <file descriptor table> per process] in the traditional model; implementations can let processes explicitly share one.
The system-wide <open file table>, called the file pointer table here, contains <open file descriptions>. Each entry records an opening's access mode, current <file offset>, reference count and reference to an in-memory <inode>. Duplicated <file descriptors>, including inherited ones, can refer to the same <open file description> and therefore share its <file offset>. Independent opens of the same <file> normally create separate <open file descriptions> and separate offsets. There is \b[one logical system-wide <open file table>], with many entries.
The system-wide in-memory <inode table> caches the <inodes> currently needed, including shared <file metadata>, locking and reference information. Its identity key must include the <file system> as well as the <inode number> when several volumes are mounted. There is \b[one logical system-wide active <inode table>], distinct from the persistent <inode table> stored on each volume. These are logical organizations, not requirements for a single contiguous array in memory.
$$
\boxed{\text{process descriptor}\to\text{open-file description}\to\text{active inode}\to\text{disk blocks}.}
$$
Back to article page