Hi
Didn't the panding signals are checked when the system returns from Kernel
mode to User mode ?? If so then how come the two things ( Step 3,4,5 in Aruns
mail )
1) A system call is pending
2) A signal handler is running
are simultaneously possible?
Regards
Nitin
Arun Sharma wrote:
> On Thu, Oct 14, 1999 at 11:24:20AM +0530, Ghins Mathai wrote:
> > Hi,
> > SIGALRM interrupts the system calls in HPUX even when
> > signal handler is present.
> > When the signal is sent, the signal handler is called but the blocking
> >
> > system calls like "accept" are interrupted.
> >
> > Can somebody tell why does this happen on HPUX and
> > how to solve it?
>
> This is one of the ugly parts of UNIX. The signal handler executes in
> the context of the process that got the signal, instead of in a context
> of it's own.
>
> System calls are restartable on x86 Linux using the following trick.
>
> 1. User process makes a system call using the instruction: "int 0x80"
> 2. The process switches to it's kernel stack and executes the system call.
> 3. If it is a blocking system call, it sleeps.
> 4. A signal is delivered.
> 5. The signal handler gets executed on either the user stack or an alternate
> stack specified using sigaltstack. Once it is done, the signal handler
> executes a sigreturn system call. This is hidden from the programmer.
> The actual mechanism involves having executable code on the user stack
> and engineering the return address of the signal handler to jump to
> that code.
> 6. Now comes the ugly part. The EIP of the process that got the signal is
> decremented so that it reexecutes the "int 0x80", instead of the next
> instruction.
> 7. A return from syscall (iret) happens.
> 8. The processor executes int 0x80 and since it has all it's registers
> (The ones containing the syscall number and args) preserved, it
> re-executes the system call successfully.
>
> Note that it is not as easy on all processors. You have to sacrifice some
> performance and use arcane compiler switches to preserve the registers so
> that step 8 can work. So some OSes implement system call restarting by
> returning an error code and having the C library re-execute the interrupted
> system call. And my guess is that HP-UX may be one of them.
>
> The whole problem is that there can be only one system call active at
> any time per process. So you can't have your "accept" and "sigreturn"
> system call active simultaneously.
>
> A better OS design would be to spawn another thread in the same process
> and have it execute the signal handler and continue the main thread
> uninterrupted. This will completely avoid the system call restarting issue.
>
> -Arun
>
> --------------------------------------------------------------------
> The Linux India Mailing List Archives are now available. Please search
> the archive at http://lists.linux-india.org/ before posting your question
> to avoid repetition and save bandwidth.
--------------------------------------------------------------------
The Linux India Mailing List Archives are now available. Please search
the archive at http://lists.linux-india.org/ before posting your question
to avoid repetition and save bandwidth.