2

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

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

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

4

3 回答 3

2

改为这样做,将 2K 的随机数据放入myprogram

  cat /dev/urandom | head -c 2000 | ./myprogram
于 2013-04-14T11:05:54.720 回答
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并设置errnoEINTR

read()当缓冲区被填满时,ing 也会停止。

于 2013-04-14T11:15:35.253 回答
0

不久前我遇到了这样的问题。您可以使用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) {
    /* ... */
}
于 2013-04-14T12:57:32.757 回答