Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用转义字符从Sysfs路径读取长值_C_Linux_File Io_Sysfs - Fatal编程技术网

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

C 使用转义字符从Sysfs路径读取长值,c,linux,file-io,sysfs,C,Linux,File Io,Sysfs,我正在使用C文件IO从linux中的sysfs接口读取值。寄存器的路径和样本值如下所示: cat /sys/class/powercap/intel-rapl/intel-rapl\:0/energy_uj 56039694184 Code:在intel-rapl\之后添加\,以考虑未知转义序列 #define FILE_SIZE 512 static FILE *fp; char filename[FILE_SIZE]; char TEMP[FILE_SIZE]; int FILE, R

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

cat /sys/class/powercap/intel-rapl/intel-rapl\:0/energy_uj
56039694184
Code:在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文件,而“文件”在某种意义上也可能是节点,等等。。与传统的文本文件不同,通常最好让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;
}
这并不是说您不能直接读取sysfs文件,但是如果您有任何问题,那么从管道读取就可以了。对于能量_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;
}

为什么在打开并读取后不检查错误?不要使用大写名称
文件
来表示除
文件*
中的
类型以外的任何内容。它可以工作,但会引起混淆,因此不能推荐使用。当您首先将
文件
用作类型名,然后用作变量名时,情况就更糟了。事实上,通常应为宏和常量(
#define
枚举
常量)保留大写名称。您不知道文件中的
read()
返回的字符串以null结尾-可能不是。你应该考虑<代码> TEMP[Rea]='\' 0的优点;<代码>在
read()
之后和
strtod()
之前@stark-我得到了
错误的文件描述符。这是因为
转义字符
还是我应该更改对
O_RDWR
的访问权限?在我的Ubuntu 16.04 Linux系统上,我认为您引用的文件是“/sys/devices/virtual/powercap/intel rapl/intel rapl:0/energy_uj”。。。注意:没有逃逸…开销是多少?我想知道在某种采样率下,是否有一种方法比
read
更好。当对电源读数执行
读取时,效率是一个问题,读取过多会导致CPU崩溃。。导致系统错误/功率峰值readings@BilalSiddiqui直接从sysfs读取或从管道读取shell查询结果的效率差异几乎看不出来。要点是,如果没有更多的C代码,就无法确定sysfs文件是实际文件还是特殊节点。
#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