Handle a signal: Difference between revisions

(Handle a signal en FreeBASIC)
imported>Nmz
 
(6 intermediate revisions by 6 users not shown)
Line 29:
Ada signal handlers must be defined at the library level.
The following package defines a simple signal handler for the SigInt signal.
<langsyntaxhighlight lang="ada">with Ada.Interrupts; use Ada.Interrupts;
with Ada.Interrupts.Names; use Ada.Interrupts.Names;
 
Line 42:
end Handler;
 
end Sigint_Handler;</langsyntaxhighlight>
<langsyntaxhighlight lang="ada">package body Sigint_Handler is
 
-------------
Line 71:
end Handler;
 
end Sigint_Handler;</langsyntaxhighlight>
A signal may be received at any time in a program. Ada signal handling requires a task to suspend on an entry call for the handler which is executed only when the signal has been received. The following program uses the interrupt handler defined above to deal with receipt of SigInt.
<langsyntaxhighlight lang="ada">with Ada.Calendar; use Ada.Calendar;
with Ada.Text_Io; use Ada.Text_Io;
with Sigint_Handler; use Sigint_Handler;
Line 109:
null;
end Signals;</langsyntaxhighlight>
{{out}}
<pre>
Line 124:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">Start:=A_TickCount
counter=0
SetTimer, timer, 500
Line 138:
Send, % "Task took " (A_TickCount-Start)/1000 " Seconds"
ExitApp
return</langsyntaxhighlight>
{{out}}
<pre>1
Line 149:
 
=={{header|BaCon}}==
<langsyntaxhighlight lang="freebasic">' Handle signal
SUB Finished
SIGNAL SIG_DFL, SIGINT : ' Restore SIGINT to default
Line 162:
PRINT iter
iter = iter + 1
WEND</langsyntaxhighlight>
 
{{out}}
Line 175:
This program runs only in console mode;
it must be compiled and then run as an EXE.
<langsyntaxhighlight lang="bbcbasic"> REM!Exefile C:\bbcsigint.exe,encrypt,console
INSTALL @lib$+"CALLBACK"
CTRL_C_EVENT = 0
Line 207:
WHEN CTRL_C_EVENT: CtrlC% = TRUE : = 1
ENDCASE
= 0</langsyntaxhighlight>
{{out}}
<pre>
Line 226:
 
Standard C's sleep() only provides one-second resolution, so the POSIX usleep() function is used here. (POSIX is not needed for the actual signal handling part.)
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h> // for exit()
#include <signal.h>
Line 258:
printf("Program has run for %5.3f seconds\n", td);
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 271:
Signals in C# are called events, and are handled by attaching event handler functions to the event, which are called when the event is triggered.
 
<langsyntaxhighlight lang="csharp">using System; //DateTime, Console, Environment classes
class Program
{
Line 293:
Environment.Exit(0);
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
{{trans|C}}
<langsyntaxhighlight lang="cpp">#include <chrono>
#include <csignal>
#include <ctime>
Line 329:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|Clojure}}==
Line 335:
<tt>(= (- Java verbosity) Clojure)</tt>
 
<langsyntaxhighlight Clojurelang="clojure">(require 'clojure.repl)
 
(def start (System/nanoTime))
Line 349:
(doseq [i (range)]
(prn i)
(Thread/sleep 500))</langsyntaxhighlight>
 
=={{header|COBOL}}==
Works with GnuCOBOL 2.0
<langsyntaxhighlight lang="cobol">
identification division.
program-id. signals.
Line 398:
goback.
end program handle-sigint.
</syntaxhighlight>
</lang>
 
{{out}}
Line 416:
The full list of signal number can be found on [https://en.wikipedia.org/wiki/Unix_signal#POSIX_signals].
Tested on SBCL 1.2.7 and ECL 13.5.1.
<langsyntaxhighlight lang="lisp">
(ql:quickload :cffi)
 
Line 439:
(format t "~a~&" (incf i))
(sleep 0.5)))
</syntaxhighlight>
</lang>
 
{{out}}
Line 457:
 
=={{header|Crystal}}==
<langsyntaxhighlight lang="ruby">start = Time.utc
ch = Channel(Int32 | Symbol).new
 
Line 480:
 
elapsed = Time.utc - start
puts "Program has run for %5.3f seconds." % elapsed.total_seconds</langsyntaxhighlight>
 
<pre>
Line 493:
=={{header|D}}==
{{trans|C}}
<langsyntaxhighlight Dlang="d">import core.stdc.signal;
import core.thread;
import std.concurrency;
Line 521:
auto td = sw.peek();
writeln("Program has run for ", td);
}</langsyntaxhighlight>
{{out}}
<pre>1
Line 533:
9
Program has run for 5 secs, 4 ms, 357 ╬╝s, and 4 hnsecs</pre>
 
=={{header|Erlang|escript}}==
 
<syntaxhighlight lang="erlang">#! /usr/bin/env escript
 
main([]) ->
erlang:unregister(erl_signal_server),
erlang:register(erl_signal_server, self()),
Start = seconds(),
os:set_signal(sigquit, handle),
Pid = spawn(fun() -> output_loop(1) end),
receive
{notify, sigquit} ->
erlang:exit(Pid, normal),
Seconds = seconds() - Start,
io:format("Program has run for ~b seconds~n", [Seconds])
end.
 
seconds() ->
calendar:datetime_to_gregorian_seconds({date(),time()}).
 
output_loop(N) ->
io:format("~b~n",[N]),
timer:sleep(500),
output_loop(N + 1).
</syntaxhighlight>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">open System
 
let rec loop n = Console.WriteLine( n:int )
Line 549 ⟶ 575:
loop 1
 
main()</langsyntaxhighlight>
 
=={{header|Forth}}==
Line 556 ⟶ 582:
Normally Gforth handles most signals (e.g., the user interrupt SIGINT, or the segmentation violation SIGSEGV) by translating it into a Forth THROW.
 
<langsyntaxhighlight lang="forth">-28 constant SIGINT
 
: numbers ( n -- n' )
Line 570 ⟶ 596:
<# # # # # # # [char] . hold #s #> type ." seconds" ;
 
main bye</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{Works with|gfortran}}
Must be compiled with the <code>-fcoarray=single</code> flag to enable use of atomic operations.
<syntaxhighlight lang="fortran">program signal_handling
use, intrinsic :: iso_fortran_env, only: atomic_logical_kind
implicit none
 
interface
integer(C_INT) function usleep(microseconds) bind(c)
use, intrinsic :: iso_c_binding, only: C_INT, C_INT32_T
integer(C_INT32_T), value :: microseconds
end function usleep
end interface
 
integer, parameter :: half_second = 500000
integer, parameter :: sigint = 2
integer, parameter :: sigquit = 3
 
logical(atomic_logical_kind) :: interrupt_received[*]
integer :: half_seconds
logical :: interrupt_received_ref
 
interrupt_received = .false.
half_seconds = 0
 
! "Install" the same signal handler for both SIGINT and SIGQUIT.
call signal(sigint, signal_handler)
call signal(sigquit, signal_handler)
 
! Indefinite loop (until one of the two signals are received).
do
if (usleep(half_second) == -1) &
print *, "Call to usleep interrupted."
 
call atomic_ref(interrupt_received_ref, interrupt_received)
if (interrupt_received_ref) then
print "(A,I0,A)", "Program ran for ", half_seconds / 2, " second(s)."
stop
end if
 
half_seconds = half_seconds + 1
print "(I0)", half_seconds
end do
 
contains
 
subroutine signal_handler(sig_num)
use, intrinsic :: iso_c_binding, only: C_INT
integer(C_INT), value, intent(in) :: sig_num
! Must be declared with attribute `value` to force pass-by-value semantics
! (what C uses by default).
 
select case (sig_num)
case (sigint)
print *, "Received SIGINT."
case (sigquit)
print *, "Received SIGQUIT."
end select
 
call atomic_define(interrupt_received, .true.)
end subroutine signal_handler
 
end program signal_handling</syntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">Dim Shared As Double start
start = Timer
 
Line 591 ⟶ 680:
End If
Loop
</syntaxhighlight>
</lang>
 
 
=={{header|Gambas}}==
<langsyntaxhighlight lang="gambas">hTimer As Timer
fTime As Float
 
