Mam aplikację, która składa się z dwóch procesów (nazwijmy je A i B), połączonych ze sobą za pośrednictwem gniazd domeny Unix. W większości przypadków działa to dobrze, ale niektórzy użytkownicy zgłaszają następujące zachowanie:Co może spowodować spontaniczny błąd EPIPE bez wywołania end() lub awarii?
- A wysyła żądanie do B. To działa. A zaczyna czytać odpowiedź od B.
- B wysyła odpowiedź do A. Odpowiednie wywołanie write() zwraca błąd EPIPE, w wyniku czego B zamyka() gniazdo. Jednak A zrobił nie close() gniazda, ani się nie zawiesił.
- A's read() wywołanie zwraca 0, wskazując koniec pliku. A uważa, że B przedwcześnie zamknęło połączenie.
użytkowników zgłaszało również odmiany tego zachowania, np:
- A wysyła żądanie do B. To działa częściowo, ale przed całą żądanie jest wysyłane Napisz na() wywołanie zwraca EPIPE i w wyniku A close() gniazdo. Jednak B nie zamknął() gniazda, ani się nie zawiesił.
- B odczytuje częściową prośbę, a następnie nagle otrzymuje EOF.
Problem polega na tym, że nie mogę w ogóle odtworzyć tego zachowania lokalnie. Próbowałem już OS X i Linuxa. Użytkownicy są na różnych systemach, głównie OS X i Linux.
Rzeczy, które ja już wypróbowane i uznane:
- Pokój Close() błędy (zamknij() jest wywoływana dwa razy tego samego deskryptora pliku): chyba nie tak, że powodować błędy EBADF, ale Nie widziałem ich.
- Zwiększenie maksymalnego limitu deskryptora pliku. Jeden z użytkowników zgłosił, że to zadziałało dla niego, reszta zgłosiła, że tak nie jest.
Co jeszcze może spowodować takie zachowanie? Wiem na pewno, że ani A, ani B nie zamkną() gniazda przedwcześnie, i wiem na pewno, że żaden z nich nie rozbił się, ponieważ zarówno A, jak i B byli w stanie zgłosić błąd. To tak, jakby jądro nagle zdecydowało się wyciągnąć wtyczkę z gniazdka z jakiegoś powodu.
Okazało się, że deskryptor pliku serwera został dodany z flagą EPOLLET do kolejki epol, która wydaje się być błędna. – user206268
Niezupełnie odpowiedź, której szukałem, ale strona TCP, z którą się łączyłeś, jest bardzo pouczająca! Teraz jest w archiwum Archive.org: http://ia700609.us.archive.org/22/items/TheUltimateSo_lingerPageOrWhyIsMyTcpNotReliable/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable .html – Hongli