On Domingo 15 Marzo 2009, Oleg Nesterov wrote: > On 03/15, Gábor Melis wrote: > > On Domingo 15 Marzo 2009, Oleg Nesterov wrote: > > > If test_signal (SIGUSR1) is blocked, this means it is already > > > delivered, and the handler will be invoked when we return from > > > sigsegv_handler(), please see below. > > > > SIGUSR1 is delivered, its sigmask is added to the current mask but > > the handler is not yet invoked and in this instant synchronous > > sigsegv is delivered, its handler invoked? > > Can't understand the question. Could you reiterate? No need, my question was answered below. > > > When sigprocmask(SIG_UNBLOCK) returns, both signals are > > > delivered. The kernel deques 1 first, then 2. This means that the > > > handler for "2" will be called first. > > > > My mental model that matches what I quickly glean from the sources > > (from kernel/signal.c, arch/x86/kernel/signal_32.c) goes like this: > > > > - signal 1 and signal 2 are generated and made pending > > - they are unblocked by sigprocmask > > - signal 1 is delivered: signals in its mask (only itself here) are > > blocked > > yes. > > the kernel changes ip (instruction pointer) to sig_1. > > > its handler is invoked > > no. > > We never return to user-space with a pending signal. We dequeue > signal 2 too, and change ip to sig_2. > > Now, since there are no more pending signals, we return to the user > space, and start sig_2(). I see. I guess in addition to changing the ip, the stack frobbing magic arranges that sig_2 returns to sig_1 or some code that calls sig_1. From the point of view of sig_2 it seems that sig_1 is already invoked because it has its sigmask in effect and the ip in the ucontext of sig_2 points to sig_1 as the attached signal-test.c shows: sig_1=80485a7 sig_2=80485ed 2 1 eip: 80485a7 1 0 eip: b7fab424 The revised signal-delivery-order.c (also attached) outputs: test_handler=8048727 sigsegv_handler=804872c eip: 8048727 esp: b7d94cb8 which shows that sigsegv_handler also has incorrect eip in the context.