我正在寻找一种方法来读取内核创建的处于不断变化状态的文件。在小猎犬骨上,获取模拟输入的值是从文件中读取的问题,我们称之为ain_value
。获取此值的建议方法是使用 cat
命令。但是,我希望能够使用 C 从文件中读取。我目前的处理方式似乎有一些缺陷。如果我尝试在不到一秒的循环中读取文件,则会出现一些同步问题。使用"watch --interval=0.5 'cat ain_value"我可以得到一致的值,当使用以下代码时,我得到文件无法打开。有没有办法与操作系统同步并使以下代码更可靠?
int AIN_value(char AIN) {
char line[10] = {0};
char BUFFER[35];
snprintf(BUFFER, sizeof(BUFFER), "%s%c", AIN_FILE, AIN);
FILE *fp;
fp = fopen(BUFFER, "r");
if(fp == NULL) {
printf("ERROR: could not open %sn", BUFFER);
}
printf("n"); // Temporary fix until we know how to sync file reads.
if (fgets(line, sizeof(line), fp) == NULL) {
printf("ERORR: could not read from %sn", BUFFER);
}
line[strlen(line) - 1] = ' ';
fclose(fp);
return(atoi(line));
}
附带说明是,当使用printf("n"); // Temporary fix until we know how to sync file reads.
行时,我可以获得准确的文件读取,但是如果我删除此行,我会得到错误的值。
如果读取/sys/devices/ocp.2/helper.14/AIN
伪文件产生错误的数据,则生成该数据的内核代码有问题。除了更正此代码之外,您还可以查看是否有更好的API来读取模拟输入等。