2012-11-11 8 views
6

muszę powielić FILE* w C na Mac OS X (przy użyciu POSIX int deskryptorów plików przez całą drogę jest niestety wykluczone), więc wymyśliłem następującą funkcję:Czy mogę uzyskać tryb dostępu do pliku `FILE *`?

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

działa bardzo dobrze , z tą różnicą, że ma tę brzydką część, w której ponownie pytam o tryb plików, ponieważ prawdopodobnie nie można go samemu określić.

Ten problem nie jest krytyczny, ponieważ w zasadzie używam go tylko dla stdin, stdout i stderr (i oczywiście znam tryby dostępu tych trzech). Jednak byłoby to bardziej eleganckie, gdybym nie musiał sam tego wiedzieć; i jest to prawdopodobnie możliwe, ponieważ wywołanie dup nie jest potrzebne.

Jak określić tryb dostępu strumienia FILE*?

Odpowiedz

7

Nie można, ale można określić tryb dla podstawowego deskryptora pliku:

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

Następnie można wybrać odpowiedni tryb, aby przejść do fdopen w oparciu o to, czy accmodeO_RDONLY, O_WRONLY lub O_RDWR .