实例代码:C/C++循环读取系统寄存器值
说明:在工作学习中偶尔会遇到读取寄存器的值,如果Linux系统驱动工程师没有给应用设计师留出读取寄存器的接口,此时可参考此文。
代码:
void getRegValue(void)
{
FILE *fp = NULL;
char value[10240] = {0};
char buffer[1024] = {0};
char cmd[128] = {0};
while(1)
{
sprintf(cmd,"系统读取寄存器的字符串命令1");
system(cmd);
sprintf(cmd,"系统读取寄存器的字符串命令2");
if(fp = popen(cmd,"r") == NULL)
{
printf("%s##%d:popen cmd fp faid\n",__FUNCTION__,__LINE__);
return;
}
system(cmd);
while(fgets(buffer,sizeof(buffer),fp))
{
strcpy(value,buf);
printf("%s##%d:fgets cmd fp success\n",__FUNCTION__,__LINE__);
}
printf("%s##%d:value:%s\n",__FUNCTION__,__LINE__,value);
char * value_str = value + 2;
printf("%s##%d:value_str:%s\n",__FUNCTION__,__LINE__,value_str);
//此处可增加业务所需的逻辑处理
sleep(1);
pclose(fp);
}
}
备注:此函数是使用while(1)不断去读取指定寄存器的值,无限循环,作循环检测使用,注意要使用sleep或者usleep要释放系统时间片。
所用系统函数说明:
1.fprintf函数是用于格式化输出字符串的函数。
它的语法如下:
int fprintf(FILE *stream, const char *format, ...);
其中,stream表示输出的流,可以是标准输出stdout、标准错误输出stderr,或者是通过fopen打开的文件流。format表示输出的格式,使用类似printf的格式化字符来控制输出的格式。后面的...表示可变参数,用来输出的变量。
下面是一些常用的格式化字符和它们的含义:
- `%d`:十进制整数
- `%f`:浮点数
- `%s`:字符串
- `%c`:字符
- `%x`:十六进制整数
- `%p`:指针
下面是一个例子,输出一个字符串和一个整数:
#include <stdio.h>
int main() {
char *s = "hello world";
int n = 123;
fprintf(stdout, "%s %d\n", s, n);
return 0;
}
输出:
hello world 123
如果想将输出写入到一个文件中,可以使用fopen打开文件,并将其作为stream参数传入fprintf函数中:
#include <stdio.h>
int main() {
FILE *fp = fopen("output.txt", "w");
if (!fp) {
printf("Failed to open file\n");
return 1;
}
char *s = "hello world";
int n = 123;
fprintf(fp, "%s %d\n", s, n);
fclose(fp);
return 0;
}
这样就会将输出写入到output.txt文件中。需要注意的是,在打开文件时要根据需要指定相应的模式,如w表示写入模式,a表示追加模式等等。
2.system函数是一个标准库函数,主要用于在程序中调用外部命令执行指定的操作。
其原型如下:
#include <stdlib.h>
int system(const char *command);
其中,参数command是要执行的命令,它可以是一个简单的命令,也可以是一条复杂的命令行,具体格式与系统有关。返回值表示命令的执行结果,一般情况下,如果命令执行成功,则返回值为0,否则返回值为非0。
以下是几个使用system函数的示例:
/* 在Windows系统中打开记事本 */
system("notepad.exe");
/* 在Linux系统中列出当前目录下的所有文件和目录 */
system("ls -l");
/* 在MacOS系统中打开Safari浏览器 */
system("open -a Safari");
需要注意的是,system函数具有调用权限,也就是说,程序在调用system函数时,具有和当前用户同样的权限,因此,如果没有足够的权限来执行某个命令,system函数可能会失败。另外,由于system函数需要调用操作系统的命令解释程序来执行命令,因此,执行复杂命令可能会消耗大量的系统资源,影响程序的性能。因此,在使用system函数时应谨慎选择命令,并注意命令的安全性。
3.popen函数是一个标准库函数,一个用于创建管道的函数。
它可以用于打开一个进程并返回一个文件指针,可以在文件指针上像读写文件一样进行读写。
popen函数的原型为:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
其中,command参数表示要执行的命令,可以是任何有效的命令,如shell脚本、可执行文件等;type
参数表示打开流的方式,可以是"r"
或"w"
,分别表示读模式和写模式。popen函数会返回一个指向FILE结构体的指针,返回的FILE结构体指针可以用于后续的I/O操作,如读取和写入。如果popen函数执行失败,则返回NULL。当使用完毕后,需要通过pclose函数关闭文件指针。
popen函数的使用方法如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char buffer[1024];
fp = popen("ls -al", "r"); //执行ls -al命令,并以读方式打开输出管道
if (fp == NULL) {
printf("popen failed.\n");
exit(1);
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) { //读取输出管道中的数据
printf("%s", buffer);
}
pclose(fp); //关闭输出管道
return 0;
}
上面的代码执行“ls -al”命令,并将输出结果打印到终端上。
需要注意的是,使用popen函数时需要格外小心,因为该函数会产生新的进程,并且命令行可能会受到攻击,导致系统安全问题。在使用时需要进行完善的错误处理和参数校验。
4.pclose函数是与popen函数相对应的函数。
pclose函数是与popen函数相对应的函数。popen函数用于启动一个子进程来执行命令,并返回一个用于读取该进程输出流的文件指针,而pclose函数则用于关闭该进程并获取其返回值。
pclose函数的原型如下:
#include <stdio.h>
int pclose(FILE *stream);
pclose函数接受一个参数,即popen函数返回的文件指针,用于读取子进程的输出流。在调用pclose函数之前,必须先关闭该指针。
pclose函数执行以下三个操作:
-
等待子进程结束。
-
关闭子进程的输出流,释放相关的系统资源。
-
获取子进程的终止状态,即返回值。
pclose函数的返回值为子进程的终止状态。如果子进程以正常方式结束,则返回该进程的返回值。如果子进程以异常方式结束,则返回一个非零值。
需要注意的是,调用pclose函数后,不能再次使用与该文件指针相关的函数,因为该指针不再与任何有效的文件描述符相关联,且其值为-1。此外,pclose函数还可能设置errno变量,因此需要检查errno变量以了解是否发生了任何错误。
5.fgets函数是C语言中的一个输入函数。
其作用是从文件或标准输入读取一行内容,并将其保存到指定的字符串中。
函数原型如下:
char *fgets(char *s, int size, FILE *stream);
其中,s是要保存读取内容的字符串指针;size是指定读取内容的最大长度,包括空字符;stream是指定从哪个文件流中读取内容,常用的是stdin(标准输入)或文件指针。
fgets函数的返回值是读取到的字符串指针,如果读取失败或文件结束,函数返回NULL。
具体使用演示如下:
#include <stdio.h>
int main() {
char str[100];
printf("请输入一行内容:\n");
fgets(str, 100, stdin);
printf("您输入的内容是:%s\n", str);
return 0;
}
以上代码中,使用fgets函数从标准输入中读取一行内容,并将其保存到指定的字符串中。输出保存的字符串即为读取到的内容。
注意,fgets函数读取的内容中包括换行符,如果不需要,需要手动将其替换为空字符。
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
printf("请输入一行内容:\n");
fgets(str, 100, stdin);
str[strlen(str) - 1] = '\0'; // 将换行符替换为空字符
printf("您输入的内容是:%s\n", str);
return 0;
}
以上代码中,使用strlen函数获取读取到的字符串的长度,将其最后一个字符替换为空字符,去除换行符的影响。