“fprintf”-ähnliche Funktion für Dateideskriptoren (dh int fd statt FILE* fp)

Lesezeit: 4 Minuten

Benutzer-Avatar
Werden

Vielleicht vermisse ich es nur, aber gibt es keine Funktion, die fprintf für Dateideskriptoren entspricht, oder sogar eine Möglichkeit, vorübergehend zwischen ihnen umzuschalten?

Benutzer-Avatar
Eiskriminalität

Du könntest reinschauen dprintf (GNU-Erweiterungen, nicht in C oder POSIX) :

Die Funktionen dprintf() und vdprintf() (wie sie in der glibc2-Bibliothek zu finden sind) sind exakte Entsprechungen von fprintf() und vfprintf(), außer dass sie an einen Dateideskriptor fd statt an einen gegebenen Stream ausgeben.

BEARBEITEN Wie einige von Ihnen in den Kommentaren darauf hingewiesen haben, hat POSIX 2008 diese Funktionen standardisiert.

  • Vielen Dank! Sehr interessant, hatte keine Ahnung, dass es die gibt.

    – Prof. Falken

    22. November 2010 um 15:01 Uhr

  • Ich auch nicht. Da diese App nur unter Linux läuft, könnte dies das sein, was ich brauche. Die plattformübergreifende Kompatibilität ist kein Problem, daher sollte die Verwendung der GNU-Erweiterung in Ordnung sein.

    – Werden

    22. November 2010 um 15:11 Uhr

  • Wenn die Portabilität keine Rolle spielt, entscheiden Sie sich für diese.

    – Arkku

    22. November 2010 um 15:20 Uhr

  • Tatsächlich hat POSIX 2008 diese Funktionen standardisiert.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    22. November 2010 um 15:48 Uhr

Benutzer-Avatar
Arkku

Es gibt keine Standardfunktion für C oder POSIX (Bearbeitung: vor 2008). printf auf einem Dateideskriptor, aber Sie können einen Dateideskriptor als FILE * mit dem POSIX-Standard fdopen(int desc, const char *mode). Ich bin mir nicht sicher, wie gut das Umschalten auf die direkte Verwendung des Deskriptors unterstützt wird, aber ich vermute, dass es funktionieren könnte, wenn Sie zuerst den Puffer leeren …

Natürlich könnten Sie einfach Ihre eigenen implementieren, indem Sie so etwas wie verwenden vsprintfaber natürlich müssen Sie sich dann um die Pufferung kümmern.

  • Ich habe an fdopen gedacht, möchte aber wirklich kein anderes Handle “öffnen”, zumal IIRC, das fclose für dieses Handle aufruft, auch den zugrunde liegenden Dateideskriptor schließen wird. Das wäre ein Problem mit dem Code, an dem ich arbeite, da die Routine entweder einen Dateideskriptor oder ein Socket-Handle erhalten kann.

    – Werden

    22. November 2010 um 15:09 Uhr

  • @ Will: Du kannst fdopen eine Datei behandelt bekommen von dupdamit das Schließen Ihre ursprüngliche fd nicht beeinflusst

    – Hasturkun

    22. November 2010 um 15:15 Uhr


  • @Hasturkun: Das stimmt, ich habe dup vergessen. Keine dieser Funktionen, die ich regelmäßig verwende.

    – Werden

    22. November 2010 um 15:23 Uhr

Für das, was es wert ist, da dprintf keine POSIX-Funktion ist, könnte man Folgendes verwenden, wenn die Portabilität ein Problem darstellt:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>

int
fdprintf ( int fd, size_t bufmax, const char * fmt, ... )
{
  char * buffer;
  int n;
  va_list ap;

  buffer = ( char * ) malloc ( bufmax );
  if ( !buffer )
    return 0;

  va_start ( ap, fmt );
  n = vsnprintf ( buffer, bufmax, fmt, ap );
  va_end ( ap );

  write ( fd, buffer, n );
  free ( buffer );
  return n;
}

Höchstwahrscheinlich möchten Sie den Rückgabewert von überprüfen write, aber Sie bekommen die allgemeine Idee. Offensichtlich puffert dies nicht wie die FILE * Routinen tun; Ich suchte mehr nach den Formatbezeichnern und der Möglichkeit, die Zeichendaten zu erstellen, die in den Dateideskriptor geschrieben werden, anstatt mir Gedanken über das Puffern der Daten zu machen, während sie geschrieben werden.

  • dprintf ist POSIX (Stand 2008), und Funktionen, die Daten stillschweigend abschneiden, sind normalerweise eine sehr schlechte Idee. Schleife zumindest mit größeren Puffern, bis es erfolgreich ist oder einen Fehler zurückgibt …

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    22. November 2010 um 15:50 Uhr

  • Das ist cool. Meine gcc-Version hier ist etwas älter und wird immer noch angezeigt dprintf als nur eine GNU-Erweiterung.

    – Werden

    22. November 2010 um 15:55 Uhr

Nein, gibt es standardmäßig nicht, aber die beiden machen unterschiedliche Dinge. fprint, als Teil von stdio, erledigt Dinge wie Buffer Reads und Writes, unterstützt ungetc usw. Die Verwendung eines fd umgeht all das und ruft das Betriebssystem direkt auf.

Sie sind also nicht austauschbar. Ein Flip-Flop zwischen ihnen würde die stdio-Pufferung vermasseln, wenn nichts anderes

Benutzer-Avatar
Kichik

Sie können den Dateideskriptor als normale Datei öffnen, die von verarbeitet werden kann fprintf() mit fdoopen.

  • Gerade entdeckt dprintf up-thread, was interessant aussieht, aber als ich das gelesen habe, kam mir ein Gedanke: wie schlimm wäre es, a zu bestehen fd in eine Funktion und Aufruf fdopen(fd) jeden einzelnen Funktionsaufruf, wenn Leistung kein Problem wäre? Ich stelle mir vor, dass dies wahrscheinlich zumindest wie verrückt Speicher lecken würde. (Und dann gibt es Implementierungsunterschiede zu berücksichtigen, vielleicht würden einige Implementierungen durchsickern und andere nicht.) Oder vielleicht das möchten Arbeit?

    – i336_

    5. November 2021 um 1:45 Uhr

  • Gerade entdeckt dprintf up-thread, was interessant aussieht, aber als ich das gelesen habe, kam mir ein Gedanke: wie schlimm wäre es, a zu bestehen fd in eine Funktion und Aufruf fdopen(fd) jeden einzelnen Funktionsaufruf, wenn Leistung kein Problem wäre? Ich stelle mir vor, dass dies wahrscheinlich zumindest wie verrückt Speicher lecken würde. (Und dann gibt es Implementierungsunterschiede zu berücksichtigen, vielleicht würden einige Implementierungen durchsickern und andere nicht.) Oder vielleicht das möchten Arbeit?

    – i336_

    5. November 2021 um 1:45 Uhr

1217040cookie-check“fprintf”-ähnliche Funktion für Dateideskriptoren (dh int fd statt FILE* fp)

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

Privacy policy