Jaka jest najlepsza praktyka, aby zapobiec awarii tutaj?
Wyłącz sigpipe jak wszyscy lub złap i zignoruj błąd.
Czy istnieje sposób sprawdzenia, czy druga strona linii nadal czyta?
Tak, użyj select ().
Wydaje się, że select () nie działa tutaj, ponieważ zawsze mówi, że gniazdo można zapisać.
Musisz wybrać na odczytanych bitach. Prawdopodobnie możesz zignorować bity zapisu .
Kiedy drugi koniec zamyka uchwyt pliku, wybierz powie ci, że są dane gotowe do odczytu. Gdy to zrobisz, otrzymasz 0 bajtów, tak system operacyjny informuje, że uchwyt pliku został zamknięty.
Jedynym momentem, w którym nie można zignorować bitów zapisu, jest wysyłanie dużych woluminów i istnieje ryzyko zalegania drugiego końca, co może spowodować wypełnienie buforów. Jeśli tak się stanie, wówczas próba zapisu do uchwytu pliku może spowodować zablokowanie lub niepowodzenie programu / wątku. Testowanie select przed zapisaniem ochroni cię przed tym, ale nie gwarantuje, że drugi koniec jest zdrowy lub że twoje dane dotrą.
Zauważ, że możesz uzyskać sigpipe z close (), a także podczas pisania.
Zamknij opróżnia buforowane dane. Jeśli drugi koniec został już zamknięty, zamknięcie zakończy się niepowodzeniem, a otrzymasz sigpipe.
Jeśli używasz buforowanego protokołu TCPIP, pomyślny zapis oznacza po prostu, że dane zostały umieszczone w kolejce do wysłania, co nie oznacza, że zostały wysłane. Do czasu pomyślnego połączenia blisko nie wiesz, że Twoje dane zostały wysłane.
Sigpipe mówi ci, że coś poszło nie tak, nie mówi ci, co lub co powinieneś z tym zrobić.