2012-11-11 3 views
6

Ich habe ein FILE* in C auf Mac OS X kopieren (int Filedeskriptoren POSIX mit dem ganzen Weg ist leider nicht in Frage), so kam ich auf die folgende Funktion auf:Kann ich den Zugriffsmodus einer `FILE *` bekommen?

static FILE* fdup(FILE* fp, const char* mode) 
{ 
    int fd = fileno(fp); 
    int duplicated = dup(fd); 
    return fdopen(duplicated, mode); 
} 

Es funktioniert sehr gut , außer dass es diesen kleinen hässlichen Teil hat, wo ich nochmal nach dem Datei-Modus frage, denn fdopen kann das scheinbar selbst nicht feststellen.

Dieses Problem ist nicht kritisch, im Grunde da, ich verwende es nur für stdin, stdout und stderr (und natürlich kenne ich die Zugriffsarten dieser drei). Allerdings wäre es würde eleganter sein, wenn ich es nicht selbst wissen musste; und das ist wahrscheinlich möglich, da der dup Aufruf es nicht benötigt.

Wie kann ich den Zugriffsmodus eines FILE* Streams ermitteln?

Antwort

7

Sie können nicht, aber Sie können den Modus für den zugrunde liegenden Dateideskriptors bestimmen:

int fd = fileno(f); 
int accmode = fcntl(fd, F_GETFL) & O_ACCMODE; 

Sie können dann einen geeigneten Modus wählen, um fdopen zu passieren basierend darauf, ob accmode ist O_RDONLY, O_WRONLY oder O_RDWR .