在 Linux(或 POSIX)中以只读方式重新打开文件

Inn*_*der 5 c linux posix

我以读/写模式打开一个文件并执行一系列读取、写入和搜索(来自用户输入)。

稍后我想将该文件设为只读以防止对其进行任何进一步写入。

是否有 Linux(或 POSIX)功能可以做到这一点?也许有人fcntl打电话?

或者我唯一的选择是保存文件中的当前位置,关闭它并重新打开RD_ONLY

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int fd = open("/path/to/file", O_RDWR);

// mixture of:
write(fd, ...);
lseek(fd, ...);
read (fd, ...);
// etc

...

// make file read-only ???

read (fd, ...); // OK
lseek(fd, ...); // OK
write(fd, ...); // error
Run Code Online (Sandbox Code Playgroud)

Jea*_*nès 6

至少通过调用fcntlPOSIX 文档说这是不可能的(重点是我的):

fcntl()

F_SETFL

fcntl.h从第三个参数 arg 中的相应位为与 fildes 关联的文件描述设置文件状态标志,在 中定义,作为 int 类型。在 arg 中设置的与文件访问模式和文件创建标志相对应的位(如 中定义的)fcntl.h应被忽略。如果应用程序更改了 arg 中除此处提到的位之外的任何位,则结果未指定。

fcntl.h

O_ACCMODE文件访问模式的掩码。

标头应定义以下符号常量,用作 open()、openat() 和 fcntl() 的文件访问模式。除了O_EXECO_SEARCH可以具有相同的值外,这些值应该是唯一的 。这些值应适用于 #if 预处理指令。

O_EXEC只打开执行(非目录文件)。如果将此标志应用于目录,则结果未指定。

O_RDONLY只读方式打开。

O_RDWR打开读写。

O_SEARCH打开目录仅用于搜索。如果将此标志应用于非目录文件,则结果未指定。

O_WRONLY仅用于写入。