当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在嵌入式Linux开发中,快速获取系统状态信息是调试和监控的关键能力。本文整理了7个高频使用的C语言代码片段,涵盖内存、CPU温度、文件操作等核心场景,帮助开发者高效实现系统状态采集。


在嵌入式Linux开发中,快速获取系统状态信息是调试和监控的关键能力。本文整理了7个高频使用的C语言代码片段,涵盖内存、CPU温度、文件操作等核心场景,帮助开发者高效实现系统状态采集。


1. 内存信息采集

通过解析/proc/meminfo文件获取系统内存状态,这是嵌入式设备资源监控的基础操作:


c

#include <stdio.h>

#include <string.h>


void get_mem_info() {

   FILE *fp = fopen("/proc/meminfo", "r");

   if (!fp) return;


   char line[256];

   while (fgets(line, sizeof(line), fp)) {

       if (strstr(line, "MemTotal") || strstr(line, "MemFree")) {

           printf("%s", line);

       }

   }

   fclose(fp);

}

该代码通过逐行扫描/proc/meminfo,提取总内存和空闲内存信息,适用于资源受限的嵌入式环境。


2. CPU温度读取

通过访问/sys/class/thermal目录获取SoC温度,适用于ARM架构设备:


c

#include <stdio.h>


float get_cpu_temp() {

   FILE *fp = fopen("/sys/class/thermal/thermal_zone0/temp", "r");

   if (!fp) return -1;


   int temp;

   fscanf(fp, "%d", &temp);

   fclose(fp);

   return temp / 1000.0; // 转换为摄氏度

}

注意不同厂商的路径可能不同,需根据实际硬件调整路径。


3. 文件大小获取

使用标准C库函数获取文件大小,适用于日志文件监控场景:


c

#include <sys/stat.h>


long get_file_size(const char *path) {

   struct stat st;

   if (stat(path, &st) == 0) {

       return st.st_size;

   }

   return -1;

}

该实现通过stat()系统调用获取文件元数据,比fseek+ftell组合更可靠。


4. 高精度时间戳

获取微秒级时间戳,用于性能分析:


c

#include <sys/time.h>


long long get_timestamp() {

   struct timeval tv;

   gettimeofday(&tv, NULL);

   return (long long)tv.tv_sec * 1000000 + tv.tv_usec;

}

在无RT-Linux环境下,这是获取高精度时间的标准方法。


5. MAC地址读取

通过ioctl获取网卡MAC地址:


c

#include <sys/ioctl.h>

#include <net/if.h>

#include <unistd.h>


void get_mac(const char *ifname, unsigned char *mac) {

   int fd = socket(AF_INET, SOCK_DGRAM, 0);

   struct ifreq ifr;

   strncpy(ifr.ifr_name, ifname, IFNAMSIZ);

   ioctl(fd, SIOCGIFHWADDR, &ifr);

   close(fd);

   memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);

}

需确保网络接口已启用,否则可能读取失败。


6. IP地址获取

同样使用ioctl获取网卡IP地址:


c

void get_ip(const char *ifname, char *ip) {

   int fd = socket(AF_INET, SOCK_DGRAM, 0);

   struct ifreq ifr;

   strncpy(ifr.ifr_name, ifname, IFNAMSIZ);

   ioctl(fd, SIOCGIFADDR, &ifr);

   close(fd);

   // 提取IPv4地址

   struct sockaddr_in *addr = (struct sockaddr_in*)&ifr.ifr_addr;

   sprintf(ip, "%s", inet_ntoa(addr->sin_addr));

}

7. 磁盘空间监控

通过statvfs获取文件系统剩余空间:


c

#include <sys/statvfs.h>


long get_disk_free(const char *path) {

   struct statvfs vfs;

   if (statvfs(path, &vfs) == 0) {

       return vfs.f_bavail * vfs.f_frsize; // 剩余字节数

   }

   return -1;

}

这些代码片段经过实际项目验证,可直接集成到嵌入式Linux应用中。建议根据具体硬件平台调整路径和错误处理逻辑,在资源受限设备上使用时注意优化内存和CPU占用。掌握这些基础操作后,开发者可以快速构建系统监控框架,显著提升调试效率。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读
关闭