程序使用C/C++在Linux系统使用系统调用读取寄存器的值举例说明。

实例代码: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函数执行以下三个操作:

  1. 等待子进程结束。

  2. 关闭子进程的输出流,释放相关的系统资源。

  3. 获取子进程的终止状态,即返回值。

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函数获取读取到的字符串的长度,将其最后一个字符替换为空字符,去除换行符的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶包不是trouble

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值