0MQ Haskell绑定的运行时错误:getIntOpt:中断(系统调用中断)

时间:2011-12-10 13:54:35

标签: haskell zeromq

以下函数基于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)]

1 个答案:

答案 0 :(得分:1)

绑定使用FFI帮助函数throwErrnoIfMinus1_,如果包装函数返回errno,则会从-1引发错误。新的zeromq库期望调用者正确处理EINTR,这不会发生在这里。

您可以要求库维护者使用throwErrnoIfMinus1Retry_,如果返回-1并且errno设置为EINTR,则自动重试包装函数。

看起来您可以捕获IOException,但我不知道如何获取errno的值,即使它存储在其中(除非您要导入{{ 1}},这对我来说似乎很阴暗。)