Inne odpowiedzi dodały świetne rzeczy. Dodam tylko moje 2 centy.
Według Wikipedii wiemy na pewno: deskryptor pliku jest nieujemną liczbą całkowitą. Najważniejszą rzeczą, którą moim zdaniem brakuje, byłoby powiedzenie:
Deskryptory plików są powiązane z identyfikatorem procesu.
Wiemy, że najbardziej znane deskryptory plików to 0, 1 i 2. 0 odpowiada STDIN
, 1 do STDOUT
i 2 do STDERR
.
Powiedzmy, weźmy procesy powłoki jako przykład i jak się do tego stosuje?
Sprawdź ten kod
#>sleep 1000 &
[12] 14726
Stworzyliśmy proces o identyfikatorze 14726 (PID). Używająclsof -p 14726
możemy uzyskać takie rzeczy:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Czwarta kolumna FD i następna kolumna TYPE odpowiadają deskryptorowi pliku i typowi deskryptora pliku.
Niektóre wartości FD mogą być:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Ale prawdziwy deskryptor pliku znajduje się w:
NUMBER – Represent the actual file descriptor.
Znak po liczbie, tj. „1u”, oznacza tryb, w którym plik jest otwierany. r do odczytu, w do zapisu, u do odczytu i zapisu.
TYPE określa typ pliku. Niektóre wartości TYPE to:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Ale wszystkie deskryptory plików to CHR - znak specjalny plik (lub plik urządzenia znakowego)
Teraz możemy zidentyfikować deskryptorów dla STDIN
, STDOUT
i STDERR
łatwe lsof -p PID
, czy widzimy to samo, gdybyśmy ls /proc/PID/fd
.
Zauważ też, że tablica deskryptorów plików, którą śledzi jądro, nie jest taka sama jak tabela plików lub tabela i-węzłów. Są to osobne, jak wyjaśniono niektóre inne odpowiedzi.
Można zadać sobie pytanie, gdzie są te deskryptory plików fizycznie i to, co jest zapisane w /dev/pts/6
na przykład
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Cóż, /dev/pts/6
żyje wyłącznie w pamięci. Nie są to zwykłe pliki, ale tak zwane pliki urządzeń znakowych . Możesz to sprawdzić za pomocą: ls -l /dev/pts/6
i zaczną od c
, w moim przypadku crw--w----
.
Aby przypomnieć sobie większość systemów operacyjnych typu Linux, zdefiniuj siedem rodzajów plików:
- Zwykłe pliki
- Katalogi
- Pliki urządzeń znakowych
- Zablokuj pliki urządzenia
- Gniazda domeny lokalnej
- Nazwane potoki (FIFO) i
- Linki symboliczne