提问人:Stefan Rickli 提问时间:11/13/2023 更新时间:11/13/2023 访问量:49
当我们 fseeko() 达到 /dev/zero 上的最大偏移量然后继续阅读时,它是否定义了行为?
Is it defined behavior when we fseeko() to the maximum offset on /dev/zero and then continue reading?
问:
在使用 DD 用零覆盖我的硬盘驱动器时,我想知道在程序中读取的限制。具体来说,如果我们试图“最大化”读取位置会发生什么?/dev/zero
当我们用来将文件指针设置为最大可能的偏移量,然后继续读取字节时,它是否定义了行为?此外,行为是否特定于操作系统和编译器?fseeko()
/dev/zero
我已经在 OnlineGDB 上运行了一个小测试,我发现虽然在使用长 int(64 位)的最大值时不会返回错误,但将返回 4095 作为我可以使用达到的最高文件偏移量。它只是简单地绕到零,没有错误。但是当我们从 start_offset=4095 读取非零数量的字节时,返回更高的数字。这是此类特殊文件的正常行为吗?fseeko()
ftell()
fseeko()
ftell()
这是自己尝试一下的代码(我让 ChatGPT 给我做了一个脚手架,我针对这里的问题进行了调整):
#include <stdio.h>
// Defines the highest number that off_t can be on your platform, usually 9223372036854775807 on 64-bit systems
// Definition taken from https://stackoverflow.com/a/72019392/2721597
#define OFF_MAX ((((off_t)1 << (sizeof(off_t)*8 - 2)) - 1) * 2 + 1)
int main()
{
FILE* fp;
const int num_bytes = 1; // Number of bytes to read, try also 0
char buffer[num_bytes];
fp = fopen("/dev/zero", "rb");
if (fp == NULL) {
perror("Error opening /dev/zero");
return 1;
}
off_t start_offset = OFF_MAX; // Try also 4095, 4096
if (fseeko(fp, start_offset, SEEK_SET) != 0) {
perror("Error on fseeko()");
fclose(fp);
return 1;
}
size_t bytes_read = fread(buffer, 1, num_bytes, fp);
if (bytes_read < num_bytes) {
if (feof(fp)) {
printf("End of file reached.\n");
}
if (ferror(fp)) {
perror("Error reading from /dev/zero");
}
fclose(fp);
return 1;
}
printf("start_offset = %ld\n", start_offset);
printf("num_bytes (bytes_read): %d (%ld)\n", num_bytes, bytes_read);
printf("ftell: %ld\n", ftell(fp));
fclose(fp);
return 0;
}
答: 暂无答案
评论
/dev/zero
open
lseek
read
/dev/zero
/dev/zero
并且无论您指定什么位置,都不会返回错误。对于这两个设备,将始终返回 0。并且,on 将始终返回 0(立即 EOF)。 将填充缓冲区,并始终用字节填充缓冲区。当然,会因错误的缓冲区地址等返回错误。这是因为顶层将在调用 or 设备特定函数之前检查缓冲区地址/大小限制。/dev/null
lseek
lseek
read
/dev/null
/dev/zero
count
read
read
/dev/null
/dev/zero
.read
/dev/zero
/dev/null
lseek
/dev/zero
/dev/zero
/dev/null