Po obejrzeniu unixa o nazwie socket i pomyślałem, że to potoki. Spojrzałem na nazwy rur i nie zauważyłem dużej różnicy. Widziałem, że zostały zainicjowane inaczej, ale to jedyna rzecz, jaką zauważyłem. Oba używają funkcji zapisu / odczytu C i działają podobnie AFAIK.
Jaka jest różnica między gniazdami domeny unix a nazwanymi potokami? Kiedy wybrałbym jedną z nich? Którego powinienem używać domyślnie (na przykład jak domyślnie używam vector w C ++ niż używam deque, list lub cokolwiek innego, jeśli mam potrzeby)?
Odpowiedzi:
Gniazda domeny UNIX są generalnie bardziej elastyczne niż potoki nazwane. Niektóre z ich zalet to:
Aby użyć wielu z tych funkcji, musisz użyć
send()
/recv()
rodzina wywołań systemowych zamiastwrite()
/read()
.źródło
open(2)
wywołania, co czyni je bardziej odpowiednimi do konstruowania potoków ad-hoc między programami, które zwykle pobierają tylko argumenty nazw plików.Jedyną różnicą jest to, że nazwane potoki są jednokierunkowe, więc do komunikacji dwukierunkowej musisz użyć dwóch z nich. Gniazda są oczywiście dwukierunkowe. Używanie dwóch zmiennych zamiast jednej (czyli dwóch rur zamiast jednego gniazda) wydaje się nieco bardziej skomplikowane.
Ponadto artykuł w Wikipedii jest dość jasny w następującym punkcie : „Gniazda domeny uniksowej mogą być tworzone jako strumienie bajtów lub jako sekwencje datagramów, podczas gdy potoki są tylko strumieniami bajtów”.
Nazwane potoki są w rzeczywistości dwukierunkowe, ale półdupleksowe . Oznacza to, że komunikacja może przebiegać albo od końca A do końca B, albo od B do A, ale nigdy w tym samym czasie.
źródło
write
wywołanie generuje jednoread
wywołanie. W trybie strumieniowym dane mogą być łączone razem w jeden długi strumień, dzięki czemu można odczytać wiele zapisów jednocześnie lub odwrotnie. (Windows ma potoki datagramowe, zgodnie z odpowiedzią jtoberona, Unix nie)