Copyright (C) 2000-2012 |
GNU Info (libc.info)Pause ProblemsProblems 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. automatically generated by info2www version 1.2.2.9 |