Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pervasives.pos_out retourne des informations incorrectes #2335

Closed
vicuna opened this issue Mar 11, 2004 · 3 comments
Closed

Pervasives.pos_out retourne des informations incorrectes #2335

vicuna opened this issue Mar 11, 2004 · 3 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Mar 11, 2004

Original bug ID: 2335
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Bonjour,

Il y a des problèmes avec la sémantique du manuel de Pervasives.pos_out
quand le fichier est ouvert en mode Append.

En effet, supposons que le fichier "/tmp/toto" aie une taille non nulle,
voici ce que répond pos_out :

let out_flags = [Open_wronly ; Open_creat ; Open_append];;

val out_flags : open_flag list = [Open_wronly; Open_creat; Open_append]

let f = open_out_gen out_flags 0o666 "/tmp/toto";;

val f : out_channel =

pos_out f;;

  • : int = 0

Alors que le manuel déclare que pos out "Returns the current writing position
for the given channel". Ici pos_out devrait donc donner la taille du fichier.
Ceci dit, il ne suffit pas de changer le manuel pour dire que pos_out
implémente la sémantique Unix de lseek(fd,0,SEEK_CUR) car pour un
out_channel la position d'écriture est gérée de manière statique sans
passer par un appel système, ce qui donne le bug suivant :

output_string f "titi\n";;

  • : unit = ()

pos_out f;;

  • : int = 5

Alors que dans la sémantique Unix ceci devrait répondre "ancienne taille du
fichier + 5". Une proposition de correction est d'appeller lseek pour chaque
appel de pos_out, ou alors de gérer le cas append à chaque écriture.

Nadji

@vicuna
Copy link
Author

vicuna commented Apr 13, 2004

Comment author: administrator

Bonjour,

Il y a des problèmes avec la sémantique du manuel de Pervasives.pos_out
quand le fichier est ouvert en mode Append.

En effet, supposons que le fichier "/tmp/toto" aie une taille non nulle,
voici ce que répond pos_out :

let out_flags = [Open_wronly ; Open_creat ; Open_append];;

val out_flags : open_flag list = [Open_wronly; Open_creat; Open_append]

let f = open_out_gen out_flags 0o666 "/tmp/toto";;

val f : out_channel =

pos_out f;;

  • : int = 0

Alors que le manuel déclare que pos out "Returns the current writing position
for the given channel". Ici pos_out devrait donc donner la taille du fichier.

D'abord il y a une question de vocabulaire. Le flag Open_append ne dit pas que
la position courante est toujours la fin du fichier, il dit qu'on met la
position
courante a la fin juste avant chaque ecriture. L'equivalent en C de ton
programme
affiche 0 lui aussi, sur ma machine. Par contre, apres qu'on a fait une
ecriture, lseek
donne bien la taille du fichier si elle n'a pas change entre deux. Elle peut
changer
sans mettre a jour la position courante, par exemple:

  • si un autre processus ecrit dans le fichier
  • si on ecrit avec un autre descripteur de fichier (obtenu avec open, pas avec
    dup...)
  • si on tronque le fichier

Bref, meme en C, l'hypothese que la position courante est egale a la fin du
fichier est largement fausse.

Alors que dans la sémantique Unix ceci devrait répondre "ancienne taille du
fichier + 5". Une proposition de correction est d'appeller lseek pour chaque
appel de pos_out, ou alors de gérer le cas append à chaque écriture.

Moi je propose de documenter le fait que pos_out ne donne pas un resultat
fiable sur un fichier en mode append. Ca n'est pas tres eloigne de la
semantique
de lseek de toutes facons.

-- Damien

@vicuna
Copy link
Author

vicuna commented May 3, 2004

Comment author: administrator

Le Mardi 13 Avril 2004 17:29, Damien Doligez a écrit :

Alors que le manuel déclare que pos out "Returns the
current writing position for the given channel". Ici
pos_out devrait donc donner la taille du fichier.

D'abord il y a une question de vocabulaire. Le flag
Open_append ne dit pas que la position courante est
toujours la fin du fichier, il dit qu'on met la position
courante a la fin juste avant chaque ecriture.
Je suis d'accord, mon problème était que la description du
manuel n'explique pas le comportement observé de pos_out.

Bref, meme en C, l'hypothese que la position courante est
egale a la fin du fichier est largement fausse.
Je n'ai pas fait cette hypohèse en C. Je l'ai faite sur le
programme caml à cause de la définition.

Moi je propose de documenter le fait que pos_out ne donne
pas un resultat fiable sur un fichier en mode append. Ca
n'est pas tres eloigne de la semantique
de lseek de toutes facons.
Je ne savais pas si le fait de retourner fiablement la
position d'écriture était importante ou pas, mais un
changement de doc est le bienvenu :)

@vicuna
Copy link
Author

vicuna commented May 28, 2004

Comment author: administrator

If someone finds a fix where lseek isn't called at each pos_out operation,
fine. Otherwise, too bad.

There is such a fix, but it needs to call lseek at each write operation.
I suggest documenting the fact that pos_out gives uninteresting results for
append-mode channels. -DD

Fixed the documentation of pos_out -DD 2004-05-28

@vicuna vicuna closed this as completed May 28, 2004
@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant