以下函数基于0MQ Haskell绑定。我在运行时遇到错误。错误显示getIntOpt: interrupted (Interrupted system call)
,程序停止。
它可能必须使用我使用的命令行选项,然后因为标准而丢弃?
编辑:发现当我将自己的代码留下cmdArgs时,我也会收到错误。 实际上背后有一个更有趣的问题。见最后一段here。但我仍然不知道如何有效地处理它。
sendReceive :: B.ByteString -> IO ()
sendReceive datastring = withContext 1 $ \context -> do
withSocket context Req $ \requester -> do
--putStrLn "Connecting ..."
connect requester "tcp://192.168.35.84:5559"
let tryOnePing (!c, !f) i = do
send requester datastring []
--putStrLn "Sent ..."
r <- receive requester []
--putStrLn "Received ..."
return $ case B.unpack r of
datastring -> (c+1, f)
_ -> (c, f+1)
(c,f) <- foldM tryOnePing (0,0) [1 .. 1000]
-- c and f are not used in this example
return ()
main = do
n <- cmdArgsRun strlen
let datastring = B.pack (take (byte n) $ randomRs ('a','z') (mkStdGen 3))
putStrLn "Starting..."
withArgs [] $ defaultMain [bench "sendReceive" $ whnfIO (sendReceive datastring)]
答案 0 :(得分:1)
绑定使用FFI帮助函数throwErrnoIfMinus1_
,如果包装函数返回errno
,则会从-1
引发错误。新的zeromq库期望调用者正确处理EINTR
,这不会发生在这里。
您可以要求库维护者使用throwErrnoIfMinus1Retry_
,如果返回-1
并且errno
设置为EINTR
,则自动重试包装函数。
看起来您可以捕获IOException
,但我不知道如何获取errno
的值,即使它存储在其中(除非您要导入{{ 1}},这对我来说似乎很阴暗。)