Sohaila Salah Sohaila Salah - 1 month ago 7
C Question

Sending payload with sigaction

how can I use sigaction such that a process can send a payload with the signal that can be retrieved by the receiving process?

Answer

You use a realtime signal (SIGRTMIN+0 to SIGRTMAX-0), so that the signals are queued, and you have a much lesser chance of missing one. (Standard signals are not queued, so if two signals are sent at nearly the same time, only one of them is actually delivered.)

When installing the handler using sigaction(), you use the SA_SIGINFO flag, so that the signature of the handler is

void signal_handler(int signum, siginfo_t *info, void *context)

When a signal is sent using sigqueue(), the third parameter is a pointer or an int, stored in an union of type union sigval. (For union sigval value, the int is value.sival_int, and the pointer is value.sival_ptr. In Linux, you can send a full long or unsigned long using value.sival_ptr = (void *)(unsigned long)yourval;.)

(In Linux, sizeof (long) == sizeof (void *), so you can actually send CHAR_BIT*sizeof (long) bits of information; this is 32 in 32-bit architectures, and 64 in 64-bit architectures.)

The handler can determine if a signal was sent using sigqueue() by checking if info->si_code == SI_QUEUE. The payload is then available in info->si_value union. Note that you cannot know whether the sender sent a pointer or an int, you need to know that beforehand. The sigaction() man page describes all the fields, including si_code.

Don't be confused about ->si_int, ->si_ptr, and ->si_value. The siginfo_t structure is defined so that the members si_int and si_value.sival_int refer to the exact same int, and si_ptr and si_value.sival_ptr refer to the exact same ptr. There are some extra "names" for these fields for backwards compatibility, that's all.

Remember, at times of high load, even a realtime signal can be lost. However, we routinely use signals like HUP or TERM to tell service daemons to reload their configuration or exit; so, for similar management purposes, and for informational (as opposed to crucial) messages, using signals and their payload is okay.