unix 程式設計隨筆

2021-07-25 12:37:23 字數 2622 閱讀 5346

該篇為本人在工作程式設計中的一些心得體會,願初入此道的小生們少走些彎路,我只願面朝大海,春暖花開。(持續更新)
《c程式設計》譚浩強 編著

《c++物件導向程式設計》譚浩強 編著

《unix環境高階程式設計》等

權威 譚浩強的這兩本教科書,權威中的權威,我每每翻開查詢,都會有新的發現,覺得在某些方面蠻強大的,因為以前覺得它只是為初學者設計的,輕視它。但它的定位是對概念的精準闡述,並沒有深入講解。因此你需要選擇一本專業方向的書籍。

我選的這本《unix環境高階程式設計》就是對各種函式的精準解析,適用範圍,以及c99對c89的改進及原因分析。本人受益良多。

與此類似的標準函式strcpy()、strcat()、vsprintf()、gets()、scanf()等,請用帶顯示引數的改進版的較安全函式。

note:使用這些改進的較安全的函式的條件是用c99標準(或c11)的編譯器。

至於c的新標準為什麼不將該漏洞在底層徹底封死,在下僅作以下推測:

1,c是自由風格的程式語言,在底層封死該漏洞會與之衝突。說人話就是,這樣做會將其它的大量的且重要的與之相關的函式的功能給封掉或者重構。

2,每次檢測邊界太耗時了,該猜測來自c++的容器類vector,他的成員函式at()的實現中就會檢測指標是否越界,但它的過載運算子「」就沒有該檢測機制,依然會溢位。而沒有禁掉「」的原因是at()函式每次檢測太耗時了。

//測試源**test.c

#include

#include

int main()

printf("給buf分配10個位元組緩衝區\n");

int n = 0;

printf("將12個位元組的字串寫入buf指向的緩衝區\n");

n = snprintf(buf, 15, "123456789abc");

printf("n = %d,\nbuf = %s\n", n, buf);

printf("buf[9] = %c\n", buf[9]);

printf("buf[10] = %c\n", buf[10]);

printf("buf[11] = %c\n", buf[11]);

printf("buf[12] = %c\n", buf[12]);

printf("buf[13] = %c\n", buf[13]);

free(buf);

return

0;}

測試結果

xiaobai@xiaobai-kylin:~/documents/test

$ gcc test.c

xiaobai@xiaobai-kylin:~/documents/test

$ ./a.out

給buf分配10個位元組緩衝區

將12個位元組的字串寫入buf指向的緩衝區

n = 12,

buf = 123456789abc

buf[9] = a

buf[10] = b

buf[11] = c

buf[12] =

buf[13] =

xiaobai@xiaobai-kylin:~/documents/test

$

漸漸發現,有時處理乙個bug花數個星期的原因是**中沒有良好的異常處理,從而在日誌中很難發現異常,導致不得不花大量時間模擬並復現問題,費時費力。驗證了一句真理:「好吃不過餃子,好**不如異常處理」。

c++是c的超集。針對c的不足做的改進,所以叫c plus plus。

c面向過程,c++側重於物件導向。

c++對c的「增強」,表現在兩個方面:

(1)在原來面向過程的機制基礎上,對c語言的功能作了不少擴充。

(2)增加了物件導向的機制。

最優先開啟日誌檔案系統

在寫這條的前一分鐘(2016-12-26),我剛將兩個星期前新增新功能的**的錯誤找到。原因是新增的功能**放在了初始化日誌系統的前面,並且該**必須是daemon守護程序模式啟動,在控制台無法看到除錯資訊,而日誌檔案中沒有新增的除錯資訊,使我誤以為daemon後的訊號處理出錯,並往這方向找了好久都沒結果。

注意:若有些系統的daemon()實現會關閉所有開啟的檔案描述符,則初始化日誌系統應放在daemon()後面。

我並非是花了兩個星期找到該bug,而是其它重要任務使我將該bug擱置了這麼久。當我再次處理該bug時,花了不到半個小時。我想說的是,當找bug找了很久都沒找到的時候,你已陷入思(神)維(智)誤(不)區(清),此時需要靜一靜,回頭重新從大局出發,你就會看到廬山真面目。

守護程序沒有控制終端,所以說它們是在後台執行的。

但守護程序不等價與後台程序,比如shell中執行程式時在後面新增「&」會使其變成後台程序,但它依然受控制終端的訊號影響。

linux中使用daemon()函式可使程式變為守護程序,如下:

此時孤兒程序沒有控制終端(tty為?),但pid=pgid=sid,該程序仍有機會被分配到乙個控制終端。若在daemon()後面再fork一次,則能徹底解決該問題。如下:

此時,守護程序在孤兒程序組中,並且不是會話首程序,非常安全。

UNIX程式設計隨筆 三十四 socket位址

unix程式設計隨筆 三十四 socket位址 2010年04月22日 不同的處理器架構對於大於乙個位元組的資料型別的各個位元組如何存放存在差別,分為 b 大端 b 高位位元組到低位位元組存放位址為從低到高,也就是對於乙個4位元組的整數比如0x01020304,在記憶體的起始位址為0x0000000...

UNIX網路程式設計

在unix network programming 的 3.7 inet pton and inet ntop functions 中提到中有如下兩個巨集定義 define inet addrstrlen 16 for ipv4 dotted decimal define inet6 addrstr...

《Unix程式設計藝術》

軟體設計的經典書籍,譯者語言功底也是了得 1 unix作業系統發展的歷史,武俠口吻描述的頗有趣味 2 文字化的協議設計方法,應用協議的三元老,學習協議設計的好出處 3 透明性和可顯性,讓活 還是活 讓死 還是死 4 管道之於unix的意義 將大程式劃分成多個行為簡單的子程式,定義好介面。討論了程序執...