2016-08-02 11 views
0
int main(int argc, char *argv[]) 

{ 

int i, j, count; 
int f1; 
char buf[16]; 
f1 = open(argv[1], O_RDWR | O_APPEND); 
if(f1 == -1) 
    perror("open failed"); 

if(lseek(f1, 0, SEEK_SET) == -1) 
    printf("lseek failed\n"); 


while(count = read(0, buf, 16)) { 
    write(f1, buf, count); 
} 

close(f1); 
return 0; 
} 

Dies ist mein Code. Es öffnet Dateien, die als Argument übergeben werden, und sollte am Anfang der Datei alles aus der Konsole schreiben. Die Datei wird im Append-Modus geöffnet, und dann wird lseek verwendet, um den Deskriptor an den Anfang zu verschieben. Es gibt keine Änderung in dem Wert von f1, es druckt nicht, dass lseek fehlgeschlagen ist.lseek funktioniert nicht mit Append-Modus der Datei

Antwort

0

Wenn die Datei als O_APPEND-Modus geöffnet wurde, wurde bei jedem Aufruf von write() der Offsetzeiger zum Ende der Datei verschoben, um die atomare Operation zu bearbeiten.

Dies verwendet zu dem Zweck von vielen Prozess "Text" in die Datei anhängen. (ZB Protokolldatei) als nur von am Ende der Datei.

So versucht, Code zu ändern:

geöffnete Datei nur in O_RWONLY Flag (wenn Bedarf EOF zu suchen, um die lseek zu verwenden()).

ohne das O_APPEND-Flag in open() zu verwenden, hat write() den Offset bei jedem Aufruf nicht automatisch zum EOF verschoben.