Question

En utilisant fdopen () , fileno () , il est possible d’ouvrir des flux avec des descripteurs de fichier existants. Cependant, le moyen approprié pour fermer un fichier, une fois que vous l'avez ouvert avec un flux, consiste à fclose () le pointeur FILE . Comment fermer le flux tout en conservant le descripteur de fichier ouvert?

Ce comportement s'apparente à l'appel de fflush () , puis fileno () , et de ne jamais utiliser à nouveau le pointeur FILE , sauf dans fermeture. Une autre préoccupation est que si vous répétez fdopen () , il existe désormais plusieurs pointeurs FILE et vous ne pouvez en fermer qu'un seul.

Était-ce utile?

La solution

Si vous êtes sur un système POSIXy (ce que je suppose, puisque vous avez fileno () ), vous pouvez utiliser dup () pour cloner le descripteur de fichier:

int newfd = dup(fileno(stream));
fclose(stream);

Vous pouvez également remettre à fdopen () un descripteur de fichier en double:

FILE *stream = fdopen(dup(fd), "r");

Quoi qu'il en soit, l'autre copie du fichier fd ne se fermera pas avec le FILE * . Cependant, gardez à l'esprit que le pointeur d'emplacement est partagé, soyez donc prudent si vous utilisez les deux en même temps. De même, tous les verrous fcntl () conservés sur le fd original seront libérés lorsque vous fermerez la copie.

Autres conseils

Si tout échoue, dup (2) pourrait vous aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top