2009-02-24 17 views
17

Jeśli mam program, który tworzy i próbuje otworzyć nazwaną potok za pomocą mkfifo, w jaki sposób mogę otworzyć potok do czytania lub pisania bez blokowania?Jak wykonać niezablokowanie fopen na nazwanej potoku (mkfifo)?

W szczególności piszę program w języku C, który można uruchomić z gui lub bez niego (napisany w Javie).

W programie C, I pomyślnie utworzyć nazwanych potoków za pomocą mkfifo, jednak kiedy robię

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/ 

fopen nie zwraca aż GUI otwiera że rura na piśmie. Chcę, aby ta rura była gotowa do odczytu raz (jeśli) GUI zdecyduje się na nią napisać - będę umieszczał deskryptor pliku w wywołaniu select(). Rozsądnie jest oczekiwać, że interfejs GUI języka Java może nigdy nie zostać uruchomiony, więc nie mogę na nim polegać, aby otworzyć drugi koniec rury w dowolnym punkcie lub nawet w ogóle.

Będę też miał drugą rurę otwartą do pisania i zakładam, że będę miał ten sam problem. Ponadto nie mogę ustawić O_NONBLOCK na rurze wyjściowej, która nie ma czytnika.

Wszelkie sugestie?

(To działa na systemie Linux)

+0

Czy trzeba otworzyć rurę wyjściową przed uruchomieniem select() na rurze wejściowej? –

+0

@tinkertim - Przypuszczam, że technicznie nie - ustawiłem oba w funkcji konfiguracji, ale mogłem najpierw ustawić wyjściową rurę, a następnie zadzwonić wybrać, dlaczego? – Zxaos

Odpowiedz

12

Można open() swoją rurę O_RDONLY | O_NONBLOCK, a jeśli chcesz strumienia C, można go pobrać z fdopen(). Jednak może występować problem z select() - AFAIK, fd otwarty do odczytu, który nie ma pisarza jest zawsze gotowy do czytania, a read() zwraca 0, więc select() będzie strzelać w nieskończoność.

Kludym sposobem przezwyciężenia tego byłoby otwarcie rury O_RDWR; to znaczy, mieć co najmniej jednego pisarza (twój program C++). Które i tak rozwiąże twój problem.

+1

Zrobię to zdjęcie dla czytelnika - ale nie mogę ustawić O_NONBLOCK na rurze wyjściowej ... – Zxaos

+1

Standard POSIX mówi (z select()): "Deskryptor będzie uważany za gotowy do czytania, gdy połączenie do funkcji wejściowej z O_NONBLOCK clear nie blokowałoby się, czy funkcja pomyślnie przesyła dane. " (POSIX.1: 2008). –

+1

Otwarcie rury O_RDWR doprowadziłoby do zakleszczenia, gdy program odczytuje (lub zapisuje) - chyba że istnieje inny proces również z otwartym przewodem. –