Line 625 ⟶ 714:
fTime += 0.5
 
End</langsyntaxhighlight>
Output:
<pre>
Line 644 ⟶ 733:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 671 ⟶ 760:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 683 ⟶ 772:
=={{header|Haskell}}==
 
<langsyntaxhighlight lang="haskell">import Prelude hiding (catch)
import Control.Exception (catch, throwIO, AsyncException(UserInterrupt))
import Data.Time.Clock (getCurrentTime, diffUTCTime)
Line 697 ⟶ 786:
loop i = do print i
threadDelay 500000 {- µs -}
loop (i + 1)</langsyntaxhighlight>
 
=={{header|HicEst}}==
Subroutines "F2" to "F9" can be called any time by the F2...F9 keys or by a mouse click on the toolbar buttons "F2" to "F9". These buttons appear as soon as a SUBROUTINE "F2" to "F9" statement is compiled:
<langsyntaxhighlight HicEstlang="hicest">seconds = TIME()
 
DO i = 1, 1E100 ! "forever"
Line 712 ⟶ 801:
WRITE(Messagebox, Name) seconds
ALARM(999) ! quit immediately
END</langsyntaxhighlight>
 
==Icon and {{header|Unicon}}==
Line 718 ⟶ 807:
The following works in Unicon. I don't know if it works in Icon.
 
<langsyntaxhighlight lang="unicon">global startTime
 
procedure main()
Line 728 ⟶ 817:
procedure handler(s)
stop("\n",&now-startTime," seconds")
end</langsyntaxhighlight>
 
Sample run:
Line 746 ⟶ 835:
Use of sun.misc.SignalHandler allows one to specify which signal to catch, though is unsupported and potentially not available in all JVMs
 
<langsyntaxhighlight lang="java">import sun.misc.Signal;
import sun.misc.SignalHandler;
 
Line 765 ⟶ 854:
}
}
</syntaxhighlight>
</lang>
 
Or one can use a generic shutdown hook as follows, though a reference to the particular signal is not available.
 
<langsyntaxhighlight lang="java">public class ExampleSignalHandler {
public static void main(String... args) throws InterruptedException {
final long start = System.nanoTime();
Line 784 ⟶ 873:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 802 ⟶ 891:
=={{header|JavaScript}}==
Based on NodeJS interpreter/engine
<langsyntaxhighlight lang="javascript">(function(){
var count=0
secs=0
Line 818 ⟶ 907:
});
})();
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 835 ⟶ 924:
 
=={{header|Jsish}}==
<langsyntaxhighlight lang="javascript">/* Handle a signal, is jsish */
 
var gotime = strptime();
Line 852 ⟶ 941:
puts(loops++);
Event.update(500);
}</langsyntaxhighlight>
 
''Event.update(500)'' causes the event loop to be monitored for 500 milliseconds, sleeping when there are no events to process for the given interval. 0 would return immediately.
Line 869 ⟶ 958:
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">
<lang Julia>
ccall(:jl_exit_on_sigint, Cvoid, (Cint,), 0)
 
Line 886 ⟶ 975:
@time timeit()
println("Done.")
</syntaxhighlight>
</lang>
The tricky bit for this task is the <code>ccall</code>, which tells the <code>main()</code> running Julia to pass SIGINT on to Julia as an error. This call is not needed when running this code in Julia's REPL, which has the desired behavior by default.
{{out}}
Line 906 ⟶ 995:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.3
 
import sun.misc.Signal
Line 927 ⟶ 1,016:
Thread.sleep(500)
}
}</langsyntaxhighlight>
 
Sample output:
Line 948 ⟶ 1,037:
=={{header|Liberty BASIC}}==
Liberty BASIC cannot react to a SigInt signal and truly kill itself. The best it can do is respond to Ctrl-C by exiting normally.
<syntaxhighlight lang="lb">
<lang lb>
nomainwin
WindowHeight=DisplayHeight
Line 978 ⟶ 1,067:
if sigCtrl=1 and Inkey$=chr$(3) then sigInt=1
wait
</langsyntaxhighlight>
=={{header|Lua}}==
<syntaxhighlight lang="lua">
local start_date = os.time()
 
