GNU/Linux >> Linux の 問題 >  >> Linux

UNIX/Linux シグナル処理:SIGEV_THREAD

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 ボックスには今のところアクセスできません)。


Linux
  1. UnixからLinuxへの移行

  2. UNIX / Linux:10 の Netstat コマンドの例

  3. Linux と UNIX カーネルの主な違い

  1. LinuxとUnix:違いは何ですか?

  2. Linux – LinuxはUnixですか?

  3. Linux –異なるLinux / UNIXカーネルは交換可能ですか?

  1. 50 UNIX / Linux システム管理者チュートリアル

  2. UNIX / Linux:プロセスにシグナルを送信する 3 つの方法

  3. Linux / UNIX OS サービス :autofs