O_APPEND drapeau et lseek
Écrire un programme qui ouvre un fichier existant pour l'écriture avec la O_APPEND drapeau, et
cherche alors à le début du fichier avant d'écrire des données. D'où vient le
les données apparaissent dans le fichier? Pourquoi?
c'est mon code :
main() {
int fd = open("test.txt", O_WRONLY | O_APPEND);
lseek(fd, 0, SEEK_SET);
write(fd, "abc", 3);
close(fd);
}
et l'ai essayé et trouvé que des données ont été d'écrire à la fin du fichier, je veux comprendre pourquoi?? parce que je l'ai indiqué O_APPEND drapeau non c'est trop simple je pense
OriginalL'auteur karim | 2014-06-14
Vous devez vous connecter pour publier un commentaire.
Lorsque vous ouvrez un fichier avec
O_APPEND
, toutes les données sont écrites à la fin, quel que soit le courant de pointeur de fichier est depuis le dernier appel àlseek(2)
ou la dernière opération de lecture/écriture. À partir de laopen(2)
de la documentation:Si vous souhaitez écrire les données à la fin du fichier, puis le début de celui-ci plus tard, l'ouvrir sans
O_APPEND
, utilisezfstat(2)
pour obtenir la taille du fichier (st_size
membre au sein destruct stat
), et qui cherchent à compenser pour écrire la fin.lseek
ne sont pas ignorés. La position est à l'honneur pour la lecture, et même si vous n'avez pas lu, il est maintenu et peut être lu. Cependant, sur chaque, écrire revient à la fin du fichier.Vous pouvez également demander à la fin d'un fichier en utilisant simplement
lseek(fd, 0, SEEK_END)
(c'est à dire au lieu d'obtenir la taille du fichier).Lorsque vous ouvrez un fichier avec
O_APPEND
, toutes les données sont écrites à la fin Pas toutes les données. Par POSIX, lepwrite
fonction (ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);
) peut écrire à toute décalage: "Lapwrite()
fonction est équivalente àwrite()
, sauf qu'il écrit dans une position donnée et de ne pas modifier l'offset du fichier (peu importe siO_APPEND
est réglé)." Maispwrite()
sur Linux est cassé et ajoute des données à la fin du fichier, peu importe la valeur est passée dansoffset
.OriginalL'auteur Adam Rosenfield
En effet, O_APPEND seulement affecte le comportement de
write
, mais pas celle deread
. Quelle que soit la façon dont la position actuelle d'un fichier est modifié parlseek
,write
toujoursappend-only
.Lorsque vous
open
un fichier avecO_RDWR | O_APPEND
,read
vont commencer à partir du début du fichier.Dans le manuel de
open
(man 2 open
),Dans le manuel de
write
(man 2 write
),Dans le noyau Linux fs/ext4
syscall écrire
->vfs_write
->ext4_file_write_iter
,le
ext4_file_write_iter
appelleraext4_write_checks
alors appel
generic_write_checks
vous trouverez l'endroit où le réglage de la
pos
=file.size
La démonstration suivante peut le vérifier.
Résultat de sortie
OriginalL'auteur York Tsai
O_APPEND drapeau des forces de pointeur de fichier à la fin du fichier. donc, si vous ne lseek partir du début du fichier, il faut le fichier mis à jour le pointeur de position de début de fichier c'est à dire la position de fin de l'ancien fichier.
OriginalL'auteur Ajay Kumar