从 root 特权进程创建可访问文件

Create accessible file from root privilege process

我有一堆来自不同权限的进程,所有 运行 一个共享代码打开(并在需要时创建)使用 fopen_s 和 "a+" 写入的文件旗帜。

但是,由于没有提供给此命令的权限,并且根进程首先创建文件,因此其他非根进程无法访问此文件。

我可以使用 int open(const char *pathname, int flags, mode_t mode); 从而控制文件权限(由 mode_t 表示)以允许所有人访问,但我需要文件描述符 (FILE *) 而不是文件 ID .所以我可以使用 FILE *fdopen(int fd, const char *mode); 来进行转换。

也许有更直接的方法来做到这一点?

没有。您描述的技术(open 后跟 fdopen)是实现您想要做的事情的正确方法。正如一些程序员指出的那样,您可以在程序创建后调用 chmod 来更改文件权限,但这是一种更迂回的方式。

I could use int open(const char *pathname, int flags, mode_t mode); and thus control the file permissions (represented by mode_t)

不是真的。除非你设置 your process's umask setting。因为传递给 open() 的权限不是创建文件所必需的权限。

Per POSIX open()(加粗我的):

the access permission bits (see <sys/stat.h>) of the file mode shall be set to the value of the argument following the oflag argument taken as type mode_t modified as follows: a bitwise AND is performed on the file-mode bits and the corresponding bits in the complement of the process' file mode creation mask. Thus, all bits in the file mode whose corresponding bit in the file mode creation mask is set are cleared.

所以

int fd = open( someFileName, O_CREAT | O_RDWR, 0644 );

保证将文件权限设置为0644

如果您的文件创建掩码设置为 0077,那么实际上创建文件时权限设置为 0600

请注意,umask() 设置是进程范围的 属性,更改太多并不是一个好主意。如果您正在尝试编写没有副作用的通用代码,那么改变它根本不是一个好主意。例如,更改多线程进程中的 umask() 设置以允许更广泛地访问正在创建的文件可能会导致 如果另一个线程同时创建文件,则存在安全问题。

将文件权限设置为您想要的最好方法是使用 fchmod():

将文件权限设置为您想要的
FILE *f = fopen(...);
fchmod( fileno( f ), 0644 );

事实上,由于 umask() 设置是一个进程范围的 属性,通常它总是有可能随时被另一个线程更改,所以通过 chmod()fchmod() 明确设置权限是在所有情况下准确获得指定权限的唯一保证方式.