sigevent -
非同期ルーチンからの通知用の構造体
#include <signal.h>
union sigval { /* Data passed with notification */
int sival_int; /* Integer value */
void *sival_ptr; /* Pointer value */
};
struct sigevent {
int sigev_notify; /* Notification method */
int sigev_signo; /* Notification signal */
union sigval sigev_value;
/* Data passed with notification */
void (*sigev_notify_function) (union sigval);
/* Function used for thread
notification (SIGEV_THREAD) */
void *sigev_notify_attributes;
/* Attributes for notification thread
(SIGEV_THREAD) */
pid_t sigev_notify_thread_id;
/* ID of thread to signal
(SIGEV_THREAD_ID); Linux-specific */
};
sigevent
構造体は、イベントに関する情報をプロセスに通知するために様々な
API で使用される
(イベントの例としては、
非同期処理要求の完了、
タイマーの満了、
メッセージの到着など)。
「書式」に記載されている定義はおおよそのものである。
sigevent
構造体のいくつかのフィールドは、
共用体の一部として定義されているものもある。
プログラムは、
sigev_notify
で指定された値に応じたフィールドだけを利用すべきである。
sigev_notify
フィールドは、通知をどのように処理すべきかを指定する。
このフィールドは、以下のいずれかの値である。
- SIGEV_NONE
- 「空
(null)」の通知。
イベントが発生時には何もしないこと。
- SIGEV_SIGNAL
-
sigev_signo
で指定されたシグナルを送信することで、プロセスへの通知を行う。
-
sigaction(2) の SA_SIGINFO
フラグを使った登録されたシグナルハンドラーによりシグナルが捕捉されると、
シグナルハンドラーの
2
番目の引数として渡された
siginfo_t
構造体の以下のフィールドが設定される。
- si_code
- このフィールドには通知を配送した
API
に応じた決まる値が設定される。
- si_signo
- このフィールドにはシグナル番号
(すなわち sigev_signo
と同じ値)
が設定される。
- si_value
- このフィールドには
sigev_value
で指定された値が設定される。
- API によっては
siginfo_t
構造体の他のフィールドが設定される場合もある。
- シグナルを受け取ったときには
sigwaitinfo(2)
でも同じ情報が得られる。
- SIGEV_THREAD
- 「あたかも」新しいスレッドセーフの開始関数であるかのように
sigev_notify_function
を起動することで、
プロセスへの通知を行う
(実装の可能性としては、
タイマー通知の度に新しいスレッドセーフが作成される場合も、
一つのスレッドを作成してすべての通知を受信する場合もある)。
この関数は sigev_value
を唯一の引数として起動される。
sigev_notify_attributes は、 NULL
以外の場合は、
新しいスレッドセーフの属性を定義する
pthread_attr_t
構造体を指していなければならない
( pthread_attr_init(3) 参照)。
-
SIGEV_THREAD_ID (Linux 固有)
- 現在のところ POSIX
でのみ使用されている。
timer_create(2) 参照。
timer_create(2),
aio_fsync(3),
aio_read(3),
aio_write(3),
getaddrinfo_a(3),
lio_listio(3),
mq_notify(3),
aio(7),
pthreads(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。