c_sleep
이 다음 코드에서 즉시 반환되는 이유는 무엇입니까?왜 잠자기가 작동하지 않습니까?
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types
import Data.Time.Clock
import Control.Concurrent
foreign import ccall unsafe "unistd.h sleep"
c_sleep :: CUInt -> IO CUInt
main :: IO()
main = do
getCurrentTime >>= print . utctDayTime
c_sleep 10 >>= print -- this doesn't sleep
getCurrentTime >>= print . utctDayTime
threadDelay $ 10 * 1000 * 1000 -- this does sleep
getCurrentTime >>= print . utctDayTime
$ ghc --make Sleep.hs && ./Sleep [1 of 1] Compiling Main (Sleep.hs, Sleep.o) Linking Sleep ... 29448.191603s 10 29448.20158s 29458.211402s $ ghc --version The Glorious Glasgow Haskell Compilation System, version 7.8.3 $ cabal --version cabal-install version 1.20.0.3 using version 1.20.0.0 of the Cabal library
참고 : 사실, 나는 함수 func
에 몇 가지 무거운 계산을 시뮬레이션하고 하스켈에 그 함수를 호출하는 C 코드에서 sleep
를 사용하고 싶지만, 그 중 하나가 작동하지 않습니다 아마 같은 이유로.
GHC 런타임이 'sleep'을 방해하는 신호를 사용하고있을 가능성이 있습니다. 오류 코드를 확인 했습니까? 아마도 인터럽트가 발생하면 루프를 다시 시작하여 다시 시작해야합니다 (이 경우 더 높은 정밀도를 위해 'nanosleep'을 사용하는 것이 가장 좋습니다). – Rufflewind
@Rufflewind :'sleep'은 오류 코드를 반환하지 않지만 초 단위의 해제 가능량은 /입니다. '나노 슬립 (nanosleep) '을 아직 시도하지 않았지만'휴면 (usleep) '도 작동하지 않습니다. – Zeta
오류 코드는'errno' 변수를 통해 "반환"됩니다. 'throwErrnoIf (/ = 0) "sleep"'안에'(c_sleep 10)'을 감싸면 중단되는 것을 볼 수 있습니다. – Rufflewind