標籤:c
1.背景
多次學習C語言一直無法踏入C語言的大門,每次都是在學習C語言中的那些系統調用庫函數等望而卻只,linux下的系統調用需要我們去記憶一些沒有規律的結構體和一些大寫的宏定義並且還有一個函數多種形式的例如print fprintf sprintf等等,看起來就很不爽,寫起東西來真的很無語。什麼都要自己寫,寫什麼都要對返回結果進行出錯處理的判斷。(C語言菜鳥的一些抱怨勿噴),最近又重新拾起C來學習linux下的C編程。目前主要看linux程式設計(早年買的書),unix/linux編程實踐(電子版) unix環境進階編程(電子版),準備入手unix/linux編程實踐主要看這本書其他兩本輔助來看。當我在看unix/linux編程實踐的時候我先翻了一下目錄很讓我感覺耳目一新,不像是那種中規中矩的書,全書輔以實際例子來講解,每一個例子都涉及了很多系統調用。通過例子不緊緊學習到了系統調用的使用還掌握了編程的技巧。最近才剛剛看到第二章,在第二章中該書講解了如何通過linux線上說明來解決編程問題,讓我著實對這本書產生了很高的興趣。不用一開始就去學習大量枯燥的系統調用和庫函數就可以寫出一些小程式。
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語言的一些感悟吧。
本文出自 “專註linux” 部落格,請務必保留此出處http://forlinux.blog.51cto.com/8001278/1435127