2014-07-15 15 views
7

Czytam o rurach w systemie UNIX do komunikacji między procesami między 2 procesami. Mam następujące pytanie:Czy naprawdę konieczne jest zamknięcie nieużywanego końca rury w procesie

Czy naprawdę konieczne jest zamknięcie nieużywanego końca rury? na przykład, jeśli mój proces macierzysty zapisuje dane w potoku i dziecko czyta z rury, czy naprawdę konieczne jest zamknięcie końca odczytu rury w procesie nadrzędnym i zamknięcie końca zapisu przed procesem podrzędnym? Czy są jakieś efekty uboczne, jeśli nie zamknę tych końców? Dlaczego musimy zamknąć te końce?

+0

Nie wiem, czy jest to niezdefiniowane zachowanie, jeśli są dwa końce odczytu, ale tylko jeden faktycznie czyta z rury. –

Odpowiedz

10

Oto problem, jeśli nie. W twoim przykładzie rodzic tworzy fajkę do zapisu do dziecka. Następnie wyświetla dziecko, ale nie zamyka własnego deskryptora odczytu. Oznacza to, że nadal istnieją dwa deskryptory odczytu na rurze.

Jeśli dziecko miało jedyną i zamknęło (na przykład, wychodząc), rodzic otrzymał sygnał SIGPIPE lub, jeśli to było maskowane, błąd przy zapisie do potoku.

Istnieje jednak drugi deskryptor odczytu na rurze (rodzic). Teraz, jeśli dziecko wyjdzie, rura pozostanie otwarta. Rodzic może kontynuować pisanie do potoku, dopóki nie wypełni się, a następnie następny zapis zablokuje (lub powróci bez pisania, jeśli nie będzie blokowany).

W ten sposób, nie zamykając deskryptora odczytu rodzica, rodzic nie może wykryć, że dziecko zamknęło deskryptor.

3

Według strony człowieka na getdtablesize

każdy proces ma stały rozmiar tabeli deskryptor, który gwarantuje co najmniej 20 szczelin.

Każda rura używa dwóch wpisów w tabeli deskryptorów. Zamknięcie niepotrzebnego końca rury zwalnia jeden z tych deskryptorów. Tak więc, jeśli miałeś nieszczęście być w systemie, w którym każdy proces jest ograniczony do 20 deskryptorów, byłbyś wysoce zmotywowany, aby uwolnić niepotrzebne deskryptory plików.

+1

Ogólnie rzecz biorąc, zamykanie deskryptorów plików nie przypomina zwolnienia pamięci. Zajmujesz się zasobami systemowymi, które mogą być rzadkie. Istnieje również wspólny (miękki) limit 1024 wszystkich deskryptorów plików. –

1

Rury są przeznaczone do wykorzystania jako jednokierunkowe kanały komunikacyjne. Zamykanie ich jest dobrą praktyką pozwalającą uniknąć bałaganu w wysyłanych wiadomościach. Deskryptor pisarza powinien być zamknięty dla czytelnika i na odwrót.