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] = '';
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 accessn");
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 accessn");
read(fd, buffer, sizeof(str));
printf("n %s was written to my filen", buffer);
close(fd);
}
return 0;
}

此行,

fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC);

缺少默认访问模式,即每当使用O_CREAT时都需要的第三个参数。这是一个错误,并导致C库使用一些随机数,通常为0,这意味着"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;每个人都可以读写";。这将由当前的umask进行修改,它允许用户通过清除通常来自其他人的写访问权限(S_IWOTH = 0002(来决定其文件默认获得的权限。

简单地说,这里几乎总是使用0666。例外情况是创建脚本或可执行文件时,使用0777时,以及假定数据为私有数据时,在这种情况下,0660(仅对所有者用户和组or0600进行访问((仅对所有权用户进行访问(。

fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC);

不完整。

open()的完整规格为(注意粗体部分(:

概要

#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int oflag, ...);

描述

open()功能应建立文件之间的连接以及文件描述符。它应创建一个打开的文件描述指的是一个文件和一个文件描述符,该描述符指的是打开的文件描述文件描述符由其他I/O函数用于请参阅该文件。path参数指向路径名命名文件。

O_CREAT如果文件存在,则此标志除注明外无效在下面的CCD_ 14下。否则,如果未设置O_DIRECTORY,则文件应创建为常规文件;文件的用户ID应为设置为进程的有效用户ID;文件的组ID应设置为文件父目录的组ID或进程的有效组ID和访问权限位(参见<sys/stat.h>(应设置为oflag参数后面的参数被视为类型mode_t修改如下。。。

使用open():创建文件时,需要指定文件模式

fd = open("Test01.txt", O_RDWR | O_CREAT | O_TRUNC, 0644 );

最新更新