嵌入式 Linux 設備常需監控網路介面(如 eth0、wlan0)是否插網線、是否啟用、是否取得 IP。標準庫無直接 API,常見做法是呼叫 ifconfig 或 ip 指令並解析輸出。本文提供一個輕量、可移植的 C 函式庫實現,僅依賴 popen()、grep、awk(可選)。
| 返回碼 | 狀態常數 | 含義 |
|---|---|---|
| 0 | IF_NOT_FOUND | 介面不存在(ifconfig -a 無此介面) |
| 1 | IF_DOWN | 介面存在但未啟用(ifconfig 無此介面) |
| 2 | IF_UNPLUGGED | 介面 UP 但無載波(網線未插 / WiFi 未連) |
| 3 | IF_LINKED | 介面 UP 且有載波(正常連線) |
| -1 | IF_ERROR | 內部錯誤 |
// netlink.c
#include
#include
#include
#include
int get_if_status(const char *if_name) {
char cmd[128], buf[256];
FILE *fp;
size_t n;
// 1. 介面是否存在
snprintf(cmd, sizeof(cmd), "ifconfig -a | grep -w %s", if_name);
fp = popen(cmd, "r");
if (!fp) return -1;
n = fread(buf, 1, sizeof(buf)-1, fp);
pclose(fp);
if (n == 0) return 0; // NOT FOUND
// 2. 介面是否 UP
snprintf(cmd, sizeof(cmd), "ifconfig | grep -w %s", if_name);
fp = popen(cmd, "r");
if (!fp) return -1;
n = fread(buf, 1, sizeof(buf)-1, fp);
pclose(fp);
if (n == 0) return 1; // DOWN
// 3. 是否有 RUNNING 標誌(載波正常)
snprintf(cmd, sizeof(cmd), "ifconfig %s | grep -w RUNNING", if_name);
fp = popen(cmd, "r");
if (!fp) return -1;
n = fread(buf, 1, sizeof(buf)-1, fp);
pclose(fp);
return (n > 0) ? 3 : 2; // LINKED : UNPLUGGED
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "用法: %s <介面名>\n", argv[0]);
return -1;
}
int st = get_if_status(argv[1]);
printf("if_status = %d\n", st);
return 0;
}
# x86 本地測試
gcc netlink.c -o netlink
# MIPS 32-bit 小端嵌入式板子
mipsel-linux-gnu-gcc -mips32 -EL -mhard-float -Wall -o netlink netlink.c
$ ./netlink eth100
eth100: NOT FOUND
if_status = 0
$ ifconfig eth0 down
$ ./netlink eth0
eth0: DOWN
if_status = 1
$ ifconfig eth0 up
$ ./netlink eth0
eth0: UNPLUGGED
if_status = 2
$ # 插上網線後
$ ./netlink eth0
eth0: LINKED
if_status = 3
/sys/class/net/<iface>/carrier、operstate、flags 系統檔案,純用戶態、零開銷。ip -j addr show JSON 輸出。ip 指令)環境。