OVH Cloud OVH Cloud

fstream et lockf

15 réponses
Avatar
ricky
bonjour,

j'ai un vieux code qui contient un fstream file suivi d'un tres joli
file.rdbuf()->fd() permettant de recuperer le file descriptor sur d
anciens compilo. Le tout est suivi d'un lockf(descripteur, ...) qui est
le but de l' operation :)

probleme, cela n est faisable que parceque les fstream etaient bases sur
les FILE, ce qui est un peu hors norme...

quelle est la meilleur solution de remplacement ?

la plus evidente et la moins c++ serait amha de rfemplacer les fstream
par des FILE* fichier et hop j'ai mon file descripteur

ou de trouver un bon equivalent de lockf

que me conseilleriez vous?

cordialement

5 réponses

1 2
Avatar
Michel Decima

Et mes commentaires s'adressaient non seulement à ton problème
précis, mais aussi aux certains regrets généraux que j'ai :

-- Que la norme n'a pas fourni un « hook » pour ce genre de
chose. Rien ne l'aurait empéché d'ajouter un tyepdef
system_specific_low_level_file_handle_t, et quelques
fonctions pour le connecter à un filebuf ou en recupérer
celui dont se sert le filebuf. Ensuite, évidemment, tout ce
que je fais avec ce type dépend de l'implémentation, mais
c'est à moi de décider si c'est un problème ou non.


Effectivement, c'est un peu dommage.

-- Que des implémentations sous Unix (une, au moins) se sont
éloignées des extentions standard « de facto » de ces
systèmes, et ont ôté la fonction filebuf::fd().


Il y en a plus d'une, et a vrai dire aucune de celles auxquelles
j'ai acces ici (xlC-6/AIX, g++-4.1/AIX, g++-4.1/Linux) ne propose
filebuf::fd()

Avatar
James Kanze
On Feb 7, 12:39 pm, Michel Decima wrote:

Et mes commentaires s'adressaient non seulement à ton problème
précis, mais aussi aux certains regrets généraux que j'ai :

-- Que la norme n'a pas fourni un « hook » pour ce genre de
chose. Rien ne l'aurait empéché d'ajouter un tyepdef
system_specific_low_level_file_handle_t, et quelques
fonctions pour le connecter à un filebuf ou en recupérer
celui dont se sert le filebuf. Ensuite, évidemment, tout ce
que je fais avec ce type dépend de l'implémentation, mais
c'est à moi de décider si c'est un problème ou non.


Effectivement, c'est un peu dommage.

-- Que des implémentations sous Unix (une, au moins) se sont
éloignées des extentions standard « de facto » de ces
systèmes, et ont ôté la fonction filebuf::fd().


Il y en a plus d'une, et a vrai dire aucune de celles auxquelles
j'ai acces ici (xlC-6/AIX, g++-4.1/AIX, g++-4.1/Linux) ne propose
filebuf::fd()


Ce qui n'en fait que deux:-). G++, c'est celui que je
connaissais. xlC, c'est sans doute à cause de la même raison :
ils ont remplacé leur implémentation traditionnelle avec une
complètement nouvelle, que quelqu'un a implémenté selon la
norme, sans tenir compte de l'environement où il allait servir,
ni de l'historique, ni des utilisateurs. (Quand je me servais
d'xlC, il supportait bien filebuf::fd(). Mais c'était il y a
prèsque dix ans, et l'implémentation des iostream à l'époque
était encore celui de USL.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Michel Decima

Il y en a plus d'une, et a vrai dire aucune de celles auxquelles
j'ai acces ici (xlC-6/AIX, g++-4.1/AIX, g++-4.1/Linux) ne propose
filebuf::fd()


Ce qui n'en fait que deux:-).


Ca depend comment on compte. J'ai fait le test g++ sur les deux
plateformes, parce qu'il y aurait pu avoir un comportement provenant
par exemple d'une consanguinité avec la glibc sous linux. Mais ce n'est
pas le cas, donc tu compte juste ;)


G++, c'est celui que je
connaissais. xlC, c'est sans doute à cause de la même raison :
ils ont remplacé leur implémentation traditionnelle avec une
complètement nouvelle, que quelqu'un a implémenté selon la
norme, sans tenir compte de l'environement où il allait servir,
ni de l'historique, ni des utilisateurs. (Quand je me servais
d'xlC, il supportait bien filebuf::fd(). Mais c'était il y a
prèsque dix ans, et l'implémentation des iostream à l'époque
était encore celui de USL.)


La bibliothèque standard C++ de xlC-6 est celle de Plauger:

Dinkum C++ Library - Copyright (c) 1998.
Licensed to IBM Corp. and its suppliers.
Copyright (c) 1994-1999 by P.J. Plauger.

Cette version date un peu, il doit y avoir des versions plus
recentes avec l'ajout de filebuf::fd(). Bizaremment, je n'arrive pas a
acceder au site dinkumware.com, donc je ne peux pas verifier dans la
doc). M'enfin bon, s'il y avait quelque-chose a modifier dans cette
bibliotheque, c'est pas le fd() qui me vient a l'esprit, mais plutot
les performances (std::map en particulier).


Avatar
James Kanze
Michel Decima wrote:

[...]
La bibliothèque standard C++ de xlC-6 est celle de Plauger:

Dinkum C++ Library - Copyright (c) 1998.
Licensed to IBM Corp. and its suppliers.
Copyright (c) 1994-1999 by P.J. Plauger.


Il me semble l'avoir entendu, oui.

Cette version date un peu, il doit y avoir des versions plus
recentes avec l'ajout de filebuf::fd().


Ce n'est pas dit. N'oublie pas que la bibliothèque Dinkumware
sert bien aussi en dehors des Unix. Je doute donc que cette
fonction apparaisse dans sa branche principale. J'imagine, en
revanche, que si IBM le démandait, Plauger l'ajouterait pour
eux.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Michel Decima

Ce n'est pas dit. N'oublie pas que la bibliothèque Dinkumware
sert bien aussi en dehors des Unix. Je doute donc que cette
fonction apparaisse dans sa branche principale. J'imagine, en
revanche, que si IBM le démandait, Plauger l'ajouterait pour
eux.


Oui, je sais qu'elle est utilisee ailleurs (VC++ je crois). Quand
je disais que des versions plus recentes pouvaient proposer
filebuf::fd(), je faisait bien reference a la version IBM (ou les
versions POSIX en general). Et effectivement, ce n'est absolument
pas obligatoire.

1 2