Linux 將系統資訊以虛擬檔案系統暴露於 /proc。/proc/uptime 包含兩個數值(秒為單位):
$ cat /proc/uptime 12345.67 89012.34
我們只需讀取第一欄即可獲得系統運行時長。
#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> 支援。