读取DRM EDID文件时,大小总是为零

Size is always zero when reading DRM EDID file

本文关键字:DRM EDID 文件 读取      更新时间:2023-10-16

我试图读取连接到LVDS1的监视器的EDID。我使用ArchLinux和c++/clang。我的问题是:文件大小总是返回0。我不知道这是编程问题还是操作系统特有的问题,其他文件返回适当的文件大小。这是一个特殊的文件吗?是符号链接目录/sys/class/drm/card0-DP-1有问题吗?

file: /sys/class/drm/card0-LVDS-1/edid

代码:

#include <fstream>
#include <iostream>
using namespace std;
typedef unsigned char BYTE;
long
get_file_size(FILE *f)
{
    long pos_cursor, pos_end;
    pos_cursor = ftell(f);
    fseek(f, 0, 2);
    pos_end = ftell(f);
    fseek(f, pos_cursor, 0);
    return pos_end;
}
int
main()
{
    const char *filepath = "/sys/class/drm/card0-LVDS-1/edid";
    FILE *file = NULL;
    if((file = fopen(filepath, "rb")) == NULL)
    {
        cout << "file could not be opened" << endl;
        return 1;
    }
    else
        cout << "file opened" << endl;
    long filesize = get_file_size(file);
    cout << "file size: " << filesize << endl;
    fclose(file);
    return 0;
}
输出:

file opened
file size: 0

= = =根据MSalters的建议,我尝试了stat来设置文件大小。也返回0。我假设代码是正确的,所以它是不可能访问文件?

我还尝试了符号链接目标路径(/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/edid),以防万一,但仍然0.

代码:

#include <iostream>
#include <sys/stat.h>
using namespace std;
int
main()
{
    const char *filepath = "/sys/class/drm/card0-LVDS-1/edid";
    struct stat results;
    
    if (stat(filepath, &results) == 0)
        cout << results.st_size << endl;
    else
        cout << "error" << endl;
    return 0;
}

输出
0

= = =

我尝试了同一目录下的其他文件(dpms edid enabled i2c-6 modes power status subsystem uevent)。它们都返回4096的文件大小,除了edid

我怀疑fseek(f, 0, 2);可能意味着fseek(f, 0, SEEK_CUR);,显然没有做任何事情。您可能希望SEEK_END不可移植,但/sys/也不可移植。(当然,做#include <stdio.h>)

但是考虑到它已经是linux特有的,为什么不使用stat呢?