我正在编写一个读取标准输入的程序。我有一个这样的循环:
while(read(0, buffer, sizeof(buffer)) > 0)
它工作正常,但当我做一个cat / dev / urandom | ./myprogram循环从不停止。所以我想在经过一段时间后停止阅读。
答案 0 :(得分:1)
这样做,将2K的随机数据输入myprogram
:
cat /dev/urandom | head -c 2000 | ./myprogram
答案 1 :(得分:1)
您可能希望使用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()
也会停止。
答案 2 :(得分:0)
不久前我遇到过这样的问题。您可以使用time
和difftime
,例如:
time_t t = time(NULL);
double max_seconds = 1.0;
while (read(0, buffer, sizeof(buffer)) > 0 && difftime(time(NULL), t) < max_seconds) {
/* ... */
}