如何从 POSIX 文件描述符中获取 TextIO.instream?

How do I get a TextIO.instream from a POSIX file descriptor?

如果我有 POSIX 类型 Posix.FileSys.file_desc 的文件描述符,如何将其转换为 TextIO.instream?我想做

的反向操作

这样就可以了。它需要 instream 的“名称”,basis library claims 用于显示给用户的错误消息。所以我建议使用底层文件的名称或路径,如果有的话。

fun fdToInstream (name: string, fd: Posix.FileSys.file_desc) : TextIO.instream =
  let
    val (flags, _) = Posix.IO.getfl fd
    val isNonBlockMode = Posix.IO.O.anySet (Posix.IO.O.nonblock, flags)

    val reader: TextIO.StreamIO.reader =
      Posix.IO.mkTextReader
        { fd = fd
        , name = name
        , initBlkMode = not isNonBlockMode
        }

    val stream_ins: TextIO.StreamIO.instream =
      TextIO.StreamIO.mkInstream (reader, "")
  in
    TextIO.mkInstream stream_ins
  end