Je joue avec les "nouvelles" fonctions stdio mentionnées dans la norme c11: open_memstream
et fmemopen
.Pourquoi setbuf se bloque avec le fichier open_memstream?
sur Ubuntu 16.10 Compiler avec gcc ou sur Rextester avec clang (voir lien ci-dessous)
size_t sizeloc = 0; char *bufloc = NULL;
FILE *mf = open_memstream (&bufloc, &sizeloc);
setbuf(mf, NULL); // this crashes
Appel setbuf pour le mode unbuffered sur un fichier créé avec open_memstream lancers francs SIGSEGV. (Je veux définir le mode unbuffered plutôt que d'appeler fflush
après chaque écriture.) A propos, fflush marche.)
Pourquoi setbuf (mf, NULL) se bloque? Qu'est-ce que je fais mal? Dans un fichier renvoyé par l'autre fonction, fmemopen, setbuf(mf, NULL)
fonctionne et semble fonctionner comme prévu.
Je ne sais pas d'où vous obtenez ceci, mais les deux fonctions ne sont définitivement pas C11. Ils sont POSIX 2008, et non pris en charge sur d'autres systèmes, je pense. Ils n'ont donc pas grand chose à voir avec C99 ou C11. Je supprime ces drapeaux et ajoute POSIX. –
Essayer de modifier le comportement de mise en mémoire tampon d'une fonction qui fonctionne entièrement dans la mémoire semble étrange. Ne pensez-vous pas que le fournisseur de votre implémentation a déjà optimisé cela autant que possible? La modification de la mise en mémoire tampon des fichiers qui correspondent aux périphériques est logique car ils peuvent être lents (latence ou débit), mais ici, cela n'en fait pas. De plus, vous ne pouvez accéder au tampon résultant qu'après un 'fflush'. –
Merci Jens. En fait, ce que je m'attendais à ce que ces flux de mémoire mappés soient sans tampon et leur mémoire de sauvegarde contienne immédiatement le résultat de la dernière écriture. Mais ce n'est pas le cas. Une chasse d'eau est nécessaire. C'est pourquoi j'ai essayé de définir le mode unbuffered, et il semble fonctionner avec l'un d'entre eux. – ddbug