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は 1 秒後に通知されます。信号は への呼び出しを中断しますread()。に戻り-1ます。errnoEINTR

また、read()バッファがいっぱいになると ing が停止します。

于 2013-04-14T11:15:35.253 に答える