Wie bekomme ich einen FILE-Zeiger von einem Dateideskriptor?

Lesezeit: 3 Minuten

BD bei Rivenhills Benutzeravatar
BD in Rivenhill

Ich spiele mit mkstemp()der einen Dateideskriptor bereitstellt, aber ich möchte eine formatierte Ausgabe über generieren fprintf(). Gibt es eine einfache Möglichkeit, den von bereitgestellten Dateideskriptor umzuwandeln? mkstemp() in ein FILE * Struktur, die für die Verwendung mit geeignet ist fprintf()?

  • Und umgekehrt: Wie kann ich einen Dateizeiger ( FILE* ) in einen Dateideskriptor (fd) umwandeln?

    – Michael Burr

    1. Oktober 2013 um 20:37 Uhr

Benutzeravatar von Richard Pennington
Richard Pennington

Verwenden fdopen():

FILE* fp = fdopen(fd, "w");

  • Und um den Dateideskriptor von einer FILE*-Verwendung zu erhalten fileno() : linux.die.net/man/3/fileno

    – Lee Netherton

    17. Oktober 2011 um 14:28 Uhr

  • wenn fd wurde mit einigen Flaggen geöffnet (wie O_NONBLOCK) — was danach mit ihnen passieren wird fdopen öffnet es mit neuen Flaggen? Werden sie es sein xor-ed zusammen oder ersetzt?

    – xealits

    4. November 2015 um 19:09 Uhr

  • @jww: Dateideskriptoren sind zunächst kein ANSI C.

    – Rüschenwind

    2. Mai 2016 um 1:08 Uhr

  • ist es schlecht anzurufen fdopen mehrmals? (vorausgesetzt, es passiert in einer Funktion, die immer wieder aufgerufen wird)

    – phil294

    4. Juli 2017 um 23:08 Uhr


  • @xealits Die Optionen für die Datei* müssen im Bereich des bereits geöffneten Dateideskriptors liegen. Wenn Sie also fd nur mit Lesezugriff und FILE* nur mit Schreibzugriff geöffnet haben, sollte eine Ausnahme ausgelöst werden. Weitere Informationen finden Sie unter ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…

    – Tjad Clark

    6. Dezember 2017 um 7:59 Uhr


Benutzeravatar von Gregory Pakosz
Gregor Pakosz

FILE* f = fdopen(d, "w");

man fdopen-Ausgabe:

ZUSAMMENFASSUNG

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

Das fdopen() Funktion verknüpft einen Stream mit dem vorhandenen Dateideskriptor, fildes. Der Modus des Streams muss mit dem Modus des Dateideskriptors kompatibel sein. Wenn der Stream geschlossen wird über fclose(3), fildes ist auch geschlossen.

Dafür gibt es keine Standardmethode (oder umgekehrt), da der C-Standard nichts über Dateideskriptoren zu sagen hat. Ihre spezifische Plattform kann einen solchen Mechanismus bereitstellen oder nicht.

  • Kommt darauf an, was man unter “Standard” versteht. POSIX ist ein Standard.

    – Richard Pennington

    21. Dezember 2009 um 17:33 Uhr

  • Die Frage bezog sich auf Dateideskriptoren. 😉

    – Richard Pennington

    21. Dezember 2009 um 17:35 Uhr

  • @Neil > Die Frage, die als C gekennzeichnet ist, bedeutet nicht “Sag mir die heilige Wahrheit über den C-Standard”, sondern “Ich codiere in C, ich scheitere dabei, bitte sag mir, ob es möglich ist und wie? “

    – Gregory Pakosz

    21. Dezember 2009 um 17:42 Uhr

  • Ich stimme zu, dass es dafür keine Standardmethode gibt, aber die Erwähnung des OP mkstemp impliziert, dass in diesem speziellen Fall nicht standardmäßige Lösungen akzeptabel sind. In diesem Fall hätte er jedoch die hinzufügen müssen posix -Tag (das, wie ich sehe, inzwischen hinzugefügt wurde).

    – Emerick Rogul

    21. Dezember 2009 um 17:59 Uhr

  • @Neil, und der Zweck des Netzes und der Sinn des Lebens. Sie würden mehr Sinn machen, wenn Sie sagen würden, dass Sie anderer Meinung sind. Ich bezweifle auch, dass es bei SO nur um Haarspalterei über Standards geht. Und es ist nicht sehr praktisch, sich auf die Tagging-Fähigkeiten von jemandem mit einer SO-Erfahrung zu verlassen, die dem Ruf von 23 entspricht.

    – Michael Krelin – Hacker

    21. Dezember 2009 um 18:08 Uhr

1420380cookie-checkWie bekomme ich einen FILE-Zeiger von einem Dateideskriptor?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy