使用转义字符从 Sysfs 路径读取长值

Che*_*til 1 c linux file-io sysfs

我正在使用C文件 IOsysfslinux. 寄存器的路径和样本值如下:

cat /sys/class/powercap/intel-rapl/intel-rapl\:0/energy_uj
56039694184
Run Code Online (Sandbox Code Playgroud)

代码:添加\intel-rapl\考虑unknown escape sequence

#define FILE_SIZE 512

static FILE *fp;
char filename[FILE_SIZE];

char TEMP[FILE_SIZE];
int FILE, READ;
long int POWER;

FILE = open("/sys/class/powercap/intel-rapl/intel-rapl\\:0/energy_uj", O_RDONLY);
READ = read(FILE, TEMP, sizeof(TEMP));
POWER= strtod(TEMP,NULL);
close(FILE);

sprintf(filename,"test.csv");
fp  = fopen(filename,"a+");
fprintf(fp,"\n");
fprintf(fp, "%ld", POWER);
Run Code Online (Sandbox Code Playgroud)

代码编译时没有任何错误,但在输出文件中我得到的值为0. 这是由于我如何考虑转义序列吗?

谢谢。

Dav*_*ica 5

由于 sysfs 文件虽然是某种意义上的“文件”,但也可能是节点等,而不是传统的文本文件,因此通常最好让 shell 与 sysfs 文件交互,并简单地从以下管道中读取所需的popen使用 shell 命令的调用,例如

#include <stdio.h>

int main (void) {

    long unsigned energy_uj = 0;
    FILE *proc = popen (
        "cat /sys/class/powercap/intel-rapl/intel-rapl\\:0/energy_uj", "r");

    if (!proc) {  /* validate pipe open for reading */
        fprintf (stderr, "error: process open failed.\n");
        return 1;
    }

    if (fscanf (proc, "%lu", &energy_uj) == 1)  /* read/validate value */
        printf ("energy_uj: %lu\n", energy_uj);

    pclose (proc);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用/输出示例

$ ./bin/sysfs_energy_uj
energy_uj: 29378726782
Run Code Online (Sandbox Code Playgroud)

这并不是说您不能直接从 sysfs 文件读取,但如果您遇到任何问题,那么从管道读取就可以了。对于energy_uj值,可以直接读取,没有问题:

#include <stdio.h>

int main (void) {

    long unsigned energy_uj = 0;
    FILE *fp = fopen (
        "/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj", "r");

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed.\n");
        return 1;
    }

    if (fscanf (fp, "%lu", &energy_uj) == 1)  /* read/validate value */
        printf ("energy_uj: %lu\n", energy_uj);

    fclose (fp);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用/输出示例

$ ./bin/sysfs_energy_uj_file
energy_uj: 33636394660
Run Code Online (Sandbox Code Playgroud)