Linux who命令學習

2021-10-19 07:27:09 字數 3520 閱讀 8134

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...