2011-12-10 2 views
2

아래 함수는 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)] 

답변

1

바인딩은, 랩 된 기능 -1를 반환하는 경우 errno에서 오류를 던지는 FFI 도우미 기능 throwErrnoIfMinus1_을 사용합니다. 새로운 zeromq 라이브러리는 발신자가 EINTR을 올바르게 처리 할 것으로 기대합니다. 여기서는 발생하지 않습니다.

당신은 -1errnoEINTR로 설정되어 반환하는 경우 자동으로 포장 기능을 시도 throwErrnoIfMinus1Retry_를 사용하는 라이브러리 테이너를 요청할 수 있습니다.

당신이 나에게 그늘의 IT 보인다 GHC.IO.Exception를 가져올하지 않는 한 (이 그 안에 저장된다하더라도, 당신은 IOException을 잡을 수 있습니다,하지만 난 errno의 가치를 얻는 방법을 모르는 것 같습니다

).

+0

감사합니다. 여기서 "throw"또는 "catch"로 무엇인가 고칠 수 있습니까? 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

잘못되었습니다. 높은 메시징 주파수에서는 매우 자주 발생합니다. 결국 이것은 하스켈 전체를 실세계 응용 프로그램에 쓸모 없게 만들 수 있습니다. –