我以读/写模式打开一个文件并执行一系列读取、写入和搜索(来自用户输入)。
稍后我想将该文件设为只读以防止对其进行任何进一步写入。
是否有 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)
至少通过调用fcntlPOSIX 文档说这是不可能的(重点是我的):
fcntl():F_SETFL
fcntl.h从第三个参数 arg 中的相应位为与 fildes 关联的文件描述设置文件状态标志,在 中定义,作为 int 类型。在 arg 中设置的与文件访问模式和文件创建标志相对应的位(如 中定义的)fcntl.h应被忽略。如果应用程序更改了 arg 中除此处提到的位之外的任何位,则结果未指定。
和
fcntl.hO_ACCMODE文件访问模式的掩码。
标头应定义以下符号常量,用作 open()、openat() 和 fcntl() 的文件访问模式。除了O_EXEC和O_SEARCH可以具有相同的值外,这些值应该是唯一的 。这些值应适用于 #if 预处理指令。
O_EXEC只打开执行(非目录文件)。如果将此标志应用于目录,则结果未指定。
O_RDONLY以只读方式打开。
O_RDWR打开读写。
O_SEARCH打开目录仅用于搜索。如果将此标志应用于非目录文件,则结果未指定。
O_WRONLY仅用于写入。