who命令
獲取正在登入系統的使用者
使用linux的who命令
第乙個引數book代表使用者名稱,第二個引數tty7代表終端名,第三個引數代表時間,第四個引數代表使用者的登入位址。
閱讀手冊
使用命令讀手冊
可以知道who這個命令從 /var/run/utmp 和 /var/log/wtmp 兩個檔案中獲取資料,
再通過命令,查詢關於 「utmp」 的資訊
$ man -k utmp
-k的意思是根據關鍵字查詢
我們查詢到一些關於utmp結構體中的元素,比如ut_user使用者名字、ut_line使用者裝置、ut_time登入時間等。
who命令的工作流程
開啟utmp
+----> 讀取記錄 ------ +
+-------顯示記錄 |
關閉utmp
who命令的編寫---版本1
1 #include 2 #include 3 #include 4 #include 5 #include 6輸出結果:7void show_info(struct utmp *utbufp);
8int
main()924
25void 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輸出結果:7void show_info(struct utmp *utbufp);
8void show_time(long
timeval);
9int
main()
1025
26void show_info(struct utmp *utbufp)
2740
41void show_time(long
timeval)
42
這樣乙個簡單的who命令就完成了。
------------------------------於2019/5/5更新---------------------
改良who命令
在linux---cp命令中,介紹了有關緩衝區和系統開銷的知識,因此,我們可以改良自己編寫的who命令。
#include #include編寫乙個增大緩衝區的庫,呼叫的次數減少到原來的1/16。這樣程式能夠在更短的時間內完成。#include
#include
#include
#include
#define nrecs 16
#define nullut ((struct utmp*)null)
#define utsize (sizeof(struct utmp))
static
char utmpbuf[nrecs *utsize];
static
intnum_recs;
static
intcur_rec;
static
int fd_utmp = -1
;struct utmp*utmp_next();
intutmp_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 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8本篇筆記自拜讀《 unix/linux程式設計實踐教程》我也推薦和我一樣的初學者去拜讀這本書,讓你對linux有可下手的地方。9void show_info(struct utmp *utbufp);
10void show_time(long
timeval);
1112
#define showhost
1314
intmain()
15
2223
while( (utbufp = utmp_next()) != ((struct utmp *)null))
24show_info(utbufp);
2526
utmp_close();
27return0;
28}2930
void show_info(struct utmp *utbufp)
3144
45void show_time(long
timeval)
46
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...