local loop = true
local Exit = function ()
print()
loop = false
end
 
local posix = require"posix"
posix.signal(posix.SIGINT, Exit)
posix.signal(posix.SIGQUIT, Exit)
 
local int = 0
while loop do
int = int+1
print(int)
posix.time.nanosleep{tv_sec=0,tv_nsec=500*1000*1000}
end
 
print(os.time() - start_date)
</syntaxhighlight>
{{out}}
=={{header|MATLAB}}==
MATLAB versions 6.5 (R13) and newer can no longer catch CTRL+C with a try-catch block. The onCleanup() function was introduced in version 7.6 (R2008a), possibly specifically for this situation. However, the designated onCleanup() function will execute no matter how the function ends (task completion, CTRL+C, exception), and CTRL+C will still cause an exception to be thrown and displayed.
{{works with|MATLAB|7.6 (R2008a) and later}}
<langsyntaxhighlight MATLABlang="matlab">function sigintHandle
k = 1;
tic
Line 992 ⟶ 1,104:
k = k+1;
end
end</langsyntaxhighlight>
{{out}}
<pre>>> sigintCleanup
Line 1,005 ⟶ 1,117:
{{works with|MATLAB|6.1 (R12.1) and earlier}}
{{untested|MATLAB}}
<langsyntaxhighlight MATLABlang="matlab">function sigintHandle
k = 1;
tic
Line 1,018 ⟶ 1,130:
rethrow me
end
end</langsyntaxhighlight>
 
=={{header|NewLISP}}==
<langsyntaxhighlight NewLISPlang="newlisp">; Mac OSX, BSDs or Linux only, not Windows
(setq start-time (now))
 
Line 1,032 ⟶ 1,144:
 
(while (println (++ i))
(sleep 500))</langsyntaxhighlight>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import times, os, strutils
 
let t = epochTime()
Line 1,047 ⟶ 1,159:
for n in 1 ..< int64.high:
sleep 500
echo n</langsyntaxhighlight>
Or if you prefer an exception to be thrown on SIGINT:
<langsyntaxhighlight lang="nim">import times, os, strutils
 
type EKeyboardInterrupt = object of CatchableError
Line 1,065 ⟶ 1,177:
echo n
except EKeyboardInterrupt:
echo "Program has run for ", formatFloat(epochTime() - t, precision = 0), " seconds."</langsyntaxhighlight>
 
=={{header|OCaml}}==
OCaml's <tt>Unix.sleep</tt> doesn't handle non-integral arguments, so this program prints a number every second.
 
<langsyntaxhighlight lang="ocaml">#load "unix.cma";; (* for sleep and gettimeofday; not needed for the signals stuff per se *)
 
let start = Unix.gettimeofday ();;
Line 1,085 ⟶ 1,197:
loop (n + 1)
in
loop 1;;</langsyntaxhighlight>
 
=={{header|Perl}}==
Before version 5.8 <tt>sleep</tt> requires an integer argument, so we'll spin (There exist more obtuse methods)
 
<langsyntaxhighlight lang="perl">
my $start = time; # seconds since epohc
my $arlm=5; # every 5 seconds show how we're doing
Line 1,111 ⟶ 1,223:
 
print ( ++$i," \n");
}</langsyntaxhighlight>
^C to inerrupt, ^\ to quit, takes a break at 5 seconds
1
Line 1,145 ⟶ 1,257:
 
This example does the required task:
<langsyntaxhighlight lang="perl">use 5.010;
use AnyEvent;
my $start = AE::time;
Line 1,153 ⟶ 1,265:
my $num = AE::timer 0, 0.5, sub { say $n++ };
$exit->recv;
say " interrupted after ", AE::time - $start, " seconds";</langsyntaxhighlight>
 
