1.背景
多次學習C語言一直無法踏入C語言的大門,每次都是在學習C語言中的那些系統調用庫函數等望而卻只,linux下的系統調用需要我們去記憶一些沒有規律的結構體和一些大寫的宏定義並且還有一個函數多種形式的例如print fprintf sprintf等等,看起來就很不爽,寫起東西來真的很無語。什麼都要自己寫,寫什麼都要對返回結果進行出錯處理的判斷。(C語言菜鳥的一些抱怨勿噴),最近又重新拾起C來學習linux下的C編程。目前主要看linux程序設計(早年買的書),unix/linux編程實踐(電子版) unix環境高級編程(電子版),准備入手unix/linux編程實踐主要看這本書其他兩本輔助來看。當我在看unix/linux編程實踐的時候我先翻了一下目錄很讓我感覺耳目一新,不像是那種中規中矩的書,全書輔以實際例子來講解,每一個例子都涉及了很多系統調用。通過例子不緊緊學習到了系統調用的使用還掌握了編程的技巧。最近才剛剛看到第二章,在第二章中該書講解了如何通過linux聯機幫助來解決編程問題,讓我著實對這本書產生了很高的興趣。不用一開始就去學習大量枯燥的系統調用和庫函數就可以寫出一些小程序。
UNIX環境高級編程中文第二版PDF高清版 http://www.linuxidc.net/thread-2063-1-1.html
Unix/Linux編程實踐教程【高清PDF中文版+附錄光盤+代碼】 http://www.linuxidc.com/Linux/2011-08/41374.htm
將C語言梳理一下,分布在以下10個章節中:
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
2.怎麼去實現
舉個例子來說如何去實現who命令的編寫的,對於我這樣一個菜鳥實在不知道該如何下手。
1.那麼第一步我該man who看看who命令本身是如何來實現的。
在man who的DESCRIPTION中找到了這樣的一句話。
If FILE is not specified, use /var/run/utmp. /var/log/wtmp as FILE is common
大致意思就是who是通過讀取一個文件來顯示信息的,如果不指定這個文件的話默認就是/var/run/utmp和/var/log/wtmp兩個文件。
2.接著立刻搜索utmp wtmp相關的man信息
man -k utmp
man -k wtmp
搜索的結果均指向了#include<utmp.h>
3.緊接著就看看這個頭文件中包含了啥
struct utmp {
short ut_type; /* Type of record */
pid_t ut_pid; /* PID of login process */
char ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
char ut_id[4]; /* Terminal name suffix,
or inittab(5) ID */
char ut_user[UT_NAMESIZE]; /* Username */
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
kernel version for run-level
messages */
struct exit_status ut_exit; /* Exit status of a process
marked as DEAD_PROCESS; not
used by Linux init(8) */
/* The ut_session and ut_tv fields must be the same size when
compiled 32- and 64-bit. This allows data files and shared
memory to be shared between 32- and 64-bit applications. */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* Session ID (getsid(2)),
used for windowing */
struct {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */
} ut_tv; /* Time entry was made */
#else
long ut_session; /* Session ID */
struct timeval ut_tv; /* Time entry was made */
#endif
int32_t ut_addr_v6[4]; /* Internet address of remote
host; IPv4 address uses
just ut_addr_v6[0] */
char __unused[20]; /* Reserved for future use */
};
一個utmp結構體就出來了,大致猜出來可能是/var/log/utmp或者/var/log/wtmp中存放的數據都是這種結構體的數據。那麼思路就出來了,讀這個文件每次對一個結構體大小的數據。然後輸出結果體中想要的成員變量就OK了。那麼剩下的就是程序編寫的問題了。
3.實踐總結
剛看第二章總算還有點信心繼續學下去了,不至於像兩年前學習C語言那樣的迷茫,知道了如果去解決問題在linux下怎麼去尋求幫助了。希望通過博客的形式記錄自己學習C語言的一些感悟吧。