Great information, thanks all!

-Mark

On Mon, Apr 20, 2015 at 6:15 PM, Sorin Manolache <sor...@gmail.com> wrote:

> On 2015-04-20 21:50, Mark Taylor wrote:
>
>> I found that ./server/mpm_unix.c is registering a handler (sig_coredump)
>> for SIGFPE, SIGSEGV, and other synchronous signals.  I'd like to handle at
>> least these two in my module, using my own handler.  But then how do I
>> determine if the the handler is called on a request thread or a server
>> thread? And I'd like to default to still run the sig_coredump() function
>> if
>> it's signal is not in my module.
>>
>>
> Have a look at the man-page of sigaction and getcontext. When you set a
> signal handler you get the old signal handler (3rd argument of sigaction).
> So you can store it in a variable. In your own signal handler you do want
> you intend to do and at the end you call the old signal handler. In this
> way you can call sig_coredump. However you have to make sure that you set
> your signal handler _after_ apache has set his. Otherwise apache will
> replace yours.
>
> Have a look at the siginfo_t structure that is passed by the OS to your
> handler. You can get the program ID and the user ID from that structure.
> But not the thread apparently. Anyway, at least you can determine if the
> signal was raised in the parent or one of the worker children.
>
> Look also at the ucontext structure (man getcontext) that is passed to
> your signal handler. Maybe you can determine the source of the signal from
> that structure, though I think it's too close to machine code and registers
> to be useful.
>
> Alternately, you could use a thread-local variable (
> https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Thread-Local.html). The first
> thing you do when you enter each function of your module is to set the
> variable. Whenever you exit a function you reset it. Thus, you may
> determine in your signal handler by inspection of the variable if the
> signal was raised by your module. (This works only if the signal handler is
> executed in the thread where the signal was raised which is not always the
> case. Otherwise you'll set some variable in your thread and read another
> one in the handler. Here's some information:
> http://stackoverflow.com/questions/11679568/signal-handling-with-multiple-threads-in-linux.
> Apparently the handlers for SIGSEGV and SIGFPE are called in the thread
> that raised them but it's not clear.)
>
> Sorin
>
>
>

Reply via email to