Dlaczego c_sleep
wraca natychmiast w poniższym kodzie?Dlaczego sen nie działa?
{-# 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
Uwaga: Właściwie chciałbym używać sleep
w kodzie C symulować jakiś skomplikowanych obliczeń w funkcji func
i nazywają że funkcji w Haskell, ale to nie działa albo prawdopodobnie z tych samych powodów.
Możliwe, że środowisko wykonawcze GHC wykorzystuje sygnały zakłócające tryb uśpienia. Czy sprawdziłeś kod błędu? Być może powinieneś zawinąć go w pętlę, aby go zrestartować, jeśli zostanie przerwany (w takim przypadku najlepiej jest użyć 'nanosleep' dla wyższej precyzji). – Rufflewind
@Rufflewind: 'sleep' nie zwraca kodu błędu, ale kwota nieużywania w sekundach: /. Nie próbowałem jeszcze 'nanosleep', ale' usleep' też nie działa. – Zeta
Kod błędu jest "zwracany" przez zmienną 'errno'. Wrap '(c_sleep 10)' wewnątrz 'throwErrnoIf (/ = 0)" sleep "', a zobaczysz, że jest on przerywany. – Rufflewind