Пример файла Fifo для Windows

Мне интересно, есть ли эквивалент Windows для Linux mkfifo. Под эквивалентом я подразумеваю способ создания файлов с st_mode S_IFIFO. Спасибо за ответы.


person Patrik Polakovic    schedule 25.07.2015    source источник
comment
В Windows просто нет абстракции файлов, вам нужно будет работать с именованным каналом. Найти его по имени из пространства имен объектов ядра не проблема.   -  person Hans Passant    schedule 25.07.2015
comment
Я просто спрашиваю, потому что в Windows определен _S_IFIFO, но, возможно, он определен только для некоторой обратной совместимости. Также ntfs-3g (от linux) распознает некоторые файлы как S_IFIFO.   -  person Patrik Polakovic    schedule 25.07.2015
comment
Хм, вы нашли это в stat.h, заголовке, который Microsoft пришлось эмулировать. Технически это возможно, обернув дескриптор именованного канала, но это все равно не файл.   -  person Hans Passant    schedule 25.07.2015


Ответы (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, поэтому я не могу протестировать этот подход.

person Marcel    schedule 12.11.2017
comment
Спасибо за ваш ответ. Я действительно не пытался создать такой файл. Я спросил, потому что в Linux-системах драйвер ntfs-3g действительно распознает некоторые файлы в разделе NTFS как FIFO\SOCKET. И чтение из такого файла неожиданно зависает. Это особенность драйвера ntfs-3g FUSE. > fsutil file createnew fifo 0 > fsutil file createnew socket 1 > attrib +S -H fifo > attrib +S -H socket - person Patrik Polakovic; 16.11.2017
comment
Я попытался создать символическую ссылку на путь, начинающийся с \\.\pipe, и не смог заставить его работать. См. этот вопрос. - person IS4; 01.01.2018