아래 함수는 0MQ 하스켈 바인딩을 기반으로합니다. 런타임에 오류가 발생합니다. 오류가 getIntOpt: interrupted (Interrupted system call)
이라고 표시되고 프로그램이 중지됩니다.0MQ 하스켈 바인딩에서 런타임 오류 : 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)]
감사합니다. 여기서 "throw"또는 "catch"로 무엇인가 고칠 수 있습니까? http://haskell.org/ghc/docs/6.12.1/html/libraries/base/Control-Exception.html ?? –
'IOException'을 잡을 수는 있지만'GHC.IO.Exception'을 가져 오지 않고'errno' 값을 가져 오는 표준 방법을 찾을 수 없습니다 -'GHC.IO.Exception'을 가져 오지 않으면 자동으로 다시 시도하고 싶지 않습니다. errno는'EINTR'이었다. –
잘못되었습니다. 높은 메시징 주파수에서는 매우 자주 발생합니다. 결국 이것은 하스켈 전체를 실세계 응용 프로그램에 쓸모 없게 만들 수 있습니다. –