0

この方法でファイルから整数を読み取っています。

int v, num;
    for(;;) {
        v = read(fd, &num, sizeof(int));
        if (v == -1) {
            fprintf(stderr, "Error in read()\n");
            exit(EXIT_FAILURE);
        }
        if (v == 0) 
            break;
        [...]
    }

信号が届くとどうなりますか? errno == EINTR を管理するにはどうすればよいですか? errno==EINTR の場合、読み取りを繰り返す必要がありますか?

4

1 に答える 1

0

信号をいじっていなければ、心配する必要はありません。理由は次のとおりです。シグナルのアクションは、終了、無視、またはハンドラーの呼び出し (または停止/続行、ただしこれらは無視しましょう) のいずれかであるため、明示的にシグナルをキャッチしない限り、考える必要はありませんEINTR-発生するだけです。設定したシグナル ハンドラによって中断された場合read(2)、呼び出されて返されます。

シグナルをキャッチした場合、遅いシステム コールが自動的に再起動されるかどうかは、シグナル ハンドラを設定する前に のフィールドでSA_RESTART設定/設定解除できるフラグによって制御されます。ハンドラーが戻った後に自動的に再起動する場合は、このフラグを指定して、コードの移植性を維持する必要があります (デフォルトの動作はプラットフォームによって異なります)。sa_flagsstruct sigactionread(2)

状況によっては、 が設定されていても自動的に再起動されないインターフェイスがいくつかありますSA_RESTART。を参照しman 7 signalて一覧を表示します。

ご参考までに: 遅いシステムコールは、特定の条件下で永遠にブロックできるシステムコールです: たとえば、read()端末またはソケットからの s、open(2)FIFO、wait(2)ファミリ、ファイル ロック インターフェイス、いくつかのioctl(2)呼び出しなど。

于 2015-06-27T14:26:46.067 に答える