!! Control-C handler example
----
 #!/usr/local/bin/scsh \
 -o sigevents -o threads -e main -s
 !#

 (define (exit-after-some-control-cs control-cs-needed)

   ;; This is crucial.  Alas, its crucialness (cruciality?) is not
   ;; clearly pointed out in the scsh manual.
   (set-interrupt-handler interrupt/int #f)

   (format #t "Hit control-C ~A times to exit.~%"
           control-cs-needed)

   (spawn (lambda ()
            (let loop ((sigevent (most-recent-sigevent)))
              (let ((next (next-sigevent sigevent interrupt/int)))
                (set! control-cs-needed (- control-cs-needed 1))

                (if (zero? control-cs-needed)
                    (begin (format #t "OK, you can go now.~%")
                           (exit 0))
                  (format #t "Hit control-C ~A more times, and I'll let you go.~%"
                          control-cs-needed))
                (loop next))))))

 (define (main args)
   (format #t "Greetings.  I'm the main program.~%")
   (exit-after-some-control-cs 3)
   (let loop ()
     (format #t "~A: main program pretending to do something useful.~%"
             (format-date "~c ~Z" (date (time))))

     ;; `sleep' appears *not* to work just like the C library function
     ;; of the same name: the latter returns immediately if a signal
     ;; arrives, whereas the former keeps chuggin'.  That's exactly
     ;; what I want; thus I don't (as I'd feared) need to use some form
     ;; of `select', as I would if this were a C program.  Nice!
     (sleep 2000)

     (loop)))