【发布时间】:2020-04-19 07:11:36
【问题描述】:
我有一堆来自不同权限的进程,所有进程都运行一个共享代码,这些代码使用带有“a+”标志的 fopen_s 打开(并在需要时创建)一个用于写入的文件。
但是,由于没有提供给此命令的权限,并且 root 进程首先创建文件,因此其他非 root 进程无法访问此文件。
我可以使用int open(const char *pathname, int flags, mode_t mode); 来控制文件权限(由mode_t 表示)以允许所有人访问,但我需要文件描述符(FILE *)而不是文件ID。所以我可以使用FILE *fdopen(int fd, const char *mode); 进行转换。
也许有更直接的方法可以做到这一点?
【问题讨论】:
-
对术语有点挑剔,
FILE *是一个 C 文件流(不要与 C++ 流对象混淆),而由例如返回的整数open是一个描述符(在open的情况下它是一个文件描述符)。 -
至于你的问题,
open后跟fdopen可能是最简单最直接的方法,除非你想在打开文件后打扰chmod。 -
最后再吹毛求疵:C、C++ 或 POSIX 标准中没有
fopen_s函数,它是 Microsoft Visual C++ CRT 特定的扩展。 -
嗨,我在这里
https://en.cppreference.com/w/c/io/fopen读到了 fopen_s,所以我认为它也支持 posix。 -
@Someprogrammerdude 在 C11 标准的可选附录 K 中有一个
fopen_s()。除了 Microsoft 之外,没有其他重要的实现,而且 Microsoft 也不完全符合 C 标准。