2016-05-09 10 views
0

ich über Art bin verwirrt, wie Datei Löcher auf Linux arbeiten:wie Datei Löcher in Linux arbeiten

int fd = open("/tmp/file1", O_RDWR | O_TRUNC); 
    write(fd, "bbbb", 4); 
    lseek(fd, SEEK_SET, 10000); 
    write(fd, "aaaa", 4); 
    lseek(fd, SEEK_SET, 50); 
    write(fd, "cccc", 4); 
    close(fd); 

warum cat/tmp/file1

bbbbaaaacccc 

produzieren? sollte es nicht bbbcccaaa sein? da aaaa bei einem Offset von 10000 geschrieben wird?

Update: Lseeks Rückkehr -1 mit EINVAL.

+1

Sind Sie sicher, dass 'lseek' in allen Anrufen erfolgreich ist? Sie überprüfen seinen Ergebniscode nicht. –

+0

es gibt EINVAL zurück, aber warum? –

+0

Aus den Gründen in der man-Seite angegeben. –

Antwort

3

Seit "Sind Sie sicher, dass Lseek in allen Aufrufen erfolgreich ist? Sie überprüfen seinen Ergebniscode nicht." geholfen, ein Problem zu identifizieren würde ich nur hinzufügen, nachdem das Dateisystem Anrufe recomend:

int res = lseek(fd, 10000, SEEK_SET); 
    if (res == -1) { 
    perror("lseek has failed"); 
    return 1; 
    } 

Sie Problem ist, dass Sie die Parameter in einer falschen Reihenfolge verwenden:

lseek(fd, SEEK_SET, 10000); /* WRONG order for second and third parametes ! */ 

Die richtige Reihenfolge:

lseek(fd, 10000, SEEK_SET); 

Hier ist ein Mann lseek:

off_t lseek(int fd, off_t offset, int whence); 

The lseek() function repositions the file offset of the open file 
description associated with the file descriptor fd to the argument 
offset according to the directive whence as follows: 

SEEK_SET 
     The file offset is set to offset bytes. 

SEEK_CUR 
     The file offset is set to its current location plus offset bytes. 

SEEK_END 
     The file offset is set to the size of the file plus offset 
       bytes. 
+0

Danke für die Antwort, wie ich bereits kommentiert, es gibt EINVAL zurück: der resultierende Datei-Offset wäre negativ oder über das Ende eines suchbaren Geräts. aber wie erstelle ich dann Datei Loch? –

+0

Meine Kopie der 'lseek'-Manpage sagt:" ** EINVAL: ** * Wobei * nicht gültig ist. Oder: Der resultierende Datei-Offset wäre negativ oder über das Ende eines suchbaren Geräts hinaus. " Sie erhalten EINVAL aus dem ersten dieser Gründe (* wo * nicht gültig ist), weil Sie die Parameter in der falschen Reihenfolge haben, wie Sergei sagt. – zwol