読み取りシステムコールがシグナルによって中断された後に短いカウントを経験できますか?

読み取りシステムコールがシグナルによって中断された後に短いカウントを経験できますか?

read1000バイトを読み取るために呼び出したと仮定し、read501バイト目を読み取るときに信号が中断した場合、read500を返しますか?

ベストアンサー1

ファイルの種類(ディスク、ソケット、パイプ、端子)と信号タイミングに応じて、少なくとも3つの操作のいずれかを実行できます。

(a)データが送信される前に信号が到着する可能性があります。この場合、read()は-1を返し、errnoをEINTRに設定します。呼び出し側は明示的に read() を繰り返す必要があります。

(b)信号は送信が完了するまで延期され、通常どおり返される可能性があり、おそらくシグナルハンドラが呼び出された後に可能です。

(c)読み取りはエラーではなく短いカウントを返すことがあります。これは、ファイルの終わりや現在使用できなくなった場合(パイプやソケットなど)、信号のために転送が中断された場合にも発生する可能性があります。呼び出し側は、可変長部分のデータを処理するか、元の転送の意図を完了するために追加のread()呼び出しを実行して短い入力を処理する必要があります。

おすすめ記事