Wenn Sie das erste Ende der Datei erreicht, wird der Eingangsstrom-Flag für EOF gesetzt. Dies muss gelöscht werden, bevor Sie den Betrieb fortsetzen können (clearerr(fp)
). Sie sollten normalerweise auch schlafen. (Mit lseek()
auf dem Dateideskriptor mit dem Strom verbunden ist, wird nicht helfen.)
Hier ist ein Programm, das auf Ihrem Code - ich hatte den Wert von PATH zu ändern (was keine besonders guter Name ist):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define PATH "demo.txt"
int main(void)
{
FILE * fp;
char * line = NULL;
size_t len = 0;
fp = fopen(PATH, "r");
if (fp == NULL)
{
perror(PATH);
exit(EXIT_FAILURE);
}
while (1)
{
if (getline(&line, &len, fp) != -1)
printf("%s",line);
else
{
printf("EOF\n");
sleep(1);
clearerr(fp);
}
}
if (line)
free(line);
return(EXIT_SUCCESS);
}
Wenn Sie ein Programm haben, das Daten zu einer Datei generiert, können Sie damit testen. Ich habe ein Programm dribbler
so macht, dass:
$ dribbler -f demo.txt -s 1.5 -r 0.5 &
[1] 20678
$ cat demo.txt
0: message written to file
1: message written to file
2: message written to file
$ tail11
0: message written to file
1: message written to file
2: message written to file
3: message written to file
4: message written to file
5: message written to file
EOF
6: message written to file
EOF
EOF
7: message written to file
EOF
8: message written to file
EOF
EOF
9: message written to file
EOF
10: message written to file
EOF
11: message written to file
EOF
EOF
^C
$
Die Optionen dribbler
sind:
Usage: dribbler [-hlntV][-s nap.time][-r std.dev][-f outfile][-i infile][-m message][-o openstr][-F format]
-V Print version information and exit
-f outfile Write to named file (dribbler.out)
-h Print this help message and exit
-i infile Read lines from input file
-l Loop back to start of input file on EOF
-m message Write message on each line of output
-n Number lines read from input file
-o openstr Flags passed to fopen() (a+)
-s nap.time Sleep for given interval between writes (1.000 second)
-r std.dev Randomize the time (Gaussian around nap.time with std.dev)
-t Write to standard output instead of file
-F format Printf format to use instead of %zu
Also, es wurde das Schreiben in die Datei demo.txt
bei einer mittleren Zeit von 1,5 Sekunden, mit einem Gaußschen Zufall Verteilung mit 0,5 Sekunden Standardabweichung. Deshalb gab es manchmal 2 EOF
Messages zwischen aufeinanderfolgenden Zeilen des Ausgangs.
Werfen Sie einen Blick [hier] (https://stackoverflow.com/questions/5474232/how-to-loop-through-only-active-file-descriptors-from-fd-set-result-from-select) – phyloflash
Sie müssen nicht suchen, wenn Sie das Ende der Datei erreichen, nur schlafen und wieder lesen – Pras