gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:56 33 4
gpt4 key购买 nike

我正在使用 C 文件 IO 从 linux 中的 sysfs 接口(interface)读取值。寄存器的路径和样例值如下:

cat /sys/class/powercap/intel-rapl/intel-rapl\:0/energy_uj
56039694184

代码:在 intel-rapl\ 之后添加了 \ 以考虑未知的转义序列

#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);

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

谢谢。

最佳答案

由于 sysfs 文件,虽然在某种意义上的"file",也可能是节点等,而不是传统的文本文件,通常最好让 shell 与 sysfs 文件交互,并简单地从中读取所需的值使用 shell 命令调用 popen 后的 pipe,例如

#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;
}

示例使用/输出

$ ./bin/sysfs_energy_uj
energy_uj: 29378726782

这并不是说您不能直接从 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;
}

示例使用/输出

$ ./bin/sysfs_energy_uj_file
energy_uj: 33636394660

关于c - 使用转义字符从 Sysfs 路径读取长值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871446/

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