Problems with `pause'
---------------------
The simplicity of `pause' can conceal serious timing errors that can
make a program hang mysteriously.
It is safe to use `pause' if the real work of your program is done
by the signal handlers themselves, and the "main program" does nothing
but call `pause'. Each time a signal is delivered, the handler will do
the next batch of work that is to be done, and then return, so that the
main loop of the program can call `pause' again.
You can't safely use `pause' to wait until one more signal arrives,
and then resume real work. Even if you arrange for the signal handler
to cooperate by setting a flag, you still can't use `pause' reliably.
Here is an example of this problem:
/* `usr_interrupt' is set by the signal handler. */
if (!usr_interrupt)
pause ();
/* Do work once the signal arrives. */
...
This has a bug: the signal could arrive after the variable
`usr_interrupt' is checked, but before the call to `pause'. If no
further signals arrive, the process would never wake up again.
You can put an upper limit on the excess waiting by using `sleep' in
a loop, instead of using `pause'. (Note:Sleeping, for more about
`sleep'.) Here is what this looks like:
/* `usr_interrupt' is set by the signal handler.
while (!usr_interrupt)
sleep (1);
/* Do work once the signal arrives. */
...
For some purposes, that is good enough. But with a little more
complexity, you can wait reliably until a particular signal handler is
run, using `sigsuspend'. Note:Sigsuspend.