c - 关于 creat() 系统调用模式参数的快速问题
问题描述
对于我课堂上的一个项目,我在读取使用 creat() 系统调用创建的文件时遇到了问题。现在据我了解, creat() 仅用于编写。我已经修改了我的代码以使用 open() 创建这个文件,所以我的问题纯粹是出于好奇。那么 mode 参数的意义何在?我最初是按位 ORd 读取和写入权限,文件描述符会显示它具有这些权限,但是当我读取文件时,我得到了 -1 返回值。对我来说很奇怪。我也在手册中找到了这段代码,所以我很困惑。为什么我的程序无法读取文件时,赋予文件读取权限,但同时描述符显示文件有读取权限?
#include <fcntl.h>
int fd;
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
char *filename = "/tmp/file";
fd = creat(filename, mode);
解决方案
从手册:
creat() 等效于 open(),其标志等于 O_CREAT|O_WRONLY|O_TRUNC。
因为O_WRONLY
文件是以只写模式打开的。
使用open
:
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
char *filename = "/tmp/file";
fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, mode);
为什么我的程序无法读取文件时赋予文件读取权限,但同时描述符显示文件具有读取权限?
文件权限与打开文件描述符的模式不同。创建文件时具有读取权限,因此您可以打开它进行读取,但您以只写模式打开文件。O_RDWR
用标志打开它进行读写。
推荐阅读
- python - 渲染灰度图像
- html - 时钟网格布局
- python - Pandas groupby 和 apply with unique 非常慢
- matrix - 如何在处理中的 applyMatrix 后找到新的 x,y,z?
- go - 将频道与 google pubsub poll 订阅者一起使用
- sql - SQL Server 触发器将更新的行复制到另一个历史表中
- r - R 从不允许相邻元素的向量中采样
- firebase - 是否能够将 Firebase 用户存储到我们自己的数据库中?
- wagtail - 在 Wagtail 中实现多级自定义菜单
- android - 如何在做某事之前正确等待 HandlerThread 启动?