2012-11-11 38 views
6

Mac OS X (tüm yol söz konusu maalesef POSIX int dosya tanımlayıcıları kullanarak) üzerinde C bir FILE* çoğaltmak için var, bu yüzden aşağıdaki işlevi ile geldi: Çok iyi çalışıyor`FILE *` erişim kipini alabilir miyim?

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

Ancak, dosya modunu tekrar istediğim küçük çirkin kısım var, çünkü fdopen görünüşe göre kendini belirleyemiyor.

Bu sorun

temelde beri, sadece stdin, stdout ve stderr için kullanıyorum (ve tabii ki ben o üç erişim modlarını biliyorum), kritik değildir. Ancak, 'u kendim bilmem gerekirse daha zarif olur; ve bu muhtemelen dup aramasına ihtiyaç duymadığı için mümkündür.

FILE* akışının erişim modunu nasıl belirleyebilirim?

cevap

7

Yapamazsın, ancak altta yatan dosya tanımlayıcı için modu belirleyebilirsiniz:

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

Ardından accmode olmasına bağlı fdopen geçmek için uygun bir modu seçebilirsiniz O_RDONLY, O_WRONLY veya O_RDWR .

İlgili konular