1

私はPythonを初めて使用するので、この質問が非常に基本的なものである場合はご容赦ください。

select モジュールを使用してソケットからデータを受け取りながら、キーボード割り込みを処理しようとしています。そのため、ソケットからのデータを待機し、それをコンソールに出力する select.select() 関数呼び出しがあります。

CTRL_C を押すと、select.error が発生したり、exceptions.IOError 例外が発生したりすることがあるようです。対応するエラー コードは、両方の例外で 4 です。

コール スタックの奥深くで KeyboardInterrupt 例外を処理するコードがいくつかあるため、ソケット接続を受け入れる関数で SIGINT を取得すると、KeyboardInterrupt 例外を再発生させたいだけです。また、接続関連の例外をキャッチしたいと考えています。

例外のエラー コードを確認し、それが 4 の場合は KeyboardInterrupt を発生させても安全でしょうか? これは、接続関連の例外をキャッチする能力に影響しますか? エラー コードに関する適切なリソースはありますか?

ありがとう!

4

1 に答える 1

1

errno.EINTR代わりに使用してください。安全。

>>> import errno
>>> errno.EINTR
4

ただし、これはどのシグナルがシステム コールを中断したかを示すのではなく、何らかのシグナルがシステム コールを中断したことだけを示します。

男 2から選択:

EBADF セットの 1 つで無効なファイル記述子が指定されました。(あたり-
       すでに閉じられているファイル記述子、または
       エラーが発生しました。)

EINTR シグナルが捕捉されました。signal(7) を参照してください。

EINVAL nfds が負であるか、timeout に含まれる値が
       無効。

ENOMEM が内部テーブルにメモリを割り当てることができません。
于 2011-09-08T21:23:49.980 に答える