struct sigevent
プロセスがシグナルを処理する方法を指定することではありません - struct sigaction
そして sigaction()
あなたがそれを行う方法です。代わりに、struct sigevent
非同期 IO の完了やタイマーの期限切れなど、非同期イベントをプロセスに通知する方法を指定するために使用されます。
sigev_notify
フィールドは、イベントの通知方法を指定します:
SIGEV_NONE
- 通知はまったくありません。残りのフィールドは無視されます。SIGEV_SIGNAL
- シグナルがプロセスに送信されます。sigev_signo
フィールドはシグナル、sigev_value
を指定します フィールドにはシグナル処理関数に渡される補足データが含まれ、残りのフィールドは無視されます。SIGEV_THREAD
- 関数が新しいスレッドで呼び出されます。sigev_notify_function
フィールドは呼び出される関数を指定しますsigev_value
関数に渡される補足データを含み、sigev_notify_attributes
スレッドの作成に使用するスレッド属性を指定します。残りのフィールドは無視されます。
SIGEV_THREAD
を設定した場合は特に注意してください。 、sigev_signo
フィールドは無視されます - struct sigevent
どちらかを指定することです シグナルを処理する方法としてスレッドを指定するのではなく、通知方法としてスレッドまたはシグナルを使用します。
struct sigevent
timer_create()
のように、関数にも渡す必要があります - 通知される非同期イベントを設定します。 struct sigevent
を作成するだけです オブジェクトは特別なことは何もしません.
専用スレッドを使用してシグナルを処理したい場合は、事前にスレッドを作成してループさせ、sigwaitinfo()
でブロックします。 . sigprocmask()
を使用 他のすべてのスレッドでシグナルをブロックします。
ここでシグナル処理のイディオムを混同していると思います。 sigevent
を作成します 構造にしてから何もせずに signal()
を使用します シグナルハンドラ内。次のコードは、コードに基づいた非常に単純なシグナル処理ルーチンを示しています。 my_handler
の定義を変更したことに注意してください .より洗練された処理が必要な場合は sigaction()
おそらく調べる必要があるシステムコールです。
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
void my_handler(int sig)
{
printf("my_handler caught\n");
signal(sig,my_handler);
}
int main()
{
signal(SIGRTMIN,my_handler);
kill(0,SIGRTMIN); // This should invoke the signal and call the function
while(1) ; // Infinite loop in case the program ends before the signal gets caught!
}
これは cygwin
で動作します 私の Windows ボックスで (Linux ボックスには今のところアクセスできません)。