標準入力を読み取るプログラムを書いています。次のようなループがあります。
while(read(0, buffer, sizeof(buffer)) > 0)
正常に動作しますが、 cat /dev/urandom | を実行すると ./myprogram ループが止まらないので、時間が経過したら読み取りを停止したいと思います。
代わりにこれを実行して、2K のランダム データを に取得しmyprogram
ます。
cat /dev/urandom | head -c 2000 | ./myprogram
を使用してアラームを設定できalarm()
ます。
alarm(1);
{
size_t ssizeReadTotal = 0;
{
ssize_t ssizeRead = 0;
while (0 < (ssizeRead = read(0, buffer + sizeReadTotal, sizeof(buffer) - sizeReadTotal)))
{
sizeReadTotal += ssizeRead;
}
if (0 > ssizeRead)
{
if (EINTR == errno))
{
fprintf(stderr, "Filling the buffer was interrupted by alarm clock.\n");
}
else /* some *real* error occurred */
{
perror("read()");
}
}
}
if (sizeof(buffer) > sizeReadTotal)
{
fprintf(stderr, "The buffer was not fully initialised!\n");
}
}
これSIGALRM
は 1 秒後に通知されます。信号は への呼び出しを中断しますread()
。に戻り-1
ます。errno
EINTR
また、read()
バッファがいっぱいになると ing が停止します。