📄 pthread_sigmask.man
字号:
.TH PTHREAD_SIGNAL 3 LinuxThreads.XREF pthread_kill.XREF sigwait.SH NAMEpthread_sigmask, pthread_kill, sigwait \- handling of signals in threads.SH SYNOPSIS#include <pthread.h>.br#include <signal.h>int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);int pthread_kill(pthread_t thread, int signo);int sigwait(const sigset_t *set, int *sig);.SH DESCRIPTION!pthread_sigmask! changes the signal mask for the calling thread asdescribed by the |how| and |newmask| arguments. If |oldmask| is not!NULL!, the previous signal mask is stored in the location pointed toby |oldmask|. The meaning of the |how| and |newmask| arguments is the same as for!sigprocmask!(2). If |how| is !SIG_SETMASK!, the signal mask is set to|newmask|. If |how| is !SIG_BLOCK!, the signals specified to |newmask|are added to the current signal mask. If |how| is !SIG_UNBLOCK!, thesignals specified to |newmask| are removed from the current signalmask.Recall that signal masks are set on a per-thread basis, but signalactions and signal handlers, as set with !sigaction!(2), are sharedbetween all threads.!pthread_kill! send signal number |signo| to the thread|thread|. The signal is delivered and handled as described in!kill!(2).!sigwait! suspends the calling thread until one of the signalsin |set| is delivered to the calling thread. It then stores the numberof the signal received in the location pointed to by |sig| andreturns. The signals in |set| must be blocked and not ignored onentrance to !sigwait!. If the delivered signal has a signal handlerfunction attached, that function is |not| called..SH CANCELLATION!sigwait! is a cancellation point..SH "RETURN VALUE"On success, 0 is returned. On failure, a non-zero error code is returned..SH ERRORSThe !pthread_sigmask! function returns the following error codeson error:.RS.TP!EINVAL!|how| is not one of !SIG_SETMASK!, !SIG_BLOCK!, or !SIG_UNBLOCK!.TP!EFAULT!|newmask| or |oldmask| point to invalid addresses.REThe !pthread_kill! function returns the following error codeson error:.RS.TP!EINVAL!|signo| is not a valid signal number.TP!ESRCH!the thread |thread| does not exist (e.g. it has already terminated).REThe !sigwait! function never returns an error..SH AUTHORXavier Leroy <Xavier.Leroy@inria.fr>.SH "SEE ALSO"!sigprocmask!(2),!kill!(2),!sigaction!(2),!sigsuspend!(2)..SH NOTESFor !sigwait! to work reliably, the signals being waited for must beblocked in all threads, not only in the calling thread, sinceotherwise the POSIX semantics for signal delivery do not guaranteethat it's the thread doing the !sigwait! that will receive the signal.The best way to achieve this is block those signals before any threadsare created, and never unblock them in the program other than bycalling !sigwait!..SH BUGSSignal handling in LinuxThreads departs significantly from the POSIXstandard. According to the standard, ``asynchronous'' (external)signals are addressed to the whole process (the collection of allthreads), which then delivers them to one particular thread. Thethread that actually receives the signal is any thread that doesnot currently block the signal.In LinuxThreads, each thread is actually a kernel process with its ownPID, so external signals are always directed to one particular thread.If, for instance, another thread is blocked in !sigwait! on thatsignal, it will not be restarted.The LinuxThreads implementation of !sigwait! installs dummy signalhandlers for the signals in |set| for the duration of the wait. Sincesignal handlers are shared between all threads, other threads must notattach their own signal handlers to these signals, or alternativelythey should all block these signals (which is recommended anyway --see the Notes section).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -