gpt4 book ai didi

c - 为什么设备的 stat::st_size 为 0 但同时 lseek 正确定义了设备大小?

转载 作者:IT王子 更新时间:2023-10-29 00:26:23 27 4
gpt4 key购买 nike

我注意到,当我使用open + lseek 查询设备大小时,一切正常,但是当我stat 设备时,我得到零而不是实际设备大小。该设备是干净的,没有任何文件系统,并且设备的第一个字节以一些文本开头,例如“1234567890ABC”。怎么了?

代码:

#include <sys/stat.h>
#include <dirent.h>

bool
GetFileSize(const char* pPath, uint64_t& Size)
{
pPath = "/home/sw/.bashrc";
pPath = "/dev/sda";

struct stat buffer;
if (stat(pPath, &buffer))
{
printf("Failed to stat file. Error: %s. FilePath: %s\n", strerror(errno), pPath);
return false;
}

printf("File size by stat: %" PRIu64 " WTF?\n", buffer.st_size);

//
// Note: It's strange, but stat::st_size from the stat call is zero for devices
//

int File = open(pPath, O_RDONLY);
if (File < 0)
{
printf("Failed to open file. Error: %s. FilePath: %s\n", strerror(errno), pPath);
return false;
}

long off = lseek(File, 0, SEEK_END);
if (off == (off_t)-1)
{
printf("Failed to get file size. Error: %s. FilePath: %s\n", strerror(errno), pPath);
close(File);
return false;
}
close(File);

printf("File size by lseek: %" PRIu64 "\n", off);
fflush(stdout);

Size = off;
return true;
}

输出:

File size by stat: 0 Huh?
File size by lseek: 34359738368

如果我对常规文件使用 stat,则一切正常(注释掉带有“/dev/sda”的行):

File size by stat: 4019 Huh?
File size by lseek: 4019

最佳答案

细节决定成败...对于初学者来说,有一个 Unix 设计的基本原则:一切都是文件,很好 explained here .

第二个是 stat(2) 调用为您提供存储在文件系统上的关于大小为零的设备特殊文件inode统计信息(想想作为 lstat(2))。如果您的 block 设备上有文件系统,您可以使用 statfs(2)getfsstat(2)statvfs(2) 获取有关它的信息 以独立于文件系统/设备的方式。

处理特殊文件(通常驻留在/dev 中)一直是系统特定的,手册页位于第 4 节。因此,如果您想直接操作设备,您应该阅读那里的细节。例如,在 Linux 中,man 4 hd 将向您展示如何以编程方式与 IDE block 设备进行交互。而 man 4 sd 将告诉您如何与 scsi 磁盘等进行交互。

第三点,系统调用不应该在它们的功能它们的限制方面不一致。

希望这对您有所帮助。

关于c - 为什么设备的 stat::st_size 为 0 但同时 lseek 正确定义了设备大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55164462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com