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
उपयोग करने के लिए एक समारोह func
में कुछ भारी गणना अनुकरण और हास्केल में फोन कि समारोह चाहते हैं, लेकिन है कि या तो काम नहीं करता है , शायद इसी कारण से।
यह संभव है कि जीएचसी रनटाइम सिग्नल का उपयोग कर रहा है जो 'नींद' को बाधित करता है। क्या आपने त्रुटि कोड की जांच की है? शायद इसे लूप में लपेटना चाहिए यदि इसे बाधित हो जाता है (जिस स्थिति में उच्च परिशुद्धता के लिए 'नैनोस्ली' का उपयोग करना सबसे अच्छा होता है)। – Rufflewind
@Rufflewind: 'नींद' एक त्रुटि कोड नहीं लौटाता है, लेकिन सेकंड में अनसुलझा राशि: /। अभी तक 'नैनोस्ली' की कोशिश नहीं की है, लेकिन 'नींद' या तो काम नहीं करता है। – Zeta
त्रुटि कोड 'errno' चर के माध्यम से "वापस" है। लपेटें '(c_sleep 10) 'throwErrnoIf (/ = 0)" नींद "के अंदर' और आप देखेंगे कि यह बाधित हो रहा है। – Rufflewind