Queue a signal to a process
#include <signal.h> int sigqueue ( pid_t pid, int signo, const union sigval value );
If the signal terminates a process, the cleanup of the terminated process occurs by default at the priority of the thread that sent the signal. As a QNX Neutrino extension, if you OR the SIG_TERMER_NOINHERIT flag (defined in <signal.h>) into signo, the cleanup occurs at the priority of the thread that received the signal.
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The sigqueue() function causes the signal, signo to be sent with the specified value to the process, pid. If signo is zero, error checking is performed, but no signal is actually sent. This is one way of checking to see if pid is valid.
The condition required for a process to have permission to queue a signal to another process is the same as for the kill() function:
Or:
The sigqueue() function returns immediately. If SA_SIGINFO is set for signo and if the resources are available to queue the signal, the signal is queued and sent to the receiving process. If SA_SIGINFO isn't set for the signo, then signo is sent to the receiving process if the signal isn't already pending.
If pid causes signo to be generated for the sending process, and if signo isn't blocked for the calling thread and if no other thread has signo unblocked or is waiting in a sigwait() function for signo, then either signo or at least one pending unblocked signal is delivered to the calling thread before sigqueue() returns.
Should any of multiple pending signals in the range SIGRTMIN to SIGRTMAX be selected for delivery, the lowest numbered one is delivered. The selection order between realtime and nonrealtime signals, or between multiple pending nonrealtime signals, is undefined.
sysconf( _SC_SIGQUEUE_MAX )
that are still pending at the receiver(s), or a system-wide resource limit has been exceeded.
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |