Кроссплатформенный нулевой дескриптор ИЛИ игнорируя вывод процесса - PullRequest
1 голос
/ 30 сентября 2019

Это кажется довольно простой проблемой: если в системе Unix я хочу отменить вывод процесса (из библиотеки process), следующий комментарий ( оригинальная ссылка Haddock ) представляется актуальным:

... Если вы хотите игнорировать вывод дочернего процесса, вы должны либо создать канал и слить его вручную, либо передать Handle, который записывает в /dev/null.

И это прекрасно работает. У меня проблема в том, что openFile "/dev/null" WriteMode не работает должным образом в Windows - он создает фактический файл с именем /dev/null.

Есть ли какой-то кроссплатформенный способ получения Handle, который просто игнорирует его ввод? Другие SO вопросы заставляют меня думать, что один из openFile "nul" WriteMode или openFile "null" WriteMode должен работать, но ни один из них, похоже, не игнорирует должным образом вывод (см. эту строку 462 этого журнала для примера предыдущего not работает).

1 Ответ

2 голосов
/ 01 октября 2019

С Пути к файлам под Windows в руководстве по GHC:

Начиная с GHC 8.6.1, менеджер ввода-вывода Haskell автоматически переводит пути в устаревшем формате в файл Win32Пространство имен. По умолчанию диспетчер ввода-вывода будет выполнять две операции с вашими путями:

  • заменить \ на \\
  • расширить относительные пути до абсолютных путей

Если вы хотите отказаться от предварительной обработки, просто явно используйте пространства имен в ваших путях. Из-за этого изменения, если вам нужно открыть необработанные устройства (например, COM-порты), вам нужно явно использовать пространство имен устройства. (например, \\.\COM1). Программы GHC и Haskell в целом больше не поддерживают открытие устройств в устаревшем формате.

Таким образом, в GHC 8.6.1 и более поздних версиях вместо использования NUL теперь необходимо использовать \\.\NUL как silently пришлось изменить .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...