2012-11-11 12 views
6

devo duplicare un FILE* in C su Mac OS X (usando POSIX int descrittori di file tutto il percorso è purtroppo fuori discussione), così mi si avvicinò con la seguente funzione:Posso ottenere la modalità di accesso di un `FILE *`?

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

Funziona molto bene , tranne che ha quella piccola parte brutta in cui chiedo nuovamente la modalità file, perché apparentemente non è possibile determinare lo stesso fdopen.

Questo problema non è critica, dal momento che in fondo, sto solo usando per stdin, stdout e stderr (e, ovviamente, so che le modalità di accesso di questi tre). Tuttavia, lo sarebbe essere più elegante se non dovessi saperlo da solo; e questo è probabilmente possibile poiché la chiamata dup non ne ha bisogno.

Come è possibile determinare la modalità di accesso di un flusso FILE*?

risposta

7

Non è possibile, ma è possibile determinare la modalità per il descrittore di file sottostante:

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

è possibile scegliere la modalità appropriata per passare a fdopen in base al fatto accmode è O_RDONLY, O_WRONLY, o O_RDWR .

Problemi correlati