2012-08-06 12 views
10

Mam następujący scenariusz.Czy musimy wyraźnie zamknąć koniec odczytu rury, której koniec zapisu został już zamknięty?

  1. Tworzę fajkę.

  2. Rozwidlony proces potomny.

  3. Dziecko zamyka czytać koniec rury wyraźnie i pisze do końca zapisu rury i wyjść bez zamykania czegokolwiek (zjazd powinien zamknąć wszystkie otwarte deskryptory plików/rur w imieniu dziecka, jak sądzę).

  4. nadrzędna zamyka koniec zapisu rury wyraźnie i odczytuje z odczytanego końca rury przy użyciu fgets do tej fgets zwraca NULL. tj. czyta się całkowicie.

Teraz moje pytanie brzmi, dlaczego rodzic musi zamknąć koniec czytanego przewodu jawnie po zakończeniu czytania? Czy nie jest rozsądne, aby system całkowicie usunął rurę po przeczytaniu kompletnych danych z poziomu odczytu?

Dint zamykam wyraźnie koniec odczytu w rodzicu i wcześniej lub później mam błąd Too many file descriptors podczas otwierania kolejnych potoków. Zakładam, że system automatycznie usuwa rurę po zamknięciu jej końca zapisu, a dane zostały całkowicie odczytane z końca odczytu. Bo nie możesz dwa razy z rury!

A zatem, jakie jest uzasadnienie, że system nie usuwa rury po całkowitym odczytaniu danych i zamknięciu zapisu?

+0

"Bo nie możesz dwa razy polecieć!" ??? –

+0

@KerrekSB Co miałem na myśli to, że możesz przeczytać tę samą rurkę dwa razy, ale zobaczysz EOF drugi raz, prawda? –

Odpowiedz

7

Masz rację, że system zamknie koniec zapisu rury po wyjściu dziecka. Jednak może istnieć inny koniec zapisu tej rury, jeśli dziecko lub przekaże duplikat końca zapisu innemu procesowi.

W dalszym ciągu prawdą jest, że system byłby w stanie stwierdzić, kiedy wszystkie deskryptory na jednym końcu rury zostały zamknięte (jawnie lub z powodu zakończenia procesu posiadania). Wciąż nie ma sensu zamykanie tych na drugim końcu rury, ponieważ prowadziłoby to do zamieszania, gdy proces macierzysty próbuje zamknąć deskryptor na końcu rury; albo:

  • system fd został zamknięty przez system, w którym to przypadku wystąpił błąd podczas próby zamknięcia już zamkniętego dysku; lub
  • FD został ponownie użyty, co jest jeszcze gorsze, ponieważ teraz zamyka całkowicie niepowiązaną fd.

Z punktu widzenia systemu, być może odrzuciłoby ono rurę po zamknięciu wszystkich deskryptorów na jednym końcu, więc nie trzeba się martwić o nieefektywność. Ważniejsze jest to, że proces przestrzeni użytkownika powinien mieć spójne doświadczenie, co oznacza, że ​​nie zamyka się deskryptora, chyba że jest to wymagane.

5

Deskryptory plików nie są zamykane przez system, dopóki proces nie zostanie zakończony. Dotyczy to zarówno potoków, jak i wszelkich innych deskryptorów plików.

Istnieje duża różnica między potokiem (lub jakimkolwiek innym plikiem) bez danych i zamkniętym deskryptorem pliku.
Po zamknięciu deskryptora pliku system może ponownie wykorzystać jego numer dla nowego deskryptora pliku. Następnie, kiedy czytasz, dostajesz coś innego. Więc po zamknięciu deskryptora pliku, nie możesz go już używać.

Teraz wyobraź sobie, że gdy nie będzie już żadnych danych, system automatycznie zamknie deskryptor pliku. To sprawi, że numer będzie dostępny do ponownego użycia, a kolejne niepowiązane otwarte mogą go uzyskać. Teraz czytelnik, który nie wie jeszcze, że nie ma więcej danych, odczyta z tego, co uważa za fajkę, ale faktycznie odczyta z innego pliku.