C 为什么这段代码给出了错误的文件描述符

C 为什么这段代码给出了错误的文件描述符,c,linux,file-io,C,Linux,File Io,我对以下代码有问题。这是给我错误的文件描述符错误 #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <limits.h> int main() { int fd = open("/tmp/test", O_RDONLY); long len = 20; long wor

我对以下代码有问题。这是给我错误的文件描述符错误

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <limits.h>
int main()
{
        int fd = open("/tmp/test", O_RDONLY);
        long len = 20;
        long word;
        ssize_t ret;
        if(fd == -1)
        {
                perror("open");
                return 1;
        }
        if(len > SSIZE_MAX)
        {
                len = SSIZE_MAX;
        }
        ret = read(fd, &word, len);
        while(len != 0 && ret != 0)
        {
                if(ret == -1)
                {
                        if(errno == EINTR)
                        {
                                continue;
                        }
                        perror("read");
                        break;
                }
                len -= ret;
                word += ret;
                ret = read(fd, &word, len);
        }
        close(fd);
}
#包括
#包括
#包括
#包括
#包括
int main()
{
int fd=打开(“/tmp/test”,仅限Ordu);
长透镜=20;
长词;
ssize_t ret;
如果(fd==-1)
{
佩罗(“公开”);
返回1;
}
如果(len>SSIZE_MAX)
{
len=SSIZE_MAX;
}
ret=读取(fd和word,len);
while(len!=0&&ret!=0)
{
如果(ret==-1)
{
如果(errno==EINTR)
{
持续
}
佩罗(“阅读”);
打破
}
len-=ret;
word+=ret;
ret=读取(fd和word,len);
}
关闭(fd);
}
调试后,我发现在第一次迭代后,
fd
的值变大了。我不知道这是怎么发生的。

在您的代码中

 ret = read(fd, &word, len);
原因是,当您试图将
20
字节读入指定为
sizeof(long)
的内存时,该内存远远小于所需的容量

写这篇文章的一个正确方法是

ret = read(fd, &word, sizeof(word));

您将
20
字节读入1个
long
,其中有4或8个字节的空间。是的,收到了,谢谢您的时间。欢迎使用堆栈溢出。请注意,在这里说“谢谢”的首选方式是投票选出好的问题和有用的答案(一旦你有足够的声誉这么做),并接受对你提出的任何问题最有用的答案(这也会给你的声誉带来一点提升)。请看网页,也谢谢苏拉夫,你是一个英雄。很抱歉,我没有足够的声誉来投票的答案。我是新手,不客气@如果它有助于解决你的问题,你也可以。不管怎样,不要为投票而烦恼。