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

时间:2017-03-28 14:37:14

标签: 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 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);
}

经过调试,我发现在第一次迭代后,fd的值变为大数。我不知道这是怎么回事。

1 个答案:

答案 0 :(得分:1)

在您的代码中

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

导致undefined behavior,因为您正在尝试将20字节读入指定为sizeof(long)的内存中,该内存远小于所需内存。

一种正确的写作方式是

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