wait()/alarm() race condition

Sean Hamilton sh at bel.bc.ca
Sun Mar 30 18:50:35 PST 2003


Dan Nelson wrote:
| Just make sure your signal handler has the SA_RESTART flag unset
| (either via siginterrupt() if the handler was installed with signal(),
| or directly if the signal was installed with sigaction() ), and the
| signal will interrupt the wait() call.

Er, I think you've missed my problem. Or I'm not getting your solution.

I'm concerned about this order of events:

- alarm()
- wait() returns successfully
- if (alarmed...) [false]
- SIGALRM is delivered, alarmed = true
- loop
- wait() waits indefinitely

This is incredibly unlikely to ever happen, but it's irritating me somewhat
that the code isn't airtight. Bad design. Surely there is some atomic means
of setting a timeout on a system call.

sh



More information about the freebsd-hackers mailing list