1

私は次のことをしました:

  1. 繰り返しトリガーする仮想タイマーを作成します。
  2. SIGVTALRM のシグナルハンドラをインストールする
  3. clone syscall を呼び出す
  4. 複製されたスレッドが別の CPU で実行されるように sched_affinity を設定します。

複製されたスレッドも SIGVTALRM をリッスンしますか? では、SIGVTALRM がトリガーされたときに、両方のスレッドがシグナル ハンドラーを呼び出すのでしょうか? また、新しいスレッドを作成した後、メインスレッドのシグナルハンドラに影響を与えることなく、SIGVTALRM のシグナルハンドラを別の関数に変更できますか?

clone() に渡されるフラグに依存していると思います。主に、CLONE_SIGHAND と SIGCHLD を使用しています。他のフラグにも依存しますか?

4

1 に答える 1

1

CLONE_THREADclone syscall に指定するかどうかに完全に依存します。そうしないと、 itimer は子に継承されません (そのため、タイマーが期限切れになったときに通知されません)。ただし、シグナルハンドラはインストールされたままです。

を指定するCLONE_THREAD、子は親と同じプロセスに属すると見なされます。タイマーが切れると、スレッドの1 つにシグナルが送信されます (そしてシグナル ハンドラーが実行されます)。ただし、どのスレッドかは指定されていません。

子のシグナル ハンドラを変更しようとするとどうなるかは、CLONE_SIGHANDフラグによって異なります。設定されていない場合、子sigactionは親に影響を与えることなくシグナル ハンドラを変更するために喜んで呼び出すことができます。ただし、CLONE_SIGHANDが設定されている場合、子プロセスが を呼び出すとsigaction、プロセス全体のシグナル ハンドラが変更されます。CLONE_THREADを指定する場合は、 も指定する必要があることに注意してくださいCLONE_SIGHAND

ただし、子は、親に影響を与えることなくsigprocmask、信号をマスクするために使用できます。SIGVTALRM

于 2010-01-27T23:56:53.743 に答える