0

シグナルハンドラー内から、シグナルが処理されたときにそのように行われているシステムコールを条件付きで中断する方法を探しています。これを具体的にするために、 への呼び出しreadが処理中で、SIGRT0受信されたとします。このシグナルハンドラはSA_RESTARTシステムコールを無条件に割り込ませたくないので使っていますが、条件によってはシグナルハンドラが戻ってきたらすぐreadに返してもらいたいです。EINTR

これを行う 1 つの方法は、 の別のシグナル ハンドラーを設定し、 のハンドラーのシグナル マスクをSIGRT1入れて、ハンドラーから除外することです。次に、canのハンドラーがあり、最初の中断しないシグナルハンドラーが戻ると、2番目のハンドラーが起動して中断されます。SIGRT1SIGRT0SA_RESTARTSIGRT1SIGRT0raise SIGRT1read

このソリューションの問題点は、他のプロセスが を送信SIGRT1して、不要なEINTR発生を引き起こす可能性があることです。

私が探している結果を達成する方法はありますか?

4

2 に答える 2

0

そのシグナルを送信するように特定のプロセスを設定する場合は、任意の IPC 手法 (パイプなど) を使用して pid ID とフラグを共有し、シグナルがそのプロセスによって送信されたことを確認できます。シグナルがプロセスによって送信されなかった場合は、無視してください。

于 2011-03-22T07:32:00.273 に答える
0

私が望んでいたことは、複数の理由で不可能でした。おそらく最も重要なことは、割り込みを行うことを目的としたセカンダリ シグナルが、最初のシグナル ハンドラーが戻るとすぐに (実際にはほとんどのシステムで) 発生する可能性がありますが、中断されたシステム コールが再起動される前です。その後、syscall が再起動し、ブロックし続けます。

おそらくもっと重要なことは、ブロックしている syscall をEINTR故意に中断しようとすると、ブロックしている syscall の直前にシグナルが到着するという競合状態の影響を受けますが、シグナルを受信したためにシステムコールの作成が妨げられた後です。これが許容される唯一の場合は、「割り込み要求」が受け入れられるまで、複数の信号を発する準備ができており、それらの間の遅延が増加している場合ですが、それは不安定なハックの領域に入っています...

于 2012-02-28T14:46:07.980 に答える