0

私は次のコードを持っています:

try:
    r_l, w_l, e_l = select.select([connection_fd], [], [], timeout_secs)
except select.error as (err_no, msg):
    # get interrupted on select

私のプログラムがこれを待っている間、シグナル(SIGCHLDなど)がある場合、selectはselect.errorで中断されます。ただし、select?に入る前に保留中のシグナルがある場合でも、これが機能するかどうかはわかりません。(connection_fdソケットはブロッキングに設定されています)。

保留中のシグナルがあるのにselectが中断されない可能性はありますか?

4

1 に答える 1

0

いい視点ね。Pythonでシグナルが壊れていると思うようになりました:-(

VB9-UANIC: Python には「保留中のシグナル」という概念があります。これは、シグナル ハンドラが呼び出されたときの C レベルで、後で安全な時点でチェックされるフラグを設定するだけだからです。Python レベルのシグナル ハンドラーが存在する場合は、後でこれらの安全なポイントの 1 つからのみ呼び出されます。

これは、運が悪く、C コードが「select」システム コールを呼び出す直前にシグナルが到着した場合、C レベルのシグナル ハンドラが呼び出され、フラグが設定されますが、C コードが再開して「select」を呼び出すことを意味します。 " --- 信号が残っていないため、中断されません。

どちらかといえば、Python ではシグナルが信頼できる通信手段ではないことを示しています。ところで、それをどのように修正できるかさえわかりません:-(

編集: これはhttp://bugs.python.org/issue5315です。

于 2013-02-07T11:24:15.483 に答える