我正在编写一个读取标准输入的程序。我有一个这样的循环:
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在一秒钟后发出信号。该信号中断对 的调用read()。它将返回-1并设置errno为EINTR。
read()当缓冲区被填满时,ing 也会停止。
不久前我遇到了这样的问题。您可以使用timeand difftime,例如这样:
time_t t = time(NULL);
double max_seconds = 1.0;
while (read(0, buffer, sizeof(buffer)) > 0 && difftime(time(NULL), t) < max_seconds) {
/* ... */
}