嵌入式Linux開發(fā)必備:7個超實(shí)用C語言代碼片段
在嵌入式Linux開發(fā)中,快速獲取系統(tǒng)狀態(tài)信息是調(diào)試和監(jiān)控的關(guān)鍵能力。本文整理了7個高頻使用的C語言代碼片段,涵蓋內(nèi)存、CPU溫度、文件操作等核心場景,幫助開發(fā)者高效實(shí)現(xiàn)系統(tǒng)狀態(tài)采集。
1. 內(nèi)存信息采集
通過解析/proc/meminfo文件獲取系統(tǒng)內(nèi)存狀態(tài),這是嵌入式設(shè)備資源監(jiān)控的基礎(chǔ)操作:
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,提取總內(nèi)存和空閑內(nèi)存信息,適用于資源受限的嵌入式環(huán)境。
2. CPU溫度讀取
通過訪問/sys/class/thermal目錄獲取SoC溫度,適用于ARM架構(gòu)設(shè)備:
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; // 轉(zhuǎn)換為攝氏度
}
注意不同廠商的路徑可能不同,需根據(jù)實(shí)際硬件調(diào)整路徑。
3. 文件大小獲取
使用標(biāo)準(zhǔn)C庫函數(shù)獲取文件大小,適用于日志文件監(jiān)控場景:
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;
}
該實(shí)現(xiàn)通過stat()系統(tǒng)調(diào)用獲取文件元數(shù)據(jù),比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環(huán)境下,這是獲取高精度時間的標(biāo)準(zhǔn)方法。
5. MAC地址讀取
通過ioctl獲取網(wǎng)卡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);
}
需確保網(wǎng)絡(luò)接口已啟用,否則可能讀取失敗。
6. IP地址獲取
同樣使用ioctl獲取網(wǎng)卡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. 磁盤空間監(jiān)控
通過statvfs獲取文件系統(tǒng)剩余空間:
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; // 剩余字節(jié)數(shù)
}
return -1;
}
這些代碼片段經(jīng)過實(shí)際項(xiàng)目驗(yàn)證,可直接集成到嵌入式Linux應(yīng)用中。建議根據(jù)具體硬件平臺調(diào)整路徑和錯誤處理邏輯,在資源受限設(shè)備上使用時注意優(yōu)化內(nèi)存和CPU占用。掌握這些基礎(chǔ)操作后,開發(fā)者可以快速構(gòu)建系統(tǒng)監(jiān)控框架,顯著提升調(diào)試效率。





