rstewart, the problem with using message queues and semaphores is that if your program dies, the message queues and semaphores hang around, even when there's no longer any process using them. The system only allows so many message queues and semaphores globally, so a message queue leak or semaphore leak can cause problems.
pierre-luc, if you're contemplating using signals, you probably already know that you should minimize what you do inside a signal handler. It's safest to use the signal handler to set a flag, and then check that flag periodically in your code.
But if you're going to check periodically in your code, why not just forget the signal stuff and use
select()? It lets you test whether input is available on a given file descriptor (or whether a given file descriptor can accept output without waiting).
Hope this helps.