我可以获得`FILE *`的访问模式吗?

时间:2012-11-11 05:35:30

标签: c macos file-io posix

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

您不能,但您可以确定基础文件描述符的模式:

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

然后,您可以根据fdopenaccmodeO_RDONLY还是O_WRONLY来选择合适的模式传递给O_RDWR