2017-01-04 19 views
3

このコードは何度か使用されています(write()の代わりにopen()が使用されている同様のコードもあります)。errno!= EINTR:それはどういう意味ですか?

int c = write(fd, &v, sizeof(v)); 
if (c == -1 && errno != EINTR) { 
    perror("Write to output file"); 
    exit(EXIT_FAILURE); 
} 

&& errno != EINTR場合、それはここでチェックされているのはなぜ? errno探し

は私がEINTRについては、次のテキストを見つけましたが、私は私を啓発しないman 7 signalを訪問した場合でも。

EINTR中断された関数呼び出し(POSIX.1); signal(7)を参照してください。 writeman pageから

+2

manページで 'write'を確認してください。特定のエラーでerrnoがどのように設定されているかを教えてください。 – Kevin

+1

'write()'が 'ssize_t'を返し、** not **' int'を返すことにも注意してください。彼らは同じではありません。 –

+1

ありがとうございました! @AndrewHenle私はそれを知っている、私はちょうど私がそれを見つけたようにコードの一部をコピーすることにしました:) 'int'の代わりに' ssize_t'を使ってすべて同じ質問を編集すべきだと思いますか? – Robb1

答えて

7

多くのシステムコールはEINTRエラーコードを報告します。システムコールが進行中です。実際にはエラーは発生していません。システムが自動的にシステムコールを再開できないため、そのように報告されました。このコードパターンは、割り込みが発生したときにシステムコールを再試行し、割り込みを無視します。

たとえば、プログラムがalarm()を使用して、タイマーがなくなるとコードを非同期で実行すると、この問題が発生する可能性があります。プログラムがwrite()を呼び出している間にタイムアウトが発生した場合は、再起動します。

1

:任意のデータが書き込まれた前

コールがシグナルによって中断された信号がしばらく発生した場合

+0

この回答は実際には十分ではありません。 'EINTR'が起こる(より重要なことに起こり得ない)状況を説明するものではありません。私は後者をもっと重要と考えています。なぜなら、それが通常起こり得ないことを理解できなければ、無限の貨物栽培の原因になるからです。 –

+0

@R .. *この回答は実際には十分ではありません。 'EINTR'が起こる(より重要なことに起こり得ない)状況を説明するものではありません。あなたが「カーゴカルト」システムコールをしていない場合、プロセスのシグナルマスクのようなものを変更すると、プロセスのシグナルマスクのようなものを変更することができます物事はどこでも。まったく無関係なものによって壊れる可能性のある脆弱なコードを書くのが好きなら、それはあなたの選択です。しかし、堅牢なコードを「カーゴカルチャー」と書くことを特徴づけてはいけません。 –

+0

@AndrewHenle:割り込みシグナルハンドラをインストールすることは、中断されるブロックするシステムコールのエラーアウトを*したいときに行う、侵略的かつ意図的なことです。それが起こったときに繰り返すループは、あなたが本当にその振る舞いが必要であることを知っているときだけ、一般的に意味をなさない。 –

関連する問題