【C】代码中获取如 /proc
下的值
使用 popen
以获取 /proc/uptime
为例:
在终端中获取:
$ cat /proc/uptime
521373.84 4154516.97
$
在代码中使用 popen
获取1:
不要使用
fscanf()
来读取popen
打开的文件指针1
关于fgets
的基本用法亦可参考我的另一篇 blog > [C] fgets() 用法测试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fp = popen("cat /proc/uptime", "r");
unsigned char buffer[256] = {'\0'};
fgets(buffer, 255, fp);
pclose(fp);
printf("%s", buffer); // 注意,此时 buffer 含有换行符。
/**
* 获取值到变量中
*/
float uptime = 0.00;
sscanf(buffer, "%f", &uptime); // 只获取第一个 uptime 值。
printf("uptime: %f", uptime);
return 0;
}
上面代码中,
- 使用
pclose
来关闭popen
打开的文件指针,而非fclose
。2 - 使用
sscanf
来将 string 类型转化为 float。
同样也是使用 sscanf
将 string 类型转化为 int 值,以获得更好的安全性(避免代码崩溃)。3
一份使用
sscanf
转化 string to integer 的示例代码可以在下文 ? 找到
运行效果:
joseph@LINUX:C$ gcc get_proc_uptime.c
joseph@LINUX:C$ ./a.out
520327.93 1039065.77
uptime: 520327.937500
joseph@LINUX:C$
使用 sscanf
转化 string to integer 示例
int integer_num = 0;
sscanf(var_from_fgets_popen_fp, "%d", &integer_num);
如果是个“长整形”,可以考虑使用 strtol
来转换。
一个完善的彻底解决的方案暂时没有这个需求以及没有看到相关资料,如果有好的建议或意见欢迎在评论区指出。