Linux who命令學習

2022-06-19 23:48:14 字數 3565 閱讀 4980

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 

#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/16。這樣程式能夠在更短的時間內完成。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8

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

本篇筆記自拜讀《 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...