Each process has a signal queue described by a SIGPENDING structure. It has three members. Head points to the first SigQueue member, Tail pointing to the NEXT pointer of the last Sigqueue member, Signal describes the signal set in this queue .Static int send_signal (int sig, struct siginfo * info, struct sigpending * signals); and the corresponding signal sig info message structure added to the signal in the signal queue .static int collect_signal (int sig, struct sigpending * list, siginfo_t * info); returns Information INFO in the queue List in the queue.
struct task_struct {... struct sigpending pending; ...}; struct sigpending {struct sigqueue * head, ** tail; sigset_t signal;}; struct sigqueue {struct sigqueue * next; siginfo_t info;}; // kernel / signal .cstatic int send_signal (int sig, struct siginfo * info, struct sigpending * signals) {struct sigqueue * q = NULL; / * Real-time signals must be queued if sent by sigqueue, or some other real-time mechanism It is. implementation defined whether kill () does so. We attempt to do so, on the principle of least surprise, but since kill is not allowed to fail with EAGAIN when low on memory we just make sure at least one signal gets delivered and do not pass on the info struct * / if (atomic_read (& nr_queued_signals)