C read()返回有效文件描述符上的错误文件描述符

C read()返回有效文件描述符上的错误文件描述符,c,fcntl,unistd.h,C,Fcntl,Unistd.h,在下面的节目中, int main() { int fd; char buf[8]={}; remove("file.txt"); fd = creat("file.txt",0666); write(fd,"asdf",5); perror("write"); lseek(fd,0,SEEK_SET); perror("lseek"); read(fd,buf,5); perror("read"); pr

在下面的节目中,

int main()
{
    int fd;
    char buf[8]={};

    remove("file.txt");
    fd = creat("file.txt",0666);
    write(fd,"asdf",5);
    perror("write");
    lseek(fd,0,SEEK_SET);
    perror("lseek");
    read(fd,buf,5);
    perror("read");
    printf("%s\n",buf);
    return 0;
}
我的预期产出是

write : Success
lseek : Success
Read : Success
asdf
但它表明

wriet : Success
lseek : Success
Read : Bad file descriptor
有人能告诉我原因吗?如果从手册页成功写入
文件.txt,我可以看到字符串
“asdf”

create()函数的行为应与它的实现方式相同,如下所示:

int creat(const char *path, mode_t mode)
{
    return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode);
}
因此,该文件以只读模式打开,因此您无法读取

如果需要读写,请直接使用
open(…)
O_-RDWR
而不是
O_-WRONLY

您指定的
0666
仅指示创建文件所使用的文件系统中的权限。 如果您只想执行普通文件I/O,还可以使用高级API,如手册页中的。

create()函数的行为应与它的实现方式相同,如下所示:

int creat(const char *path, mode_t mode)
{
    return open(path, O_WRONLY|O_CREAT|O_TRUNC, mode);
}
因此,该文件以只读模式打开,因此您无法读取

如果需要读写,请直接使用
open(…)
O_-RDWR
而不是
O_-WRONLY

您指定的
0666
仅指示创建文件所使用的文件系统中的权限。
如果您只想执行普通的文件I/O,您也可以使用高级API,例如。

请记住,只有在实际发生故障时才应该调用
peror()
。如果read()没有失败,则可以打印一个与调用read()之前运行的代码相关的错误。请记住,只有在某些操作实际失败时才应调用
peror()
。如果read()没有失败,您可能会打印一个与调用read()之前运行的代码相关的错误。0666表示所有用户都可以读写,但不能执行您将文件系统权限与文件模式混淆
0666
意味着任何用户都可以读/写文件,但这并不意味着代码中的文件句柄可以读/写。0666意味着所有用户都可以读和写,但不能执行您将文件系统权限与文件模式混为一谈
0666
意味着任何用户都可以读/写文件,但这并不意味着代码中的文件句柄可以做到这一点。