sách gpt4 ai đã đi

调用 read() 返回 0 但缓冲区已更改,调用 fread() 读取相同偏移量时不会发生

In lại 作者:太空宇宙 更新时间:2023-11-04 02:13:04 34 4
mua khóa gpt4 Nike

如果我像这样调用 read() 来读取文件:

unsigned char buf[512];
memset(buf, 0, sizeof(unsigned char) * 512);
int fd;
int readcount;
int offset = 10315001; /* file size is 14315504 */

fd = open("myfile", O_RDONLY);
lseek(fd, offset, SEEK_SET);
readcount = read(fd, (void*)buf, 8);
close(fd);

read() 返回 0,但“buf”的内存已更改(不再是 0)。如果我尝试像这样使用 fread() 读取相同的偏移量和相同的文件:

FILE* file;
file = fopen("myfile", "r");
fseek(file, offset, SEEK_SET);
readcount = fread((void*)buf, 8, 1, file);
fclose(file);

fread() 也返回 0,但 buf 和以前一样。

如果 read() 失败,为什么它会改变“buf”的内存空间?还是我犯了一些错误?

感谢您的帮助:)

编辑:每次我运行上面的代码时,read() 都会以相同的方式更改“buf”-> 从 0 到相同的值。所以改变的“buf”可能不是随机值?

编辑 2:offset 参数有效(感谢 twalberg),如果我读取另一个有效的偏移量,read() 和 fread() 都会成功并且“buf”的结果相同。当 read() 失败时,有什么办法可以找出问题所在吗?当 read() 返回 0 时,errno 为“无错误”。

1 Câu trả lời

read() 调用失败或成功的零字节 read() 调用后缓冲区的内容未定义。

可能发生的事情是它为临时存储分配了一个内部(可能是内核端)缓冲区(其中充满了不同的垃圾)并将该缓冲区复制到您的缓冲区中,但实际上并未写入其缓冲区。

因为您只需要在成功读取后检查缓冲区,所以这无关紧要。如果您在该缓冲区中有重要数据,请将其移出那里,然后再将其传递给可能会删除该数据的函数!

biên tập:代码可能如下所示。想象一下 kernel_read() 是从文件描述符中读取的系统调用,它需要一个在内核地址空间而不是进程地址空间中分配的缓冲区(因为内核会做一些看似奇怪的事情) .)

extern __kernel void *kernel_malloc(size_t size);
extern void kernel_copy_from_kernel_to_userland(void *dest, __kernel void *src, size_t size);
extern void kernel_free(__kernel void *address);

extern int kernel_is_valid_fd(int fd);
extern ssize_t kernel_read(int fd, __kernel void *kbuf, size_t count);

ssize_t read(int fd, void *buf, size_t count) {
ssize_t result = -1;

if (0 == kernel_is_valid_fd(fd)) {
__kernel void *kernelbuf = kernel_malloc(count);
if (kernelbuf) {
result = kernel_read(fd, kernelbuf, count);
kernel_copy_from_kernel_to_userland(buf, kernelbuf, count);
kernel_free(kernelbuf);
} khác {
errno = ENOMEM;
}
} khác {
errno = EINVAL;
}

trả về kết quả;
}

这是一个思想实验,不是任何已发布操作系统的真实实现,但也许它可以帮助您理解为什么您可能会看到您所看到的。

关于调用 read() 返回 0 但缓冲区已更改,调用 fread() 读取相同偏移量时不会发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11261749/

34 4 0
Bài viết được đề xuất: c - 在 Ubuntu 上编译 C 程序的问题
Bài viết được đề xuất: javascript - HTML CSS 幻灯片过渡
Bài viết được đề xuất: css - 让 Bootstrap 使用下载的 Google 字体
Bài viết được đề xuất: c - 使用 gdb 调试多个文件
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com