[swift-dev] Glibc struct sigaction and sigaction

Joseph Bell joe at iachieved.it
Sun Jan 10 23:01:15 CST 2016


Not sure if anyone has ran into this use case before; thought I'd ask.

On many Unices the sigaction function is used to trap receipt of a signal
and run a signal handler action.  I want to use this to trap SIGINT and I
think Swift's presentation of Glibc is leaving the struct sigaction
definition masked by the function definition (see man 2 sigaction).

Example:

import Glibc

enum Signal: Int32 {
  case HUP    = 1
  case INT    = 2
  case QUIT   = 3
  case ABRT   = 6
  case KILL   = 9
  case ALRM   = 14
  case TERM   = 15
}

typealias SignalHandler = (Int) -> Void

func trap(signal:Signal, action:SignalHandler) {
  var act:sigaction = sigaction() // would expect this to be struct
  act.sa_handler = &action        // but woe, it is not
  sigaction(signal.rawValue, &act, nil)
}

trap(.INT) { signal in
  print("Intercepted signal \(signal)")
}

print("going to sleep...")
sigsuspend(nil)

This code gives:

sighandle.swift:17:3: error: value of type 'sigaction' has no member
'sa_handler'
  act.sa_handler = &action        // but woe, it is not

Any ideas of working around this or alternative approach to trapping
signals on Linux with Swift?

Joe

Credit for original to Adam Sharp's gist at
https://gist.github.com/sharplet/d640eea5b6c99605ac79

-- 
---
http://dev.iachieved.it/iachievedit/
@iachievedit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160110/5818b581/attachment.html>


More information about the swift-dev mailing list