我正在编写一个读取标准输入的程序。我有一个这样的循环:
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 也会停止。
不久前我遇到了这样的问题。您可以使用time
and difftime
,例如这样:
time_t t = time(NULL);
double max_seconds = 1.0;
while (read(0, buffer, sizeof(buffer)) > 0 && difftime(time(NULL), t) < max_seconds) {
/* ... */
}