{{out}}
Line 1,174 ⟶ 1,286:
See builtins\pbreak.e for the low-level (inline assembly) cross platform signal handler,
and implementation of the standard hll allow_break() and check_break() routines
<!--<langsyntaxhighlight Phixlang="phix">(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span>
<span style="color: #7060A8;">allow_break</span><span style="color: #0000FF;">(</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- by default Ctrl C terminates the program</span>
Line 1,187 ⟶ 1,299:
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"The program has run for %3.2f seconds\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t</span><span style="color: #0000FF;">})</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,199 ⟶ 1,311:
=={{header|PHP}}==
{{trans|Perl}}
<langsyntaxhighlight lang="php"><?php
declare(ticks = 1);
 
$start = microtime(YEStrue);
 
function mySigHandler() {
global $start;
$elapsed = microtime(YEStrue) - $start;
echo "Ran for $elapsed seconds.\n";
exit();
Line 1,215 ⟶ 1,327:
for ($n = 0; ; usleep(500000)) // 0.5 seconds
echo ++$n, "\n";
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
Put the following into a file, set it to executable, and run it
<langsyntaxhighlight PicoLisplang="picolisp">#!/usr/bin/picolisp /usr/lib/picolisp/lib.l
 
(push '*Bye '(println (*/ (usec) 1000000)) '(prinl))
Line 1,226 ⟶ 1,338:
(loop
(println (inc 'Cnt))
(wait 500) ) )</langsyntaxhighlight>
 
=={{header|PL/I}}==
<syntaxhighlight lang="text">
handler: procedure options (main);
declare i fixed binary (31);
Line 1,245 ⟶ 1,357:
end;
end handler;
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">
$Start_Time = (Get-date).second
Write-Host "Type CTRL-C to Terminate..."
Line 1,267 ⟶ 1,379:
Write-Host "Total time in seconds"$Time_Diff
}
</syntaxhighlight>
</lang>
 
{{Out}}
Line 1,283 ⟶ 1,395:
=={{header|PureBasic}}==
This code is for Windows only due to the usage of SetConsoleCtrlHandler()
<langsyntaxhighlight PureBasiclang="purebasic">CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
CompilerError "This code is Windows only"
CompilerEndIf
Line 1,304 ⟶ 1,416:
PrintN("Program has run for "+StrF((T1-T0)/1000,3)+" seconds.")
Print ("Press ENTER to exit."):Input(): i=0
EndIf</langsyntaxhighlight>
<pre>0
1
Line 1,315 ⟶ 1,427:
=={{header|Python}}==
Simple version
<langsyntaxhighlight lang="python">import time
 
def counter():
Line 1,329 ⟶ 1,441:
break
 
counter()</langsyntaxhighlight>
The following example should work on all platforms.
<langsyntaxhighlight lang="python">import time
 
def intrptWIN():
Line 1,348 ⟶ 1,460:
intrptWIN()
tdelt = time.time() - t1
print 'Program has run for %5.3f seconds.' % tdelt</langsyntaxhighlight>
 
There is a signal module in the standard distribution
that accomodates the UNIX type signal mechanism.
However the pause() mechanism is not implemented on Windows versions.
<langsyntaxhighlight lang="python">import signal, time, threading
done = False
n = 0
Line 1,381 ⟶ 1,493:
intrptUNIX()
tdelt = time.time() - t1
print 'Program has run for %5.3f seconds.' % tdelt</langsyntaxhighlight>
 
How about this one? It should work on all platforms;
and it does show how to install a signal handler:
<langsyntaxhighlight lang="python">import time, signal
 
class WeAreDoneException(Exception):
Line 1,407 ⟶ 1,519:
 
tdelt = time.time() - t1
print 'Program has run for %5.3f seconds.' % tdelt</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(define now current-milliseconds)
Line 1,421 ⟶ 1,533:
(displayln i)
(sleep 0.5)))
</syntaxhighlight>
</lang>
{{out}}
<langsyntaxhighlight lang="racket">
0
1
Line 1,433 ⟶ 1,545:
7
Total time: 3.965
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
We note with glee that the task does not require us to print <em>consecutive</em> integers, so we'll print Fibonacci numbers instead. <tt>:-)</tt>
<syntaxhighlight lang="raku" perl6line>signal(SIGINT).tap: {
note "Took { now - INIT now } seconds.";
exit;
Line 1,446 ⟶ 1,558:
sleep 0.5;
.say;
}</langsyntaxhighlight>
{{out}}
<pre>0
Line 1,469 ⟶ 1,581:
 
<br>But, there's more than one way to skin a cat. &nbsp; (No offense to cat lovers.)
<langsyntaxhighlight lang="rexx">/*REXX program displays integers until a Ctrl─C is pressed, then shows the number of */
/*────────────────────────────────── seconds that have elapsed since start of execution.*/
call time 'Reset' /*reset the REXX elapsed timer. */
Line 1,483 ⟶ 1,595:
 
halt: say 'program HALTed, it ran for' format(time("ELapsed"),,2) 'seconds.'
/*stick a fork in it, we're all done. */</langsyntaxhighlight>
'''output'''
<pre>
Line 1,521 ⟶ 1,633:
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">t1 = Time.now
 
catch :done do
Line 1,537 ⟶ 1,649:
 
tdelt = Time.now - t1
puts 'Program has run for %5.3f seconds.' % tdelt</langsyntaxhighlight>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">
#[cfg(unix)]
fn main() {
Line 1,600 ⟶ 1,712:
}
 
</syntaxhighlight>
</lang>
 
 
=={{header|Scala}}==
{{libheader|Scala}}
<langsyntaxhighlight Scalalang="scala">import sun.misc.Signal
import sun.misc.SignalHandler
 
Line 1,624 ⟶ 1,736:
Thread.sleep(500)
}
}</langsyntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">var start = Time.sec;
 
 
Sig.INT { |_|
Sys.say( "Ran for #{Time.sec - start} seconds.");
Sys.exit;
}
 
