Hi,<br><br>Yesterday I tried to implement simple tool to download pages, and wanted catch Ctrl-C (and other &#39;killing&#39; messages) from haskell to handle state saving. Without curl (when I perform some long operation) haskell throws UserInterrupt exception immediately, but if I put long operation, which downloads page from the WEB (from the far-far-away server :) ) than I noticed following issues:<br>
<br> - to break my program I have to press Ctrl-C twice<br> - haskell doesn&#39;t throw an exception<br> - when I rewrite this code to use signals, haskell, after I press Ctrl-C several times exits with error &quot;too many pending signals&quot;<br>
<br>I put the test code in the end of the letter. Shortly the longTask doesn&#39;t handle Ctrl-C and longTask&#39; handles it. <br><br>I couldn&#39;t find any solutions to this problem, I am afraid that this problem could occur in other non-native haskell modules (bindings to C libraries)<br>
<br>Many thanks in advance,<br>Vasyl pasternak<br><br>------------------------------------------<br>Test code:<br><br><br>module Main where<br><br>import Prelude hiding (catch)<br>import Network.Curl<br>import Control.Exception<br>
import Control.Monad<br>import System.IO <br><br>errorHandler defVal e = do<br>  putStrLn $ &quot;Error: &quot; ++ (show (e :: ErrorCall))<br>  return defVal<br><br>link = &quot;<a href="http://far-far-away-site.com.net">far-far-away-site.com.net</a>&quot;<br>
<br>getSite curl l = do<br>  r &lt;- do_curl_ curl l method_GET :: IO (CurlResponse)<br>  if respCurlCode r /= CurlOK<br>   then error &quot;get page failed&quot; <br>   else return $ respBody r<br><br>-- this long task doesn&#39;t throw user interrupts<br>
longTask = do<br>  putStrLn &quot;Long task started&quot;<br>  curl &lt;- initialize<br>  setopts curl [CurlCookieJar &quot;cookies&quot;]<br>  <br>  handle (errorHandler ()) $ <br>             mapM_ (\_ -&gt; getSite curl link &gt;&gt; return ()) [0..100]<br>
  return ()<br><br>-- this trows<br>longTask&#39; = do<br>  putStrLn &quot;long task started&quot;<br>  let fib n = foldr (*) 1 [1..n]<br>  h &lt;- openFile &quot;/dev/null&quot; WriteMode<br>  -- never ends<br>  mapM_ (hPutStr h . show . fib) [1..]<br>
  return ()<br><br>onAbort e = do<br>  let x = show (e :: AsyncException)<br>  putStrLn $ &quot;Aborted: &quot; ++ x<br>  return ()<br><br><br>main :: IO ()<br>main = do<br>  handle onAbort longTask<br>  putStrLn &quot;Exiting&quot;<br>
<br><br>