Почему в следующем коде 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
Примечание. На самом деле, я хотел бы использовать sleep
в коде C, чтобы смоделировать некоторые тяжелые вычисления в функции func
и вызвать эту функцию в Haskell, но это тоже не работает, вероятно, по тем же причинам.
sleep
. Вы проверили код ошибки? Возможно, вам следует заключить его в цикл, чтобы перезапустить его, если он будет прерван (в этом случае лучше использоватьnanosleep
для более высокой точности). - person Rufflewind   schedule 03.02.2015sleep
не возвращает код ошибки, но количество невыспавших в секундах: /. Еще не пробовалnanosleep
, ноusleep
тоже не работает. - person Zeta   schedule 03.02.2015errno
. Оберните(c_sleep 10)
внутрьthrowErrnoIf (/= 0) "sleep"
, и вы увидите, что это прерывается. - person Rufflewind   schedule 03.02.2015sleep
. - person Rufflewind   schedule 03.02.2015man 3 sleep
не упоминает об обновленииerrno
? Думаю, мне тоже придется написатьvoid nanosleep_loop(uint32_t)
, так какnanosleep
тоже пострадает. Билет, вероятно, отвечает на этот вопрос, поэтому не стесняйтесь добавлять его. - person Zeta   schedule 03.02.2015sleep
вообще ничего не упоминается оerrno
(вместо этого я читалnanosleep
). Однако он говорит, что если возвращаемое значение ненулевое, то это произошло из-за прерывания сигналом. - person Rufflewind   schedule 03.02.2015