SIGQUEUE(3) | Linux Programmer's Manual | SIGQUEUE(3) |
名前¶
sigqueue - シグナルとデータをプロセスに送る書式¶
#include <signal.h>int sigqueue(pid_t pid, int sig, const union sigval value);
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
sigqueue(): _POSIX_C_SOURCE >= 199309L
説明¶
sigqueue() は sig で指定されたシグナルを、PID が pid であるプロセスに送る。 シグナルを送るのに必要な権限は kill(2) と同じである。 kill(2) と同様に、ヌルシグナル (0) を使って 指定した PID のプロセスが存在するかをチェックすることができる。value 引き数はシグナルと一緒に送るデータの付属アイテムを指定する。 value は (整数またはポインターの値であり) 以下のような型である。
union sigval { int sival_int; void *sival_ptr; };
受取先のプロセスに、このシグナルに対するハンドラーを (sigaction(2) に SA_SIGINFO を指定して) インストールしておくと、 そのハンドラーの第 2 引き数に渡される siginfo_t 構造体の si_value フィールドによって、このデータを取得できる。 さらに、この構造体の si_code フィールドは SI_QUEUE に設定される。
返り値¶
成功した場合、 sigqueue() は 0 を返す。 これは受け取り側プロセスの待ち行列に シグナルが正しく入れられたことを示す。 失敗した場合は -1 が返され、 errno がエラーを表す値に設定される。エラー¶
バージョン¶
このシステムコールは Linux 2.2 で初めて登場した。属性¶
マルチスレッディング (pthreads(7) 参照)¶
sigqueue() 関数はスレッドセーフである。準拠¶
POSIX.1-2001.注意¶
この関数を呼び出したプロセスにこの関数がシグナルを送ったときに、 シグナルが呼び出し側スレッドにブロックされず、 かつ (シグナルがブロックされなかった、または sigwait(3) を使用するのを待っていることにより) このシグナルを扱うスレッドが何もない場合は、 この関数がリターンする前に、少なくとも そのスレッドに対してシグナルが配送されていなければならない。Linux
では、この関数は
rt_sigqueueinfo(2)
システムコールを使って実装されている。
両者には 3
番目の引き数に違いがあり、
rt_sigqueueinfo(2) では 3
番目の引き数は siginfo_t
構造体である。 siginfo_t
構造体は、シグナルを受信するプロセスのシグナルハンドラーに渡されたり、
シグナル受信プロセスの
sigtimedwait(2)
システムコールから返されたりする。
glibc の sigqueue()
ラッパー関数内部では、
この引き数 uinfo
は以下のように初期化される。
uinfo.si_signo = sig; /* Argument supplied to sigqueue() */ uinfo.si_code = SI_QUEUE; uinfo.si_pid = getpid(); /* Process ID of sender */ uinfo.si_uid = getuid(); /* Real UID of sender */ uinfo.si_value = val; /* Argument supplied to sigqueue() */
関連項目¶
kill(2), rt_sigqueueinfo(2), sigaction(2), signal(2), pthread_sigqueue(3), sigwait(3), signal(7)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部である。 プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-12-16 | Linux |