hGet的语义

Mar*_*ton 3 haskell

我正在寻找一个功能

foo :: Handle -> ByteString
Run Code Online (Sandbox Code Playgroud)

这将给我缓冲区中的所有内容,如果它是空的则阻止,如果它关闭则返回"".

我有一个应用程序,我正在打电话

Data.ByteString.Char8.hGet handle 1
Run Code Online (Sandbox Code Playgroud)

并且一切都运作良好,但是多次呼叫系统调用有点浪费.不幸的是,如果我将它增加到2,我的应用程序会间歇性挂起,这告诉我hGet等待缓冲区已满(或者至少大于1).

我错过了什么?

sha*_*ang 5

检查hGetNonBlockinghGetSome.前者永远不会阻挡,所以听起来就像你在寻找的东西.后者阻塞直到某些数据可用,但它可以返回比请求的更短的ByteString.