使用转义字符从 Sysfs 路径读取长值
Reading Long Values From Sysfs Path With Escape Characters
我正在使用 C
文件 IO 从 linux
中的 sysfs
接口读取值。寄存器的路径和样例值如下:
cat /sys/class/powercap/intel-rapl/intel-rapl\:0/energy_uj
56039694184
代码:在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);
代码编译没有任何错误,但在输出文件中我得到的值是 0
。这是因为我如何考虑转义序列吗?
谢谢。
由于 sysfs 文件,虽然 'files' 在某种意义上也可能是节点等,而不是传统的文本文件,通常最好让 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;
}
示例Use/Output
$ ./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;
}
示例Use/Output
$ ./bin/sysfs_energy_uj_file
energy_uj: 33636394660
我正在使用 C
文件 IO 从 linux
中的 sysfs
接口读取值。寄存器的路径和样例值如下:
cat /sys/class/powercap/intel-rapl/intel-rapl\:0/energy_uj
56039694184
代码:在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);
代码编译没有任何错误,但在输出文件中我得到的值是 0
。这是因为我如何考虑转义序列吗?
谢谢。
由于 sysfs 文件,虽然 'files' 在某种意义上也可能是节点等,而不是传统的文本文件,通常最好让 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;
}
示例Use/Output
$ ./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;
}
示例Use/Output
$ ./bin/sysfs_energy_uj_file
energy_uj: 33636394660