{ |i|
Sys.say(i);
Sys.sleep(0.5);
} * Math.inf;</lang>
 
{ |i|
say i
Sys.sleep(0.5)
} * Inf</syntaxhighlight>
{{out}}
<pre>
Line 1,649 ⟶ 1,760:
 
=={{header|Smalltalk}}==
{{works with|Smalltalk/X}}<langsyntaxhighlight lang="smalltalk">|n|
 
n := 0.
Line 1,659 ⟶ 1,770:
Delay waitForSeconds: 0.5.
]
]</langsyntaxhighlight>
or:
<langsyntaxhighlight lang="smalltalk">[ ... do something... ] on: UserInterrupt do: [:exInfo | ...handler... ]</langsyntaxhighlight>
 
attaching an OS-signal (unix signal) to an exception or signal instance:
<langsyntaxhighlight lang="smalltalk">|mySignal|
mySignal := Signal new mayProceed: false.
OperatingSytem operatingSystemSignal: (OperatingSystem signalNamed:'SIGHUP') install: mySignal.
Line 1,671 ⟶ 1,782:
] on: mySignal do:[
... handle SIGHUP gracefully...
]</langsyntaxhighlight>
As the runtime system already catches common unix signals
and arranges for an OSError to be raised,
Line 1,679 ⟶ 1,790:
=={{header|Swift}}==
{{trans|C}}
<langsyntaxhighlight lang="swift">import Foundation
 
let startTime = NSDate()
Line 1,696 ⟶ 1,807:
print("Program has run for \(endTime.timeIntervalSinceDate(startTime)) seconds")
 
</syntaxhighlight>
</lang>
 
=={{header|Tcl}}==
Line 1,703 ⟶ 1,814:
 
Using Expect:
<langsyntaxhighlight lang="tcl">package require Expect
 
proc sigint_handler {} {
Line 1,718 ⟶ 1,829:
puts [incr n]
after 500
}</langsyntaxhighlight>
 
Similarly, with TclX:
<langsyntaxhighlight lang="tcl">package require Tclx
 
proc sigint_handler {} {
Line 1,736 ⟶ 1,847:
puts [incr n]
after 500
}</langsyntaxhighlight>
 
With TclX, you don't have to trap signals,
you can convert the signal into a catchable error:
<langsyntaxhighlight lang="tcl">package require Tclx
 
signal error sigint
Line 1,759 ⟶ 1,870:
puts "infinite loop interrupted, but not on SIGINT: $::errorInfo"
}
}</langsyntaxhighlight>
 
With Tcl 8.6, that would be written as:
<langsyntaxhighlight lang="tcl">package require Tclx
 
