如何停止阅读“cat / dev / urandom”?

时间:2013-04-14 11:01:53

标签: c cat

我正在编写一个读取标准输入的程序。我有一个这样的循环:

while(read(0, buffer, sizeof(buffer)) > 0)

它工作正常,但当我做一个cat / dev / urandom | ./myprogram循环从不停止。所以我想在经过一段时间后停止阅读。

3 个答案:

答案 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)

不久前我遇到过这样的问题。您可以使用timedifftime,例如:

time_t t = time(NULL);
double max_seconds = 1.0;
while (read(0, buffer, sizeof(buffer)) > 0 && difftime(time(NULL), t) < max_seconds) {
    /* ... */
}