c - 当我尝试再次打开文件时,文件描述符(fd)为-1,并且文件没有以只读模式打开,谁能解释为什么?
问题描述
我首先以读写访问权限打开文件,然后我在其中写了一些东西,但是当我使用只读模式再次打开它时,fd = -1 所以我的 if 语句没有运行,请解释一下为什么它没有打开再次进入只读模式?
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
int main()
{
int fd, i;
char buffer[80];
char str[50], ch;
printf("Enter a string: ");
i = 0;
ch = getchar();
while(ch != '\n')
{
str[i] = ch;
i++;
ch = getchar();
}
str[i] = '\0';
fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC);
printf("fd = %d", fd);
if(fd != -1)
{
printf("\n Test01.txt opened with read write access\n");
write(fd, str, sizeof(str));
lseek(fd, 0, SEEK_SET);
close(fd);
}
fd = open("Test01.txt", O_RDONLY);
printf("fd = %d", fd);
if(fd != -1)
{
printf("\n Test01.txt opened with read only access\n");
read(fd, buffer, sizeof(str));
printf("\n %s was written to my file\n", buffer);
close(fd);
}
return 0;
}
解决方案
这条线,
fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC);
缺少默认访问模式,即使用时需要的第三个参数O_CREAT
。这是一个错误,会导致 C 库使用一些随机数,通常是 0,这意味着“任何人都无法访问”。
这包括创建文件的用户。因此,任何打开文件的尝试都将失败。
如果你解决这个问题,说
fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);
其中0666
等于S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
,或“每个人的读写权限”。这将由 current 修改umask
,它允许用户通过通常清除其他人的写访问权限来决定他们的文件默认获得的权限 ( S_IWOTH = 0002
)。
简单地说,0666
这里几乎总是使用。例外情况是创建脚本或可执行文件、何时0777
使用以及假定数据是私有的,在这种情况下0660
(仅对所有者用户和组or
0600 的访问(仅对所有者用户的访问)。
推荐阅读
- php - 用字符串中的超链接替换花括号包裹的表达式
- hadoop - 运行大型 Hive 查询时的 NiFi 负载平衡
- magento2 - 是否有观察者/插件可以在征税后修改运费?
- jquery - 无法读取 null 的属性“createDocumentFragment”
- redis - Redis 花费了太多时间
- python - 如何在标签中插入“%”符号,python
- unity3d - 统一滑块应该在某个值处停止向右移动
- angular - 如何将项目从 Angular 9 应用程序拖放到 iframe
- python - python中forloop中的名称未定义错误
- sql - EF Core 为每个新迁移创建重复的更改