首页 > 解决方案 > 当我尝试再次打开文件时,文件描述符(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;
}

标签: clinuxoperating-systemsystem-calls

解决方案


这条线,

    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(仅对所有者用户和组or0600 的访问(仅对所有者用户的访问)。


推荐阅读