• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Swift program termination...
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Swift program termination...


  • Subject: Re: Swift program termination...
  • From: Randy Widell <email@hidden>
  • Date: Tue, 26 May 2015 11:29:21 -0700

Hey, thanks for the idea.  After some stumbling through documentation and other posts, I got it working.  The two biggest problems were finding a way to define SIG_IGN to prevent default handling of the signal, and I didn’t know that I had to use a global queue with a custom run loop or use dispatch_main.

So, for the record...

import Foundation

let SIG_IGN = CFunctionPointer<((Int32) -> Void)>(COpaquePointer(bitPattern: 1))

signal(SIGINT, SIG_IGN)
signal(SIGTERM, SIG_IGN)

var queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)

var done = dispatch_semaphore_create(0)

var SIGINTsrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, UInt(SIGINT), 0, queue)
dispatch_source_set_event_handler(SIGINTsrc) {
	println("Trapped SIGINT!")
	dispatch_semaphore_signal(done)
}
dispatch_resume(SIGINTsrc)

var SIGTERMsrc = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, UInt(SIGTERM), 0, queue)
dispatch_source_set_event_handler(SIGTERMsrc){
	println("Trapped SIGTERM!")
	dispatch_semaphore_signal(done)
}
dispatch_resume(SIGTERMsrc)

do
{
	var wait = dispatch_time(DISPATCH_TIME_NOW, 1000000000)

	if (dispatch_semaphore_wait(done, wait) == 0)
	{
		break
	}
} while(true)


> On May 24, 2015, at 09:58, Randy Widell <email@hidden> wrote:
>
> Ah, interesting.  I'll give that a shot, thanks.
>
>> On May 24, 2015, at 08:58, Stephen J. Butler <email@hidden> wrote:
>>
>> I think you should use GCD by creating a dispatch source of type
>> DISPATCH_SOURCE_TYPE_SIGNAL (the handle is the signal enum, eg
>> SIGTERM), add an event handler, and then resume it.
>>
>>> On Sun, May 24, 2015 at 10:40 AM, Randy Widell <email@hidden> wrote:
>>> I’m messing around with Swift to create a network server daemon.  Maybe I am thinking too much like a C / C++ programmer, but I am trying to figure out how to gracefully exit when launchd unloads the daemon.  Normally, you would just trap SIGTERM, but I’m just not finding anything online about how to do something similar in Swift.
>>> _______________________________________________
>>>
>>> Cocoa-dev mailing list (email@hidden)
>>>
>>> Please do not post admin requests or moderator comments to the list.
>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>> This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


References: 
 >Swift program termination... (From: Randy Widell <email@hidden>)
 >Re: Swift program termination... (From: "Stephen J. Butler" <email@hidden>)
 >Re: Swift program termination... (From: Randy Widell <email@hidden>)

  • Prev by Date: Re: Disabling auto-synthesis of property accessors.
  • Next by Date: Problem with Outline View and Manual Memory Management
  • Previous by thread: Re: Swift program termination...
  • Next by thread: Constraining window width to scrolling contents with autolayout
  • Index(es):
    • Date
    • Thread