Return to BSD News archive
Xref: sserve comp.unix.internals:7170 comp.unix.bsd:13899 comp.unix.sys5.r4:7212 Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!bunyip.cc.uq.oz.au!munnari.oz.au!news.Hawaii.Edu!ames!hookup!swrinde!cs.utexas.edu!chpc.utexas.edu!news.utdallas.edu!corpgate!bnrgate!bmerha64.bnr.ca!bcarh2ee!rakshit From: rakshit@bcarh2ee.bnr.ca (Rakshit Simha) Newsgroups: comp.unix.internals,comp.unix.bsd,comp.unix.sys5.r4 Subject: Re: Pushing/Popping Signal Catching Functions Date: 3 May 1994 19:58:12 GMT Organization: Bell-Northern Research, Ottawa, Canada Lines: 40 Sender: rakshit@bcarh2ee (Peter Channen) Distribution: world Message-ID: <2q6ack$pq1@bmerha64.bnr.ca> References: <2q63js$snd@access3.digex.net> NNTP-Posting-Host: bcarh2ee.bnr.ca In article <2q63js$snd@access3.digex.net>, masato@access.digex.net (J M Thompson) writes: |> I am writing a set of library routines in which I would like to |> catch signals, i.e. SIGTERM, but in a way that does not replace |> any signal catching functions implmented by the caller of my |> library routines. In other words, when my routine is in control, |> I'd like to "push" my signal processing routine on top and just |> before I exit, I'd like to "pop" my signal processing routine off. |> When I am in control, I want to do some specific actions when |> the signal is generated, but when control is returned to the caller, |> I'd like to restore the caller's action if there was one specified. |> |> Expressed as source code fragments: [...] |> Source for my library routines |> void libfunc1( void) { |> |> /* push my specific action, i.e., equivalent of |> signal(SIGTERM, my_term_func); |> */ *** The "signal" system call itself returns the previous disposition of that signal. You can save this in a variable of type "void (*)(int)". That is, a pointer to a function that takes a single parameter ( an integer) and returns nothing. Note that "signal" returns SIG_ERR if there is a problem. |> /* do processing libfunc1 */ |> |> /* now pop off my specific action for SIGTERM */ *** You can call "signal" again with the saved return value of the first call as the new disposition. |> return; |> } |> Also check out "sigaction". Regards, Rakshit.