讀書筆記之《Linux C程式設計一站式學習》

weixin_34120274發表於2015-04-07

筆記放在其他地方想看不方便,就這裡也放一份吧,後面的引用是看書時候的記錄,可能比較沒有邏輯。前面就寫一些感受,備註吧。
首先這本書是培訓機構的教材--!然後感覺果然是一站式,什麼都有,對我來說應該正好,能複習一下,全面的瞭解下。除了演算法和網路程式設計部分略過,其他都看完了。看得有些匆忙,打算接下來重點去研究之前不太知道的地方,羅列如下:

  1. 訊息機制和訊號
  2. 程式,執行緒和守護程式
  3. 網路程式設計--本書最後一個題就是實現一個簡單的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

69153-c3f427fa783ee6a8.png
Paste_Image.png

迴圈:
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函式沒有引數,沒有返回值

69153-b59fe384775f1ea8.png
2.png

shell 除錯
-n 不執行檢查錯誤
-v 標準錯誤輸出
-x 每一行執行結果列印出來

正規表示式

grep -E 使用正則 -F不使用正則
正則用單引號

69153-1653e004554992c2.png
3.png
69153-b2580a1a8ebe9847.png
4.png
69153-2c24823645a1f0b7.png
5.png
69153-453c4c16c0de4ef3.png
6.png

sed命令(按行處理)awk(可按行,可按列)
sed REG file

69153-5c741b5687fedd0f.png
7.png

其他

訊號:
kill -l 檢視巨集定義訊號
alarm函式:一定時間後向該程式發訊號

守護程式
執行緒
網路程式設計

相關文章