Linux程序設計殿堂的善意提醒
Linux操作系統(tǒng)除了安全、穩(wěn)定,深受系統(tǒng)管理員喜愛外,還有一個深受大家歡迎的原因就是其是開源的。只要系統(tǒng)管理員有這個能力,就可以在操作系統(tǒng)原有的功能上開發(fā)所需要的功能。所以說,如果不了解在Linux操作系統(tǒng)下如何編程,那么這個系統(tǒng)管理員只能說是半個系統(tǒng)管理員。剛好前不久有個朋友他想走Linux程序設計這條道路,問我該怎么走?筆者今天就這個機會,對想走這條道路的朋友做一些善意的提醒。
一、要注意與C語言的差異。
在Linux操作系統(tǒng)下實現(xiàn)程序開發(fā),包括嵌入式開發(fā)在內(nèi),基本上采用的都是C語言開發(fā)結(jié)構(gòu)。但是這里需要注意的是,Linux系統(tǒng)下采用的C語言跟其他的C語言有很大的不同。特別是那些在學校里學過C語言,或者以前有C語言開發(fā)經(jīng)歷的,現(xiàn)在要轉(zhuǎn)到Linux系統(tǒng)功能的開發(fā),就需要特別注意這個問題。如下面是一個在Linux系統(tǒng)下開發(fā)的一個簡單的屏幕歡迎界面的源代碼。
int main (int argc,char** argv)
printf(“Welcome!Linux!\n);
return 0;
各位仔細看看這個main函數(shù),跟傳統(tǒng)的C語言中的main函數(shù)有什么區(qū)別嗎?從格式上看其來好像比較類似,但是在Linux操作系統(tǒng)下的C應用程序與其他C語言的應用程序還是有很大區(qū)別的。就拿上面這個main函數(shù)來說,就有不同。大家在仔細看看上面這個main函數(shù),就會發(fā)現(xiàn)在這個函數(shù)中,筆者使用了參數(shù)。這在Linux操作系統(tǒng)下的C應用程序源代碼中是可以的。但是如果在其他的C語言開發(fā)環(huán)境中,這是禁止的。即在main函數(shù)中不可以帶參數(shù)。其實在大部分的Linux操作系統(tǒng)命令中都帶有參數(shù)。如ls、who命令等等,都可以傳遞參數(shù)進去。所以說,雖然他們都是從main函數(shù)開始執(zhí)行。但是統(tǒng)傳統(tǒng)的C語言相比,Linux操作系統(tǒng)下的C語言應用程序在這個函數(shù)中可以帶參數(shù),而且還可以有返回值。
為此筆者給出的***個善意提醒就是,如果各位讀者有C語言的編程或者學習經(jīng)歷的,對于Linux操作系統(tǒng)下的C應用程序開發(fā)或許能夠帶來幫助。畢竟在一些語言結(jié)構(gòu)與命令使用上有很多類似的地方。但是在真正的進行開發(fā)之前,***能夠通讀一下Linux操作系統(tǒng)下C語言的編程規(guī)范。重點需要關(guān)注的是同自己以前學的C語言在語法上與編程習慣上的不同。只有如此,在時候進行Linux系統(tǒng)下功能開發(fā)或者嵌入式開發(fā)的時候,才不會磕磕碰碰,可以達到事半功倍的效果。
二、要想用戶提供詳細的錯誤信息。
即使是有幾十年編程經(jīng)驗的程序員,在編寫應用程序的時候也難免有考慮不周的地方,在程序運行時會出現(xiàn)錯誤。又或者在需要用戶提供參數(shù)的地方,用戶沒有提供恰當?shù)膮?shù),此時也會導致應用程序運行錯誤。也就是說,用戶在使用應用程序的時候,有可能會出現(xiàn)各種各樣的狀況。那么在應用程序開發(fā)的時候,就需要注意收集這些錯誤信息,并將錯誤信息詳細、清楚的反饋給用戶,讓他們一看到錯誤信息,就知道是什么問題所造成的,該如何去調(diào)整。
如現(xiàn)在系統(tǒng)管理員要編寫一個文件的備份程序。在這個備份程序運行的時候,有可能程序備份會失敗。那么可能是什么原因所造成的呢?有可能是執(zhí)行這個備份程序的用戶權(quán)限不夠,無法讀取需要備份的文件或者對于目標文件夾沒有寫的權(quán)限。也有可能是目標文件夾的容量不夠容納需要備份的文件。又或者是在程序運行的過程中被用戶手工強制中斷。如果是異地備份的話,還可能是網(wǎng)絡的原因所造成的??梢妼е逻@個備份程序運行失敗的因素有很多。如果Linux操作系統(tǒng)管理員在開發(fā)這個應用程序的時候,只是簡單的提醒這個文件備份成功或者失敗了。在失敗時,沒有指出具體的原因,那么用戶在排除故障原因的時候,不是要對以上各種原因進行一一確認排除嗎?這顯然會引起用戶的反感。為此在Linux操作系統(tǒng)下進行應用程序的開發(fā),需要注意同用戶的交互性。特別是當應用程序運行出現(xiàn)問題時,要詳細的向用戶說明到底是哪個環(huán)節(jié)出現(xiàn)了問題。其實這只是多了幾條代碼而已,沒有多少難度。就拿這個備份程序來說,在讀取文件、保存文件等等都是相對獨立的工作。在哪個環(huán)節(jié)上出現(xiàn)問題時,就即時的將這個環(huán)節(jié)的名字提示給用戶。如此的話,用戶可以根據(jù)這個錯誤提示迅速定位問題的原因并及時解決掉。但是不少系統(tǒng)程序開發(fā)人員不會如此處理。在程序備份中當某個環(huán)節(jié)出現(xiàn)錯誤時,他們只是簡單的拋出一個錯誤指令。然后錯誤處理函數(shù)接受到這個指令后就會提醒用戶文件備份失敗。但是到底是哪個環(huán)節(jié)出現(xiàn)了問題是只字不提,讓用戶自己去研究吧。
筆者是先做系統(tǒng)管理員,然后再進入Linux系統(tǒng)程序設計這個領域的。為此對于應用程序過程中拋出的一些模棱兩可的錯誤提示或者千遍一律的程序運行失敗之類的錯誤信息是深惡痛絕的。所以筆者要給大家的第二個善意提醒就是,在程序開發(fā)過程中,要多用用系統(tǒng)提供的錯誤函數(shù),盡量向用戶提供詳細的錯誤信息。***是用戶一看到錯誤提示就可以找到問題的原因。
三、提高提示信息的可讀性。
當應用程序在運行時,除了要向用戶提供詳細的錯誤提示信息外,還需要注意這個提示信息的可讀性。特別是有些錯誤信息是操作系統(tǒng)底層拋出的意外,此時Linux操作系統(tǒng)開發(fā)人員***能夠?qū)⑦@些普通用戶難以閱讀的信息進行格式化,將其轉(zhuǎn)換為用戶可以讀的懂的信息。在Linux操作系統(tǒng)中,提供了strerror函數(shù)和sys_errlist消息字符串數(shù)組,專門用來格式化各種形式的錯誤消息,以提高錯誤提示信息的可讀性。如使用這個strerror函數(shù)可以將一些對用戶沒有什么實際含義的錯誤代碼轉(zhuǎn)換成語言相關(guān)的錯誤消息字符串,同時返回指向這個字符串的指針。顯然讀這些語言錯誤信息要比讀哪些錯誤數(shù)字代碼要好的多。
另外,如果一個應用程序要調(diào)用其它應用程序的話,那么在遇到意外情況時,***能夠購將在哪個應用程序上出現(xiàn)問題也告訴給用戶。如perror函數(shù)可以將語言相關(guān)的消息(包括錯誤消息、警告消息等等)寫入到標準輸入輸出,描述調(diào)用系統(tǒng)函數(shù)或者庫函數(shù)期間遇到的錯誤。這個函數(shù)會輸出參數(shù)字符串、錯誤信息、換行符等等。這里主要需要注意的是,在參數(shù)字符串中,***能夠帶出出現(xiàn)問題的那個應用程序的名字。有時候某個應用程序可能會調(diào)用其它的應用程序,或者說某個應用程序運行時***總共可能會調(diào)用數(shù)十個應用程序(包括系統(tǒng)函數(shù)、庫函數(shù)等等)。此時如果系統(tǒng)不向用戶說明到底是哪個程序程序或者系統(tǒng)函數(shù)出現(xiàn)了問題,那么用戶在查找問題的時候會很累,感到無從下手。即使是這個應用程序的開發(fā)者,過了一段時間以后遇到這個問題時也可能無所適從。所以說,無論是為了自己,還是為了用戶,***在perror函數(shù)中包含導致應用程序無法運行的那個程序的名稱或者代碼。這是對用戶進行程序維護與調(diào)試時***的教程。
以上三點是Linux操作系統(tǒng)下進行程序開發(fā)過程中最基本的要求。像需要了解Linux的系統(tǒng)架構(gòu)、系統(tǒng)函數(shù)、系統(tǒng)接口等等的內(nèi)容筆者就不多說了,因為這些知識是前提。
【相關(guān)文章】