W jaki sposób ten sam plik w różnych procesach może wskazywać na ten sam plik?


25

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:

wprowadź opis zdjęcia tutaj

Jak to możliwe? Czy deskryptor pliku nie powinien być indeksem rekordu w tabeli otwartych plików?


1
Dobre pytanie! Domyślam się, że deskryptory plików są przetłumaczone, tak że fd 4w obu procesach jest względna w stosunku do własnej liczby otwartych fd. Fd 0-2(stdin, stdout, sdterr) są zawsze otwierane dla nowego procesu i liczby nie są zarezerwowane tylko dla tego procesu.


@ jw013 Myślałem, że to brzmi znajomo. \ @Pithikos Jak to nie jest duplikat?
Michael Mrozek

1
To kiepski schemat - powinien pokazywać, że deskryptor pliku 4 oznacza czwarty wpis [cóż, piąty, jest liczony od zera] tabeli deskryptorów plików po lewej stronie, a nie wpis zawierający „4”. Rzeczywiste „4” znajduje się w zmiennej przestrzeni użytkownika zawierającej liczbę. Schemat w drugim pytaniu jest znacznie lepszy.
Random832

2
@ Random832 Cóż, gdybym wiedział, który schemat jest prawidłowy, prawdopodobnie nigdy nie zadałbym tego pytania.
Pithikos,

Odpowiedzi:


35

Deskryptor pliku, tj. 4W 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.


2
Dla przypomnienia, w większości systemów jest tylko jedna „flaga deskryptora pliku”, flaga close-on-exec. Wszystkie pozostałe stany „per-fd” (w tym przesunięcie i tryb dostępu) są częścią pozycji otwartej tabeli plików.
Random832

24

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. Linuxstruct 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ć lseekustawić dwie różne pozycje w tym samym pliku, a więc użyłby dupdo uzyskania dwóch uchwytów do tego pliku.


2
To nie jest do końca poprawne. Zgodnie ze stroną / specyfikacją man, duprobi 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 potrzebujesz opentego pliku dwa razy.
jw013,

@Gilles „Deskryptor pliku 4 w procesie 1234 punktów w tabeli procesu 1234”. Który stół masz na myśli? Z tego, co wiem, jedyną tabelą w tym procesie jest Tabela deskryptorów plików, w której każdy rekord wskazuje pojedynczą otwartą tabelę plików jądra .
Pithikos,



7

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”.


2
Źródło mądry starzec prawdopodobnie David Wheeler. Wygląda na to, że powiedział także: „ Ale to zwykle spowoduje inny problem. ” :)
jw013
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.