Чтение длинных значений из Sysfs Path с Escape-символами
Я использую C
файл IO для чтения значения из sysfs
интерфейс в linux
, Путь и пример значения регистра следующие:
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
, Это из-за того, что я принимаю во внимание escape-последовательность?
Благодарю.
1 ответ
Поскольку файлы sysfs, хотя и "файлы" в некотором смысле, также могут быть узлами и т. Д., А не традиционными текстовыми файлами, часто лучше позволить оболочке взаимодействовать с файлами sysfs и просто считывать необходимые значения из канала после вызов popen
используя команду оболочки, например
#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