signal error sigint
Line 1,777 ⟶ 1,888:
} trap {POSIX SIG SIGINT} {} {
puts "elapsed time: [expr {[clock seconds] - $start_time}] seconds"
}</langsyntaxhighlight>
 
Note also that from 8.5 onwards, Tcl also has other mechanisms for delivering interrupt-like things, such as interpreter resource limits which permit stopping an execution after a set amount of time and returning control to a supervisor module. However, this is not driven by user interrupts and is so only tangential to ''this'' task.
Line 1,783 ⟶ 1,894:
=={{header|TXR}}==
 
<langsyntaxhighlight lang="txr">(set-sig-handler sig-int
(lambda (signum async-p)
(throwf 'error "caught signal ~s" signum)))
Line 1,794 ⟶ 1,905:
(let ((end-time (time)))
(format t "\n\n~a after ~s seconds of execution\n"
msg (- end-time start-time))))))</langsyntaxhighlight>
 
{{out|Run}}
Line 1,824 ⟶ 1,935:
that signals the shell every half a second.
 
<langsyntaxhighlight lang="bash">c="1"
# Trap signals for SIGQUIT (3), SIGABRT (6) and SIGTERM (15)
trap "echo -n 'We ran for ';echo -n `expr $c /2`; echo " seconds"; exit" 3 6 15
Line 1,830 ⟶ 1,941:
# wait 0.5 # We need a helper program for the half second interval
c=`expr $c + 1`
done</langsyntaxhighlight>
 
{{works with|bash}}
Note that the following solution only works on systems
that support a version of sleep that can handle non-integers.
<langsyntaxhighlight lang="bash">
#!/bin/bash
trap 'echo "Run for $((s/2)) seconds"; exit' 2
Line 1,846 ⟶ 1,957:
let s++
done
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,864 ⟶ 1,975:
with a 5 tenths of a second timeout:
 
<langsyntaxhighlight lang="bash">#!/bin/bash
trap 'echo "Run for $((s/2)) seconds"; exit' 2
s=1
Line 1,882 ⟶ 1,993:
half_sec_sleep
let s++
done</langsyntaxhighlight>
 
{{works with|zsh}}
<langsyntaxhighlight lang="bash">TRAPINT(){ print $n; exit }
for (( n = 0; ; n++)) sleep 1</langsyntaxhighlight>
 
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<langsyntaxhighlight lang="vbnet">Module Module1
Dim startTime As Date
 
Line 1,912 ⟶ 2,023:
End Sub
 
End Module</langsyntaxhighlight>
 
=={{header|Visual FoxPro}}==
<langsyntaxhighlight lang="vfp">
*!* In VFP, Ctrl+C is normally used to copy text to the clipboard.
*!* Esc is used to stop execution.
Line 1,939 ⟶ 2,050:
lLoop = .F.
ENDPROC
</syntaxhighlight>
</lang>
 
=={{header|Wren}}==
Note that Thread.sleep not only suspends the current fiber but also the System.clock method (possibly unintended). We therefore have to add back on the time slept.
<langsyntaxhighlight ecmascriptlang="wren">import "scheduler" for Scheduler
import "timer" for Timer
import "io" for Stdin
Line 1,970 ⟶ 2,081:
}
Stdin.isRaw = false
stop = true</langsyntaxhighlight>
 
{{out}}
Line 1,996 ⟶ 2,107:
It is entirely possible to do this entirely in syscalls using sys_nanosleep/sys_write but that would require allot more work,
definition of the timespec structure among other things.
<langsyntaxhighlight lang="asm">
%define sys_signal 48
%define SIGINT 2
Line 2,050 ⟶ 2,161:
start_time resd 1
end_time resd 1
</syntaxhighlight>
</lang>
 
=={{header|zkl}}==
SigInt is the only signal zkl brings out.
<langsyntaxhighlight lang="zkl">var t=Time.Clock.time;
try{ n:=0; while(1){(n+=1).println(); Atomic.sleep(0.5)} }
catch{ println("ran for ",Time.Clock.time-t," seconds"); System.exit() }</langsyntaxhighlight>
{{out}}
<pre>
Anonymous user