4

多くの POSIX ブロッキング関数は、シグナルの場合に EINTR を返します。アイデアは、シグナルハンドラーが最初にフラグを設定し(SIGINTの場合は「停止」フラグと言う)、次にブロッキング関数がEINTRを返すブロックを解除し、アプリケーションがフラグを見て、正常なシャットダウン(または何でも)を実行することです。

ただし、pthread_mutex_lock や pthread_cond_wait などの一部のブロッキング関数では EINTR エラーは発生しません。

その背後にあるアイデアは何ですか?これらの機能を使用するアプリケーションは、シグナルをどのように処理することになっていますか (具体的には Ctrl+C)?

4

2 に答える 2

0

一般に、システム コール (低レベルの OS コール) のみが EINTR を返します。高レベルの標準ライブラリ呼び出しはそうではありません。たとえば、readandwriteは EINTR を返しますが、 printfandは返しgetsません。

一般に、 を受信したときに行うべき正しいことはEINTR、呼び出しをやり直すことです。これが、シグナル ハンドラに SA_RESTART フラグが存在する理由です。Ctrl-C を処理したい場合は、シグナルを無視しないようにする必要があります。終了のデフォルトのアクションは、あなたが望むものかもしれませんし、独自のシグナルハンドラを書いて何か他のことをすることもできます。

于 2012-10-29T21:27:14.207 に答える