Ошибка выполнения с привязкой 0MQ Haskell: getIntOpt: interrupted (прерванный системный вызов) - PullRequest
2 голосов
/ 10 декабря 2011

Приведенная ниже функция основана на привязках 0MQ Haskell.Я получаю ошибку во время выполнения.Ошибка говорит getIntOpt: interrupted (Interrupted system call) и программа останавливается.

Вероятно, это связано с параметрами командной строки, которые я использую, а затем отбрасываю из-за критерия?

Изменить: обнаружил, что я получаю сообщение об ошибке также, когда я оставляю свой собственный код с cmdArgs.За этим стоит гораздо более интересная проблема.Смотри последний абзац здесь .Но я до сих пор не знаю, как с этим справиться.

    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 голос
/ 10 декабря 2011

Привязки используют вспомогательную функцию FFI throwErrnoIfMinus1_, которая выдает ошибку из errno, если перенесенная функция возвращает -1.Новая библиотека zeromq ожидает, что вызывающая сторона должным образом обработает EINTR, чего здесь нет.

Вы можете попросить сопровождающего библиотеки использовать throwErrnoIfMinus1Retry_, который автоматически повторяет упакованную функцию, если она возвращает -1 и errno установлен на EINTR.

Похоже, вы можете поймать IOException, но я не знаю, как получить значение errno, даже если этохранится в нем (если вы не хотите импортировать GHC.IO.Exception, что мне кажется неясным).

...