42

組み込み Linux システム用のユーザー アプリケーションをプログラミングしており、デバイスに対して open、close、read、ioctl などの一般的な関数を使用しています。今、私は EINTR について読んで、関数がシグナルによって中断されたことを示していますが、その意味についてはわかりません。私が持っているすべてのサンプルプログラムでは、ioctl() のように実行されることもあれば、read() のように実行されないこともあります。だから、私は少し混乱しています。

EINTR を確認して関数呼び出しを繰り返すのが望ましいのはいつですか?

4

4 に答える 4

16

sigactionを参照してください:http://pubs.opengroup.org/onlinepubs/009695399/functions/sigaction.html

SA_RESTART
  This flag affects the behavior of interruptible functions; that is, those 
  specified to fail with errno set to EINTR. If set, and a function specified 
  as interruptible is interrupted by this signal, the function shall restart 
  and shall not fail with EINTR unless otherwise specified. If the flag is not 
  set, interruptible functions interrupted by this signal shall fail with errno 
  set to EINTR.

デフォルトでは、SA_RESTART動作があるため、シグナルを操作しない場合でも、EINTRについて心配する必要はありません。

于 2011-02-10T16:49:40.007 に答える
4

アプリケーションのイベント駆動型ですか? (メインループのインクルードselect()/epoll_wait()呼び出しを意味します)。

pselect()/epoll_pwait()イベント ドリブン アプリケーションでは、すべてのシグナルをブロックし、通話中のみブロックを解除できます。このようにして、コードの残りの部分で EINTR を処理する必要がなくなります。

于 2011-02-10T16:20:00.927 に答える
4

この質問が古いことは知っていますが、もっと言うべきことがあると思います。タイトルの特定の質問に答えるには:基本的に、決して.

とは別としてselect、(誤って/使用方法を理解していないため、またはブロッキング操作を中断できるようにしたいため) 割り込みシグナルハンドラーをインストールした場合にのみ発生する可能性があります。関数が失敗したときに再試行するためのループは、それを元に戻すだけです。そうすることは、多くのオペレーティング システムにバグがあり、非準拠の状況で生成されたと報告されていた 80 年代から 90 年代前半にかけての古いアンチ パターンですが、これらのバグはとうの昔になくなりました。pollEINTRsigactionEINTREINTR

シグナルで物事を中断できるようにしたいアプリケーションであっても、正常に完了することが非常に重要であるためEINTR、エラー状態として扱うことができず、呼び出しを完了せずに呼び出し元に戻ることができないコードが存在する可能性があります。手術。このような状況では、再試行ループをインストールすることは理にかなっているかもしれませんが、操作中にシグナル (少なくとも割り込みの可能性があるシグナル) をマスクし、終了後にマスクを解除する方がおそらく良いでしょう。

于 2020-01-17T22:33:34.017 に答える
2

read() を使用して名前付きパイプからの入力を待機しているときに、同様の問題が発生しました。

GNU libc ドキュメントでプリミティブの説明と便利なマクロを見つけました: TEMP_FAILURE_RETRY

例:

TEMP_FAILURE_RETRY (read_return = read((int)example_fifo, buffer, (size_t)n));
if (read_return==-1){
    fprintf(stderr, "reader.c: read_fifo: read(): %s \n", strerror(errno));
    fflush(stderr);
}
于 2013-02-12T09:07:33.870 に答える