У меня есть ситуация, когда мне нужно проверить, открыла ли его другая сторона fifo, однако я не могу использовать открытие, потому что иначе программа начнет что-то делать.
Почему я должен это сделать: у меня есть программа (монитор), которая запускает серверную программу (обе созданы мной). Монитор использует этот FIFO для связи, потому что монитор можно закрыть/открыть снова, когда сервер уже запущен.
Проблема в том, что когда монитор запускает сервер: в этом случае я должен каким-то образом дождаться создания fifos, а затем открыть их. На самом деле я использую время на мониторе, который проверяет, когда создаются fifo, однако таким образом он открывает fifo прежде, чем сервер сможет это сделать (даже если инструкция после mkfifo на самом деле является открытым!!!).
Вы можете сказать, что я открываю fifo в неправильном порядке на мониторе (я открываю fifo для записи (НЕПРАВИЛЬНО) перед fifo для чтения), проблема в том, что я не могу изменить этот порядок, потому что требуется, чтобы сервер будет ждать клиентов по открытому (ТОЛЬКО RDON) fifo.
Любое предложение о том, как избежать этого состояния гонки? На самом деле я использую сон в мониторе после проверки того, созданы ли FIFO, это явно решает проблему, но я думаю, что это определенно неправильно.
Спасибо всем
Редактировать 1:
Вот как обстоят дела на данный момент
Сервер
mkfifo(fifo1)
mkfifo(fifo2)
open(fifo1 O_RDONLY)
open(fifo2 O_WRONLY)
Монитор
while (fifo1 doesn't exists && fifo2 doesn't exists);
open(fifo1 O_WRONLY)
open(fifo2 O_RDONLY)
Я думаю, что состояние гонки теперь довольно явное, важно отметить, что fifos блокируются (блокируются только RDONLY, WRONLY не будет блокироваться, даже если на другой стороне никого нет => это поведение Unix, разработано не мной).
Редактировать 2:
Состояние гонки происходит на первом открытом уровне FIFO. Я должен открыть первый файл fifo на сервере до того, как это сделает монитор.