天天看點

linux C程式設計規範心得

1.變量名、函數名、類型定義、全局變量使用英文單詞簡寫或全稱;

2.局部變量名首字母小寫,其他詞組首字母大寫(如 int rowIndex),全局變量、類型定義和函數名定義所有單詞組首字元大寫;

3.全局變量變量名末尾加"_G"以示區分,為了程式的安全性、可靠性在程式功能子產品設計的時盡量少的使用全局變量;

4.對于函數名盡量使用動賓詞組的單詞組合;

5.設計扇入合理扇出(小于7)的函數,子產品中的功能函數中的變量盡量不要直接使用全局變量,對于傳入參數在函數體内不能修改其值的變量,在修飾符上加上const;

扇入指有多少上級函數調用它,扇出指一個函數直接調用控制其他函數的數量;

6.減少函數本身或函數間的遞歸調用;

7.注重編寫代碼的代碼效率、局部效率、全局效率、時間效率和空間效率;

8.編寫代碼盡量考慮更多更高的代碼移植性,提高代碼的重用性;

9.高并發程式設計時慎用malloc動态配置設定記憶體,使用動态配置設定記憶體會占用過多的系統CPU資源;

10.記住函數所有參數傳遞都是值傳遞,指針類型同樣,隻是指針複制的是指向位址空間的複制;

11.對于傳入參數值不能改變時,函數定義時使用const修飾符;

12.如果在程序中注冊某中或多種信号處理函數,當這些信号在程序阻塞于某種慢系統調用(socket的accept,connect,write,read等sleep定時等 )時發生,這類慢調用将立即傳回錯誤資訊,并設定errno的值為EINTR(4);在信号處理函數中不要使用鎖機制通路臨界資源,當信号發生正好在程序調用鎖機制通路臨界資源是會導緻自鎖;

13.程序ID在整個系統中唯一,對于不同程序的線程ID可能重複,線程ID隻在其所屬的程序有效,對于同一程序中線程ID唯一;

14.在建立子程序之前由父程序打開的檔案描述符,在建立子程序後檔案描述符的引用計數遞增1(對于高并發應用程式在建立子程序後父程序不使用此檔案描述符應該立即close掉,這樣可以防止檔案描述符在子程序中不能這樣真正關閉掉,且回收父程序中檔案描述符的資源,避免由于父程序打開過多的無用檔案描述符使資源耗盡,導緻引用程式崩潰),當在相應程序中close()檔案描述符隻是将檔案描述符的引用計數遞減1;隻有當檔案描述符的引用計數為0時,應用程式才真正将檔案描述符關閉(當程式退出時,不管檔案描述符的引用次數是否為0,系統核心在在程式退出時都會回收檔案描述符資源,并做相應處理,如網絡套接字在正常close時會發送FIN分節進行關閉ACK應答請求);

15,當在程序中close套接字檔案描述符,且該套接字檔案描述符的引用計數為0時,應用程式隻是将該套接字檔案描述符标記為關閉狀态,在該應用程式中所有程序或線程都不能使用該描述符進行讀寫操作,同時由核心将标志位為(FIN=1,ACK=0)的結束封包添加到資料鍊路的發送隊列中,待所有資料都發送完畢後,再将(FIN=1,ACK=0)的封包發送到對端;

16.使用方法接收來自套接字描述符緩沖區中的的資料時,可能的傳回值有-1(代表有異常情況發生),0(代表對端已經發送(FIN=1,ACK=0)的封包主動請求斷開連接配接,接收此封包的接收端将此封包添加到所有接收資料之後,作為接收端套接字讀檔案結束符,當傳回0時表示接收端讀到此檔案結束符,并發送(FIN=1.ACK=1)的封包到對端,對于接收端阻塞套接字此後再從套接字讀緩存區中讀取資料時都将傳回0;此時對端已經在等待接收端發送(FIN=1,ACK=1)的讀關閉封包,當對端接收到(FIN=1,ACK=1)的封包時将關閉對端套接字寫鍊路。當接收端接收到(FIN1,ACK=0)的封包後再向對端寫入資料時,核心将向含有該檔案描述符的程序發送一個SIGPIPE的信号,SIGPIPE的預設處理方式是終止程序運作,為避免接收到此信号後,程式崩潰應捕捉此信号。此信号對于線程則無效),大于0的數(表示從緩存區中接收到資料的長度);

17.signal(SIGCLD,SIG_IGN)中産生SIGCHLD信号的語義為:子程序狀态改變後産生此信号,父程序需要調用一個wait函數以确定子程序的結束狀态,并回收子程序占用的資源,避免子程序成為僵屍程序(如果父程序不調用wait函數或者signal函數捕捉子程序的結束狀态,在父程序結束後将由系統init程序回收父程序和其建立的子程序的所有資源,此時父程序沒有wait的狀态,在高并發中為了避免此種程式中資源浪費,應該在子程序結束後回收其資源),對于SIGCLD的早期處理方式如下:如果程序特地設定該信号的配置為SIG_IGN,可讓核心把僵屍子程序轉交給init程序去處理,則調用程序的子程序将不産生僵死程序;但是當在父程序中同時設定signal(SIGCHLD,SIG_IGN)和wait接收子程序退出的狀态,将導緻wait函數接收不到子程序的退出狀态,此時wait傳回錯誤碼-1設定errno為10(No child process);

18.main(int argc,char **argv)argc表示傳入參數數量,預設值為1,因為執行的檔案的檔案名就是一個參數,argv指向傳入參數的字元串的指針,其中argv[0]表示執行指令的檔案字元串指針,argv[1]開始才是傳入的真正參數;

繼續閱讀