【问题标题】:Cross-platform null handle OR ignoring a process' output跨平台空句柄或忽略进程的输出
【发布时间】:2019-10-01 10:22:24
【问题描述】:

这似乎是一个非常简单的问题:如果在 Unix 系统上我想丢弃进程的输出(来自 process 库),以下注释 (original Haddock link) 似乎相关:

...如果您希望忽略子进程的输出,您应该创建一个管道并手动排空它,或者传递一个写入/dev/nullHandle

而且效果很好。我遇到的问题是 openFile "/dev/null" WriteMode 在 Windows 上无法正常工作 - 它会创建一个名为 /dev/null 的实际文件。

是否有一些跨平台的方式来获取忽略其输入的Handle?其他 SO 问题让我认为 openFile "nul" WriteModeopenFile "null" WriteMode 之一应该可以工作,但似乎都没有正确忽略输出(请参阅 this line 462 of this log 以了解前一个工作的示例)。

【问题讨论】:

    标签: haskell process


    【解决方案1】:

    来自 GHC 手册中的File paths under Windows

    自 GHC 8.6.1 起,Haskell I/O 管理器自动提升路径 以旧格式复制到 Win32 文件命名空间。默认情况下 I/O 经理将对您的路径做两件事:

    • \ 替换为\\
    • 将相对路径扩展为绝对路径

    如果你愿意 选择退出所有预处理只需在您的 路径。由于此更改,如果您需要打开原始设备(例如 COM 端口)您需要明确使用设备命名空间。 (例如。 \\.\COM1)。 GHC 和 Haskell 程序一般不再支持 以旧格式打开设备。

    因此,在 GHC 8.6.1 及更高版本中,您现在需要使用 \\.\NULlike silently had to change,而不是使用 NUL

    【讨论】:

    • 非常感谢!出于好奇,您是否碰巧知道\\.\NUL 是否也适用于较旧的 GHC?
    • 很遗憾,我不确定。
    • 不用担心。对于我的用例,我只需要支持 8.8 和 HEAD。我仍然有点惊讶,与 GHC 捆绑在一起的库中没有任何东西可以让你获得跨平台的空句柄(或者至少是一个可能的空句柄 - 也许一些奇怪的平台没有这样的东西)。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多