2011-12-10 8 views
2

以下の関数は、0MQ Haskellバインディングに基づいています。実行時にエラーが発生します。エラーはgetIntOpt: interrupted (Interrupted system call)と表示され、プログラムは停止します。0MQでのランタイムエラーHaskellバインディング:getIntOpt:割り込み(中断されたシステムコール)

おそらく私が使用しているコマンドラインオプションで何かしなければならないし、基準のために破棄する必要がありますか?

編集: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

バインディングは包まれた関数が-1を返す場合errnoからエラーがスローされますFFIのヘルパー関数throwErrnoIfMinus1_を、使用しています。新しいzeromqライブラリは、発信者がEINTRを適切に処理することを期待していますが、ここでは発生していません。

は、あなたはそれが-1errnoEINTRに設定されて返された場合、自動的に包まれた機能を再試行throwErrnoIfMinus1Retry_を、使用するライブラリのメンテナを求めることができます。

あなたが私に日陰それを思わ GHC.IO.Exceptionをインポートする場合を除き、(それがその中に保存されているにもかかわらず、あなたは IOExceptionをキャッチすることができますが、私は errnoの値で取得する方法がわからないように見えます

)。

+0

ありがとうございました。私は、ここから 'スロー'または 'キャッチ'で何かを修正することができます:http://haskell.org/ghc/docs/6.12.1/html/libraries/base/Control-Exception.html ?? –

+1

あなたは 'IOException'をキャッチすることができますが、' GHC.IO.Exception'をインポートせずに 'errno'値を取得する標準的な方法を見つけることができませんでした。' GHC.IO.Exception'をインポートせずに、 errnoはEINTRだった。 –

+0

悪いです。高いメッセージング周波数では、頻繁に起こります。最終的に、これはHaskell全体を実世界のアプリケーションでは役に立たないものにする可能性があります。 –