Skip to content

Instantly share code, notes, and snippets.

@sharplet
Created November 23, 2015 03:46
Show Gist options
  • Save sharplet/d640eea5b6c99605ac79 to your computer and use it in GitHub Desktop.
Save sharplet/d640eea5b6c99605ac79 to your computer and use it in GitHub Desktop.
Simple signal handling in Swift
import Darwin
enum Signal: Int32 {
case HUP = 1
case INT = 2
case QUIT = 3
case ABRT = 6
case KILL = 9
case ALRM = 14
case TERM = 15
}
func trap(signal: Signal, action: @convention(c) Int32 -> ()) {
// From Swift, sigaction.init() collides with the Darwin.sigaction() function.
// This local typealias allows us to disambiguate them.
typealias SignalAction = sigaction
var signalAction = SignalAction(__sigaction_u: unsafeBitCast(action, __sigaction_u.self), sa_mask: 0, sa_flags: 0)
withUnsafePointer(&signalAction) { actionPointer in
sigaction(signal.rawValue, actionPointer, nil)
}
}
trap(.INT) { signal in
print("intercepted signal \(signal")
}
print("going to sleep...")
sigsuspend(nil)
@ConsoleTVs
Copy link

FWIW, this is not needed anymore in Swift 3. You can directly call:

signal(SIGINT) { s in print("signal") }

from anywhere. :)

The fact that you have to go around the internet looking for something as simple as this is impressive. THANK YOU. You're the one one that show that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment