Это немного сложно, так как readDataToEndOfFile
будет ждать, пока tail
не закроет выходной поток, прежде чем вернуться, но tail -f
никогда не закроет выходной поток (stdout). Однако на самом деле это довольно просто сделать с базовым кодом ввода / вывода C, поэтому я создал простой класс FileTailer
, который вы можете проверить. Это не что-то необычное, но оно должно показать вам, как это делается. Вот источники FileTailer.h
, FileTailer.m
и тестового драйвера .
Мясо этого класса довольно просто. Вы передаете ему блок, и он читает символ из потока (если это возможно) и передает его в блок; если достигнуто значение EOF, оно ожидает несколько секунд (определяется refresh
), а затем снова пытается прочитать поток.
- (void)readIndefinitely:(void (^)(int ch))action
{
long pos = 0L;
int ch = 0;
while (1) {
fseek(in, pos, SEEK_SET);
int ch = fgetc(in);
pos = ftell(in);
if (ch != EOF) {
action(ch);
} else {
[NSThread sleepForTimeInterval:refresh];
}
}
}
Вы можете назвать это довольно просто, например:
FileTailer *tail = [[[FileTailer alloc] initWithStream:stdin refreshPeriod:3.0] autorelease];
[tail readIndefinitely:^ void (int ch) { printf("%c", ch); }];
(Предостережение: я написал класс FileTailer
довольно быстро, так что он сейчас немного уродлив и его нужно немного почистить, но он должен послужить хорошим примером того, как читать файл бесконечно, à la tail -f
.)