Powiedz, że mam proces 1 i proces 2 . Oba mają deskryptor pliku odpowiadający liczbie całkowitej 4.
Jednak w każdym procesie deskryptor pliku 4 wskazuje na zupełnie inny plik w tabeli otwartych plików jądra:
Jak to możliwe? Czy deskryptor pliku nie powinien być indeksem rekordu w tabeli otwartych plików?
kernel
open-files
file-descriptors
Pithikos
źródło
źródło
4
w obu procesach jest względna w stosunku do własnej liczby otwartych fd. Fd0-2
(stdin, stdout, sdterr) są zawsze otwierane dla nowego procesu i liczby nie są zarezerwowane tylko dla tego procesu.Odpowiedzi:
Deskryptor pliku, tj.
4
W twoim przykładzie, jest indeksem specyficznej dla procesu tabeli deskryptorów plików , a nie otwartą tabelą plików. Sama pozycja deskryptora pliku zawiera indeks pozycji w globalnej otwartej tabeli plików jądra, a także flagi deskryptora pliku.źródło
Każdy proces ma własną tabelę deskryptorów plików. Deskryptor pliku 4 w procesie 1234 wskazuje wewnątrz tabeli procesu 1234. Deskryptor pliku 4 w procesie 5678 wskazuje wewnątrz tabeli procesu 5678. Sprawą, którą musisz znać, są deskryptory plików 0, 1 i 2, które dla każdego procesu są standardowym wejściem, standardowym wyjściem i standardowym błędem wskazującym, gdzie zostały przekierowane.
Proces może otworzyć ten sam plik więcej niż raz. Może się to zdarzyć przypadkowo, na przykład gdy standardowe wyjście procesu i standardowy błąd są przekierowywane do tego samego terminala lub do tego samego pliku. Podstawowe wpisy w tabeli plików (np. Linux
struct file
) zawierają więcej niż informacje o pliku; zawierają także tryby otwierania (np. odczyt lub zapis) i inne stany (takie jak flagi, np. close-on-exec). Na przykład proces może mieć otwarty terminal do odczytu tylko na deskryptorze pliku 0 i ten sam terminal otwarty na zapis tylko na deskryptorze pliku 2. Pozycje tabel plików zawierają również pozycję procesu w pliku; proces może chciećlseek
ustawić dwie różne pozycje w tym samym pliku, a więc użyłbydup
do uzyskania dwóch uchwytów do tego pliku.źródło
dup
robi dokładnie to, co jest napisane na puszce: oba deskryptory wskazują ten sam wpis w tabeli plików, a zatem mają to samo przesunięcie. Aby uzyskać 2 różne wpisy tabeli plików, jestem prawie pewien, że potrzebujeszopen
tego pliku dwa razy.Każdy proces ma własną tabelę deskryptorów plików. To wszystko.
Wszystko to jest bardzo dobrze opisane w Programowaniu sieci UNIX autorstwa Richarda Stevensa, jeśli chcesz się go głęboko nauczyć.
źródło
Czy dodatkowy poziom pośredni nie rozwiązałby twojego problemu? („Wszystkie problemy w programowaniu komputerowym można rozwiązać przez dodatkowy poziom pośredni” - niektórzy mądrzy szarobrody). Oznacza to, że mała liczba całkowita w każdym procesie kończy się jako indeks tablicy tablicy indeksów przestrzeni jądra dla „procesu” w „Tabeli plików otwartych”.
źródło