我遇到以下代码问题。它给了我糟糕的文件描述符错误。
#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
的值变为大数。我不知道这是怎么回事。
答案 0 :(得分:1)
在您的代码中
ret = read(fd, &word, len);
导致undefined behavior,因为您正在尝试将20
字节读入指定为sizeof(long)
的内存中,该内存远小于所需内存。
一种正确的写作方式是
ret = read(fd, &word, sizeof(word));