Actually the file descriptor table is not a real table. It's just an array of pointers to the "open file table" (
struct file). But let's say we will see it as a table. What are the columns? For example:
FD | Pointer to "open file table"
--------------------------
--------
... | ...
In short, that's the question. I see a lot of different figures on the internet, but they are all different. For example, see:
http://faculty.winthrop.edu/dannellys/csci325/10_shared.htm
There they have a column "fd flags" (read/write), but I would think that this column is part of the "open file table" and not part of the "file descriptor table". See for example:
http://man7.org/linux/man-pages/man2/open.2.html
A call to open() creates a new open file description, an entry in the
system-wide table of open files. The open file description records
the file offset and the file status flags (see below). A file
descriptor is a reference to an open file description; this reference
is unaffected if pathname is subsequently removed or modified to
refer to a different file. For further details on open file
descriptions, see NOTES.
The argument flags must include one of the following access modes:
O_RDONLY, O_WRONLY, or O_RDWR. These request opening the file read-
only, write-only, or read/write, respectively.
So this creates a file descriptor and an entry in the open file table. A file descriptor is only an integer, so then I would conclude that O_RDONLY/O_WRONLY/O_RDWR is part of the open file table and not of the file descriptor table. They also say this:
A file descriptor is a reference to an open file description; this reference is unaffected if pathname is subsequently removed or modified to refer to a different file.
If write/read would be part of the file descriptor table, then the above can not be true in my opinion.
Another example:
http://poincare.matf.bg.ac.rs/~ivana/courses/ps/sistemi_knjige/pomocno/apue/APUE/0201433079/ch03lev1sec10.html
Here they also have a column "flags". Do they also mean read/write et cetera with "flags"? Or what exactly do they mean by flags in this case?
https://www.usna.edu/Users/cs/aviv/classes/ic221/s16/lec/21/lec.html
Here they don't have the column flags at all.
I think for the answer we have to look at
https://elixir.bootlin.com/linux/v3.18/source/include/linux/fdtable.h
/*
* Open file table structure
*/
struct files_struct {
/*
* read mostly part
*/
atomic_t count;
struct fdtable __rcu *fdt;
struct fdtable fdtab;
/*
* written part on a separate cache line in SMP
*/
spinlock_t file_lock ____cacheline_aligned_in_smp;
int next_fd;
unsigned long close_on_exec_init[1];
unsigned long open_fds_init[1];
struct file __rcu * fd_array[NR_OPEN_DEFAULT];
};
Although they write "open file table structure", probably this is what other people call the "file descriptor table". These structures are still a bit abracadabra for me, but I don't see something like read/write flags.
So how I have to see it? Which columns does the file descriptor "table" have? (if we would see it as a table)