who命令
獲取正在登入系統的使用者
使用linux的who命令
第乙個引數book代表使用者名稱,第二個引數tty7代表終端名,第三個引數代表時間,第四個引數代表使用者的登入位址。
閱讀手冊
使用命令讀手冊
可以知道who這個命令從 /var/run/utmp 和 /var/log/wtmp 兩個檔案中獲取資料,
再通過命令,查詢關於 「utmp」 的資訊
$ man -k utmp
-k的意思是根據關鍵字查詢
$man 5 utmp
我們查詢到一些關於utmp結構體中的元素,比如ut_user使用者名字、ut_line使用者裝置、ut_time登入時間等。
who命令的工作流程
開啟utmp
+----> 讀取記錄 ------ +
+-------顯示記錄 |
關閉utmp
who命令的編寫---版本1
1 #include 2 #include 3 #include 4 #include 5 #include 6
7 void show_info(struct utmp *utbufp);
8 int main()
9 24
25 void show_info(struct utmp *utbufp)
26
輸出結果:
問題:1. 有部分資料不是真實使用者的。
2. 時間顯示不對。
解決方法:
1.第乙個問題
繼續使用命令
看到 ut_type中 user_process表示的是已經登入的使用者 ,那麼第乙個問題就解決了。
2.第二個問題
使用命令
看到ctime,使用命令檢視ctime的使用方法
$ man 3 ctime
使用這個函式將 timeval轉換成乙個字串並返回乙個指標,那麼第二個問題也解決了。
who命令的編寫---版本2
1 #include 2 #include 3 #include 4 #include 5 #include 6
7 void show_info(struct utmp *utbufp);
8 void show_time(long timeval);
9 int main()
10 25
26 void show_info(struct utmp *utbufp)
27 40
41 void show_time(long timeval)
42
輸出結果:
這樣乙個簡單的who命令就完成了。
------------------------------於2019/5/5更新---------------------
改良who命令
在linux---cp命令中,介紹了有關緩衝區和系統開銷的知識,因此,我們可以改良自己編寫的who命令。
#include #include #include #include #include #include #define nrecs 16
#define nullut ((struct utmp*)null)
#define utsize (sizeof(struct utmp))
static char utmpbuf[nrecs * utsize];
static int num_recs;
static int cur_rec;
static int fd_utmp = -1;
struct utmp* utmp_next();
int utmp_reload();
int utmp_open(char *filename);
void utmp_close();
int utmp_open(char *filename)
struct utmp* utmp_next()
if(cur_rec == num_recs && utmp_reload() == 0)
recp = (struct utmp*) &utmpbuf[cur_rec * utsize];
cur_rec++;
return recp;
}int utmp_reload()
void utmp_close()
編寫乙個增大緩衝區的庫,呼叫的次數減少到原來的1/16。這樣程式能夠在更短的時間內完成。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8
9 void show_info(struct utmp *utbufp);
10 void show_time(long timeval);
11 12 #define showhost
13 14 int main()
15
22 23 while( (utbufp = utmp_next()) != ((struct utmp *)null))
24 show_info(utbufp);
25
26 utmp_close();
27 return 0;
28 }
29 30 void show_info(struct utmp *utbufp)
31 44
45 void show_time(long timeval)
46
本篇筆記自拜讀《 unix/linux程式設計實踐教程》我也推薦和我一樣的初學者去拜讀這本書,讓你對linux有可下手的地方。 Linux who命令學習
who命令 獲取正在登入系統的使用者 使用linux的who命令 第乙個引數book代表使用者名稱,第二個引數tty7代表終端名,第三個引數代表時間,第四個引數代表使用者的登入位址。閱讀手冊 使用命令讀手冊 可以知道who這個命令從 var run utmp 和 var log wtmp 兩個檔案中...
linux who 命令 詳解
linux who 命令 詳解 功能說明 顯示目前登入系統的使用者資訊。語 法 who himqsw help version am i 記錄檔案 補充說明 執行這項指令可得知目前有那些使用者登入系統,單獨執行who指令會列出登入帳號,使用的 終端機,登入時間以及從何處登入或正在使用哪個x顯示器。參...
linux命令學習 awk 命令學習
三 awk 指令碼 四 awk 程式設計 五 寫在結尾 awk是linux上一款強大的文字分析工具,它可以將檔案逐行的讀入,然後用分割符分割開來,再對分割的各個部分進行處理。awk分割的各個部分叫做域,預設的分割符是空格和製表符。可以通過 f來指定分割符。awk有3個不同版本 awk nawk和ga...