首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

Linux 嵌入式開發:C 語言結合 Shell 實現網卡連線狀態偵測

     編輯:關於C

需求背景

嵌入式 Linux 設備常需監控網路介面(如 eth0、wlan0)是否插網線、是否啟用、是否取得 IP。標準庫無直接 API,常見做法是呼叫 ifconfig 或 ip 指令並解析輸出。本文提供一個輕量、可移植的 C 函式庫實現,僅依賴 popen()、grep、awk(可選)。

狀態機定義

返回碼狀態常數含義
0IF_NOT_FOUND介面不存在(ifconfig -a 無此介面)
1IF_DOWN介面存在但未啟用(ifconfig 無此介面)
2IF_UNPLUGGED介面 UP 但無載波(網線未插 / WiFi 未連)
3IF_LINKED介面 UP 且有載波(正常連線)
-1IF_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

進階優化方向

  1. 避免多次 fork/exec:改讀 /sys/class/net/<iface>/carrier、operstate、flags 系統檔案,純用戶態、零開銷。
  2. 支援 IPv6 / 多 IP:解析 ip -j addr show JSON 輸出。
  3. 事件驅動:搭配 Netlink Socket (RTM_NEWLINK) 實現即時通知,輪詢改為事件觸發。

適用場景總結

  • 資源受限嵌入式系統(< 4MB RAM),無法引入重型庫。
  • 快速原型驗證、產測腳本、啟動腳本檢查網路就緒。
  • 需相容舊版 BusyBox(無 ip 指令)環境。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved