讀書筆記之《Linux C程式設計一站式學習》
筆記放在其他地方想看不方便,就這裡也放一份吧,後面的引用是看書時候的記錄,可能比較沒有邏輯。前面就寫一些感受,備註吧。
首先這本書是培訓機構的教材--!然後感覺果然是一站式,什麼都有,對我來說應該正好,能複習一下,全面的瞭解下。除了演算法和網路程式設計部分略過,其他都看完了。看得有些匆忙,打算接下來重點去研究之前不太知道的地方,羅列如下:
- 訊息機制和訊號
- 程式,執行緒和守護程式
- 網路程式設計--本書最後一個題就是實現一個簡單的web伺服器
接下來是筆記
gcc 相關引數
gcc編譯選項
-o 命名輸出檔名
-Wall 輸出所有的警告資訊
-l 指定連結的庫,如math.h的庫檔名為/usr/lib/libm.so(/lib /usr/local/lib 三個資料夾下都可以)則應該-lm
-std=c99 使用c99標準 如for(int i=1;i<n;i++)此處需加c99標準
-E 可以看到預處理之後、編譯之前的程式
-g 生成執行檔案可進行gdb原始碼除錯
-S 生成彙編程式碼
-O 優化[-O0 -O1 -O2 -O3 -Os]
-c 不連結
-I 指定標頭檔案目錄
-L 指定庫檔案目錄
ar rs 打包.o檔案為靜態庫 ar rs libdemo.a 2.o 3.o
gcc -print-search-dirs 輸出gcc尋找的路徑
-static 只使用靜態庫不用共享庫,優先尋找共享庫(.so);共享庫:執行時連結
-fPIC 生成位置無關碼
書中零碎點
echo $? 輸出最近一次的return
man -k printf
1:使用者命令 /bin /usr/bin
2:系統呼叫 /sbin /usr/sbin
3:庫函式
i++ 和 ++i
兩者都使i+1,但返回值不同,i++返回值為i,++i返回值為i+1
gdb引數
gdb a.out
list(l) 列出程式碼 list 1 從第一行開始列出程式碼 再list 緊接輸出後續程式碼
list + 函式名
回車執行上次命令
退出quit
開始執行 start
下一條語句 next(n)
下一步 step(s) 跟進程式碼
檢視狀態 backtrace(bt)
選擇棧幀 frame(f) + 棧幀號
info(i) locals 檢視楨資訊
除錯時設定變數值 set var sum=0
print(p) 列印表示式值
finish 連續執行到當前函式
display + 變數 每次命令停下來都顯示變數
undisplay + 變數編號 取消顯示
break(b) + 行號 加斷點
continue(c) 連續執行
delete breakpoints + 斷點號
x/7b+變數 列印儲存單元格內容
跟蹤父子程式:
set follow-fork-mode child
set follow-fork-mode parent
makefile
main: main.o stack.o maze.o
gcc main.o stack.o maze.o -o main
main.o: main.c main.h stack.h maze.h
gcc -c main.c
stack.o: stack.c stack.h main.h
gcc -c stack.c
maze.o: maze.c maze.h main.h
gcc -c maze.c
clean:
@echo "cleanning project"
-rm main *.o
@echo "clean completed"
.PHONY: clean
一些函式
1.int open(const char *pathname, nt flags, ...);
開啟檔案
程式啟動時,自動開啟檔案描述符 0,1,2
0:標準輸入O_RDONLY
1 : 標準輸出O_WRONLY
2:標準錯誤
2.umask 預設要去掉的許可權
3.int close(int fd);
關閉檔案
fd檔案描述符
4.ssize_t read(int fd, void *buf, size_t count);
讀取位元組數,讀寫位置記錄在核心中
讀寫常規檔案不會阻塞,從終端或網路不一定;
返回可能小於請求的位元組數
程式呼叫阻塞的系統函式時,該程式被置於睡眠狀態(sleep),此時核心排程其他程式,直到該程式等待的事件發生。
/dev/tty表示當前終端
5.off_t lseek(int fd, off_t offset, int where)
同fseek(第一個引數不同,返回值不同)
裝置不支援設定偏移量,返回-1;
6.fcntl
改變一個已經開啟的檔案的屬性
O_ACCMODE<0003>:讀寫檔案操作時,用於取出flag的低2位
O_RDONLY<00>:只讀開啟
O_WRONLY<01>:只寫開啟
O_RDWR<02>:讀寫開啟
通過fcntl取出的flag與O_ACCMODE &下就是讀寫位
7.linux中的重定向:
command > file 標準輸出重定向到檔案 同 command 1> file
:> file 相當於touch file
command >> file 追加標準輸出重定向到檔案 同 command 1>> file
command 2> file 標準錯誤重定向到檔案
command 2>> file 追加錯誤重定向到檔案
M > file M為檔案描述符 檔案描述符重定向到檔案
M > &N MN都是檔案描述符 檔案描述符重定向到檔案描述符
M <> file 開啟檔案並將檔案描述符分配給檔案
8.ioctl
向裝置傳送命令
9.mmap
把磁碟檔案對映到記憶體
10.ext2 檔案系統
mkfs命令,建立檔案系統
df命令顯示所有檔案系統對i節點和磁碟塊的使用情況(只檢視塊點陣圖)
du命令檢視目錄大小(遍歷檔案)
11.程式
fork--建立新程式
exec--執行新程式,替換當前程式,程式ID不變
只有execve是系統呼叫,其他exec都呼叫此函式
extern char **environ;宣告環境變數
char *getenv(const char *name);查詢環境變數
setenv
unsetenv
getpid獲得程式ID
getppid獲得父程式ID
命令列後加&表示程式在後臺執行
殭屍程式指的是已經終止但未清楚PCB資訊的程式(kill不能清除)
父程式清除子程式殭屍程式資訊:wait/waitpid
程式通訊
管道:int pipe(int filedes[2])
filedes 檔案描述符,0-讀,1-寫
管道:
1.如果所有指向管道寫端的檔案描述符都關閉了(管道寫端的引用計數等於0),而仍然有程式從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會返回0,就像讀到檔案末尾一樣。
2.如果有指向管道寫端的檔案描述符沒關閉(管道寫端的引用計數大於0),而持有管道寫端的程式也沒有向管道中寫資料,這時有程式從管道讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會阻塞,直到管道中有資料可讀了才讀取資料並返回。
3.如果所有指向管道讀端的檔案描述符都關閉了(管道讀端的引用計數等於0),這時有程式向管道的寫端write,那麼該程式會收到訊號SIGPIPE,通常會導致程式異常終止。在第 33 章
訊號會講到怎樣使SIGPIPE訊號不終止程式。
4.如果有指向管道讀端的檔案描述符沒關閉(管道讀端的引用計數大於0),而持有管道讀端的程式也沒有從管道中讀資料,這時有程式向管道寫端寫資料,那麼在管道被寫滿時再次write會阻塞,直到管道中有空位置了才寫入資料並返回。
命令makefifo
shell指令碼
建立以“-”開頭的檔案
touch ./-test
touch -- -test
linux 啟動時執行指令碼:
每個登入使用者都執行 /etc/profile
當前使用者主目錄的 ~/.bash_profile ~/.bash_login ~/.profile
linux 使用者退出時執行 ~/.bash_logout
互動非登入執行shell ~/.bashrc
shell
測試條件是否成立:成立的exit status 為 0 否則為 1
test 或者 []
test $var -gt 3
echo $?
[ $var -gt 3 ]
常見的測試命令:
[ -d DIR ] 測試目錄是否存在
[ -f FILE ] 測試檔案是否存在
[ -z STRING ] 測試字串長度是否為0
[ -n STRING ] 測試字串長度是否為非0
[ STRING1 = STRING2 ] 測試兩個字串是否相同
[ STRING != STRING2 ] 測試兩個字串是否不同
[ ARG1 OP ARF2 ] OP可以是 -eq -ne -gt -ge -lt -le , ARG1和ARG2應該是整數
邏輯
[ ! EXPR ] 非
[ EXPR1 -a EXPR2 ] 且
[ EXPR1 -o EXPR2 ] 或
常用命令
: 冒號是空命令,返回總是真
read 讀入一行命令 read string
&& 相當於 if then
|| 相當於if not then
case
迴圈:
for FRUIT in apple banana pear; do
echo "I like $FRUIT";
done;
for FILENAME in chap? ;do
mv $FILENAME $FILENAME~;
done;
whiel [ $var -gt 3 ];do
var = $(($var - 1));
done;
特殊變數:
$? exit status
$0/1/2 引數
$@引數列表
$# 引數個數
$$ 當前shell程式號
shell函式沒有引數,沒有返回值
shell 除錯
-n 不執行檢查錯誤
-v 標準錯誤輸出
-x 每一行執行結果列印出來
正規表示式
grep -E 使用正則 -F不使用正則
正則用單引號
sed命令(按行處理)awk(可按行,可按列)
sed REG file
其他
訊號:
kill -l 檢視巨集定義訊號
alarm函式:一定時間後向該程式發訊號
守護程式
執行緒
網路程式設計
相關文章
- Objective-C高階程式設計讀書筆記之GCDObject程式設計筆記GC
- Objective-C高階程式設計讀書筆記之blocksObject程式設計筆記BloC
- C#高階程式設計 讀書筆記C#程式設計筆記
- 深度學習讀書筆記之RBM深度學習筆記
- Objective-C高階程式設計讀書筆記之記憶體管理Object程式設計筆記記憶體
- C語言程式設計讀書筆記:結構C語言程式設計筆記
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- 《從陷阱中學習C/C++》讀書筆記C++筆記
- Objective-C高階程式設計讀書筆記(二)Object程式設計筆記
- Objective-C高階程式設計讀書筆記(一)Object程式設計筆記
- 程式設計師生存指南讀書筆記-第三篇(學習)程式設計師筆記
- Linux Shell 程式設計學習筆記Linux程式設計筆記
- 《程式設計匠藝》讀書筆記程式設計筆記
- 《學習之道》讀書筆記筆記
- 《C專家程式設計》讀書筆記(1-3章)程式設計筆記
- 《LINUX與UNIX SHELL程式設計指南》讀書筆記(轉)Linux程式設計筆記
- 《JavaScript程式設計精解》--讀書筆記JavaScript程式設計筆記
- 《Java程式設計思想》讀書筆記一Java程式設計筆記
- 讀書筆記-Java程式設計思想-03筆記Java程式設計
- Java遊戲程式設計讀書筆記(轉)Java遊戲程式設計筆記
- 反應式程式設計讀書筆記程式設計筆記
- 高效程式設計師的45個習慣 讀書筆記程式設計師筆記
- 精通Visual C++圖象程式設計------讀書筆記8C++程式設計筆記
- 精通Visual C++圖象程式設計---讀書筆記6.2C++程式設計筆記
- 精通Visual C++圖象程式設計---讀書筆記6.1C++程式設計筆記
- 精通Visual C++圖象程式設計---讀書筆記5C++程式設計筆記
- 《高質量C++程式設計指南》讀書筆記(一) (轉)C++程式設計筆記
- 《如何高效學習》讀書筆記筆記
- 《高質量C/C++程式設計指南》學習筆記C++程式設計筆記
- 《設計師要懂心理學》讀書筆記筆記
- CSAPP 併發程式設計讀書筆記APP程式設計筆記
- 《程式設計師的吶喊》讀書筆記程式設計師筆記
- 《程式設計師自我修養》讀書筆記程式設計師筆記
- 《程式設計師修煉之道》讀書筆記程式設計師筆記
- 程式設計學習筆記之訊息地圖程式設計筆記地圖
- Node.js 設計模式 學習筆記 之 流程式設計Node.js設計模式筆記程式設計
- Linux程式設計學習筆記 | Linux IO學習[2] – 標準IOLinux程式設計筆記
- [讀書筆記]跟阿銘學Linux筆記Linux