6

我必须FILE*在 Mac OS X 上用 C 复制 a (int不幸的是,一直使用 POSIX 文件描述符是不可能的),所以我想出了以下函数:

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

它工作得很好,除了它有那个我再次要求文件模式的小丑陋部分,因为fdopen显然无法确定它本身。

这个问题并不重要,因为基本上,我只是将它用于stdin,stdoutstderr(显然我知道这三个的访问模式)。但是,如果我不必自己知道它会更优雅;这可能是可能的,因为dup调用不需要它。

如何确定FILE*流的访问模式?

4

1 回答 1

7

你不能,但你可以确定底层文件描述符的模式:

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

fdopen然后,您可以根据accmodeO_RDONLYO_WRONLY还是来选择要传递到的适当模式O_RDWR

于 2012-11-11T05:39:25.760 回答