Я использую FIFO (именованный канал) для IPC. Теперь обработайте вызовы A
mkfifo(path)
open(path)
Естественно, open()
будет блокироваться до тех пор, пока файл не будет записан процессом B. Теперь мне нужен способ аннулировать FIFO. Поэтому я звоню
unlink(path)
Теперь я ожидал, что любой блокирующий вызов open
вернется, но этого не происходит, и мой процесс зависает на неопределенный срок.
Как я могу разблокировать вызов open
, когда FIFO не связан? Должен ли я прибегать к O_NONBLOCK
?
PS: я попробовал предложенный подход записи/отключения/закрытия безрезультатно. Вызов open
немедленно блокируется.
void invalidate() {
int fd = open(path, O_WRONLY)
unlink(path)
close(fd)
}
я думаю проблема в том
FIFO должен быть открыт на обоих концах (чтение и запись) перед передачей данных. Обычно открытие блоков FIFO происходит до тех пор, пока другой конец также не будет открыт.
Однако invalidate
должен работать, не зная, открыт ли в данный момент FIFO для чтения или нет.
write
, обозначающие конец потока. - person Erik Aigner   schedule 11.06.2020read()
возвращает-1
и устанавливаетERRNO = EWOULDBLOCK
. - person Barmar   schedule 11.06.2020EWOULDBLOCK
. Иногда он устанавливалEWOULDBLOCK
и возвращал0
, в большинстве случаев он даже не устанавливалEWOULDBLOCK
... не знаю, что здесь происходит. - person Erik Aigner   schedule 11.06.2020open(path, O_RDONLY)
должен вернуться, как только другой процесс выполнитopen(path, O_WRONLY)
, или наоборот. - person Barmar   schedule 11.06.2020open
при аннулировании, он тоже зависает. - person Erik Aigner   schedule 11.06.2020