嵌入式Linux开发必备:7个超实用C语言代码片段
扫描二维码
随时随地手机看文章
在嵌入式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占用。掌握这些基础操作后,开发者可以快速构建系统监控框架,显著提升调试效率。





