cat
само по себе, нет. Он считывает входной поток до тех пор, пока ему не сообщат, что это конец файла, при необходимости блокируя ввод.
Ничто не помешает вам написать свой собственный cat
эквивалент, который будет использовать select
на стандартном вводе для тайм-аута, если ничего не произойдет достаточно быстро, и завершить работу в этих условиях.
Фактически, я однажды написал программу snail
(потому что улитка медленнее кошки), которая принимала дополнительный аргумент символов в секунду, чтобы медленно выводить файл (a) .
Таким образом, snail 10 myprog.c
будет выводить myprog.c
со скоростью десять символов в секунду. Что касается жизни, я не могу вспомнить, почему я это сделал - я подозреваю, что просто шутил, ожидая, когда появится какая-то настоящая работа.
Так как у вас проблемы с этим, вот версия dog.c
(основанная на моей вышеупомянутой программе snail
), которая будет делать то, что вы хотите:
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/select.h>
static int dofile (FILE *fin) {
int ch = ~EOF, rc;
fd_set fds;
struct timeval tv;
while (ch != EOF) {
// Set up for fin file, 5 second timeout.
FD_ZERO (&fds); FD_SET (fileno (fin), &fds);
tv.tv_sec = 5; tv.tv_usec = 0;
rc = select (fileno(fin)+1, &fds, NULL, NULL, &tv);
if (rc < 0) {
fprintf (stderr, "*** Error on select (%d)\n", errno);
return 1;
}
if (rc == 0) {
fprintf (stderr, "*** Timeout on select\n");
break;
}
// Data available, so it will not block.
if ((ch = fgetc (fin)) != EOF) putchar (ch);
}
return 0;
}
int main (int argc, char *argv[]) {
int argp, rc;
FILE *fin;
if (argc == 1)
rc = dofile (stdin);
else {
argp = 1;
while (argp < argc) {
if ((fin = fopen (argv[argp], "rb")) == NULL) {
fprintf (stderr, "*** Cannot open input file [%s] (%d)\n",
argv[argp], errno);
return 1;
}
rc = dofile (fin);
fclose (fin);
if (rc != 0)
break;
argp++;
}
}
return rc;
}
Затем вы можете просто запустить dog
без аргументов (поэтому он будет использовать стандартный ввод) и через пять секунд бездействия выведет:
*** Timeout on select
(a) На самом деле, он назывался slowcat
, но snail
намного приятнее, и я не против небольшого ревизионизма, если он заставляет историю звучать лучше: -)