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

Linux C 程式讀取 /proc/uptime 取得系統啟動時長

     編輯:關於C語言

核心概念

Linux 將系統資訊以虛擬檔案系統暴露於 /proc。/proc/uptime 包含兩個數值(秒為單位):

$ cat /proc/uptime
12345.67 89012.34
  • 第一欄:系統啟動至今的總秒數(壁鐘時間)
  • 第二欄:所有 CPU 核心在閒置狀態累積的秒數

我們只需讀取第一欄即可獲得系統運行時長。

完整 C 程式範例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>

struct timeval get_uptime(void) {
    struct timeval tv = {0, 0};
    FILE *fp = fopen("/proc/uptime", "r");
    if (!fp) {
        perror("fopen /proc/uptime");
        return tv;
    }

    char buf[64];
    if (fgets(buf, sizeof(buf), fp)) {
        char *space = strchr(buf, ' ');
        if (space) *space = '\0'; // 截取第一欄
        tv.tv_sec = (time_t)strtod(buf, NULL); // 支援小數秒
        // tv.tv_usec = (long)((strtod(buf, NULL) - tv.tv_sec) * 1e6); // 若需微秒
    }
    fclose(fp);
    return tv;
}

int main(void) {
    struct timeval up = get_uptime();
    printf("系統已運行: %ld 秒\n", up.tv_sec);

    // 可選:轉換為 天/時/分/秒
    long days = up.tv_sec / 86400;
    long hours = (up.tv_sec % 86400) / 3600;
    long mins = (up.tv_sec % 3600) / 60;
    long secs = up.tv_sec % 60;
    printf("即 %ld 天 %ld 時 %ld 分 %ld 秒\n", days, hours, mins, secs);
    return 0;
}

關鍵點解析

  • fopen("/proc/uptime", "r"):以文字模式開啟虛擬檔案
  • fgets 讀取整行,避免 fread 需手動處理結尾
  • strchr(buf, ' ') 定位空白,截斷字串只保留第一欄
  • strtod 將字串轉為 double,再取整數秒;若需高精度可保留微秒
  • 錯誤處理:檢查 fopen、fgets 回傳值,失敗時回傳零值

替代方案:sysinfo() 系統呼叫

#include <sys/sysinfo.h>
struct sysinfo info;
sysinfo(&info);
printf("uptime: %ld 秒\n", info.uptime); // 同 /proc/uptime 第一欄

sysinfo() 為標準系統呼叫,可移植性優於讀 /proc,但需 <sys/sysinfo.h> 支援。

應用場景

  • 監控代理定期上報主機啟動時間
  • 計算服務可用性 (Availability) 指標
  • 偵測系統異常重啟(uptime 驟降)
  • 嵌入式裝置無 RTC 時,以 uptime 估算相對時間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved