Мне интересно, есть ли эквивалент Windows для Linux mkfifo. Под эквивалентом я подразумеваю способ создания файлов с st_mode S_IFIFO. Спасибо за ответы.
Пример файла Fifo для Windows
Ответы (1)
Должна быть возможность до некоторой степени эмулировать поведение mkfifo
. Много лет назад я реализовал что-то подобное для OS/2, что очень похоже на WinXX в отношении файловая система.
Основное ограничение заключается в том, что Windows использует зарезервированные имена файлов для каналов: \\.\pipe\имя канала или \\ servername\pipe\pipename по сети (что может быть очень полезно). Но вы не сможете напрямую использовать произвольные имена fifo. Имена каналов должны иметь префикс \\.\pipe\.
Однако приложение может создать канал с CreateNamedPipe
с PIPE_ACCESS_DUPLEX
и, например. имя GUID и создайте символическую ссылку на этот канал в целевом каталоге с помощью DeviceIoControl
/ FSCTL_SET_REPARSE_POINT
. Это должно быть довольно близко к mkfifo
.
Недостатком является то, что приложение, которое обслуживает канал, должно работать, пока существует экземпляр канала. И, конечно же, он должен очищать символическую ссылку при завершении. Кроме того, ему необходимо прочитать все данные из канала и снова записать их. Не уверен, можно ли это реализовать с нулевой копией.
Есть еще некоторые аспекты. Например. если вы хотите иметь возможность удалить свой эмулируемый FIFO, вам необходимо отслеживать удаление символической ссылки и в этом случае завершить рабочий процесс.
Извините, у меня нет среды разработки Windows, поэтому я не могу протестировать этот подход.
> fsutil file createnew fifo 0 > fsutil file createnew socket 1 > attrib +S -H fifo > attrib +S -H socket
- person Patrik Polakovic; 16.11.2017
\\.\pipe
, и не смог заставить его работать. См. этот вопрос.
- person IS4; 01.01.2018