Signals and threads

Hi, there

If I have several threads and set a signal handler proc with Kernel::trap, what thread will actually execute the handler? Is it always guaranteed to be the main thread as I see it now?

Thank you,
Gennady.

Hi,

At Thu, 10 Jun 2004 04:22:41 +0900,
Gennady wrote in [ruby-talk:102985]:

If I have several threads and set a signal handler proc with
Kernel::trap, what thread will actually execute the handler? Is it
always guaranteed to be the main thread as I see it now?

Yes, it's a feature.

···

--
Nobu Nakada

Hi,

At Thu, 10 Jun 2004 04:22:41 +0900,
Gennady wrote in [ruby-talk:102985]:

If I have several threads and set a signal handler proc with
Kernel::trap, what thread will actually execute the handler? Is it
always guaranteed to be the main thread as I see it now?

Yes, it's a feature.

Thank you very much, Nobu. By the way, I was trying to temporarily set a signal handler with trap:

sigquit_handler = trap "SIGQUIT", "IGNORE"
... <the code spawning a process (with popen) where I want SIGQUIT

trap "SIGQUIT", sigquit_handler

I noticed that when the first trap returns nil, the second one does not restore a signal handler to "DEFAULT", as I would expect. I have to do something like that:

trap "SIGQUIT", (sigquit_handler or "DEFAULT")

Thanks again,
Gennady.

--
Nobu Nakada

Sincerely,
Gennady Bystritsky

···

On Jun 9, 2004, at 6:52 PM, nobu.nokada@softhome.net wrote:

Hi,

At Thu, 10 Jun 2004 16:37:02 +0900,
Gennady Bystritsky wrote in [ruby-talk:103056]:

sigquit_handler = trap "SIGQUIT", "IGNORE"
... <the code spawning a process (with popen) where I want SIGQUIT
>
trap "SIGQUIT", sigquit_handler

I noticed that when the first trap returns nil, the second one does not
restore a signal handler to "DEFAULT", as I would expect. I have to do
something like that:

trap "SIGQUIT", (sigquit_handler or "DEFAULT")

Which version of ruby do you use? It should return nil at the
first.

  $ ruby18 -v -e 'p trap("SIGQUIT", nil)'
  ruby 1.8.2 (2004-06-06) [i686-linux]
  "DEFAULT"

···

--
Nobu Nakada

I use 1.6.8, and there trap returns nil if no handler is currently in use. I checked in 1.8.0 and it returns "DEFAULT", just as you mentioned. Thanks a lot. I will be gradually switching to 1.8.x.

Gennady.

[linux.gfbs:274]gfb> ruby -v -e 'p trap("SIGQUIT", "IGNORE")'
ruby 1.6.8 (2003-10-15) [i686-linux]
nil
[linux.gfbs:275]gfb> ruby8 -v -e 'p trap("SIGQUIT", "IGNORE")'
ruby 1.8.0 (2003-08-04) [i686-linux]
"DEFAULT"

···

nobu.nokada@softhome.net wrote:

Hi,

At Thu, 10 Jun 2004 16:37:02 +0900,
Gennady Bystritsky wrote in [ruby-talk:103056]:

sigquit_handler = trap "SIGQUIT", "IGNORE"
... <the code spawning a process (with popen) where I want SIGQUIT

trap "SIGQUIT", sigquit_handler

I noticed that when the first trap returns nil, the second one does not restore a signal handler to "DEFAULT", as I would expect. I have to do something like that:

trap "SIGQUIT", (sigquit_handler or "DEFAULT")

Which version of ruby do you use? It should return nil at the
first.

  $ ruby18 -v -e 'p trap("SIGQUIT", nil)'
  ruby 1.8.2 (2004-06-06) [i686-linux]
  "DEFAULT"