指針與聲明
-
聲明
1、C語言中變量的聲明
類型(type) 聲明符(declarator)
2、最簡單的聲明是變量
3、指針數組
- 指針數組是一個數組
- 數組里的元素都是指針
- 例:int *daytab[13]
4、數組指針
- 數組指針是一個指針
- 指針指向一個類型和元素個數都固定的數組
- 例:int (*daytab1)[13]
5、指針函數
- 指針函數是函數
- 函數的返回值是指針類型
- 例:int *comp()
6、函數指針
- 函數指針是指針
- 指針指向函數
- 函數名就是函數指針
- 例:int (*comp1)()
7、類型識別法:右左右左法
從變量名開始,先右再左地,交替地一個一個向外看,在紙上寫下:“變量是” 若向右遇到左圓括號,在紙上寫下:“函數,參數是”,并用同樣的方法處理括號中每一個參數——在紙上寫下:“返回” 若向右遇到方括號,在紙上寫下:“數組,長度為{方括號的內容},元素類型為” 若向右遇到右圓括號,什么也不做 若向左遇到*,在紙上寫下:“指針,指向” 若向左遇到任何類型,在紙上寫下對應的類型名
8、自定義類型:typedef
9、char ((x())[])()
分析:x是函數,無參數,返回指針,指向數組,長度不確定,元素類型為指針,指向函數,無參數,返回void
10、char ((x[3])())[5]
分析:x是數組,長度為3,元素類型為指針,指向函數,無參數,返回指針,指向數組,長度為5,元素類型為char
信號處理
-
信號
1、信號是UNIX中使用的進程通信的一種最古老的方法
2、信號是在軟件層次上對中斷機制的一種模擬,它是比較復雜的通信方式,用于通知進程有某事件發生,一個進程收到一個信號與處理器收到一個中斷請求效果上可以說是一樣的
-
查看信號信息
1、命令
kill -l
每個信號都有一個編號和一個宏定義名稱,宏定義可以在signal.h中找到
2、命令
man 7 signal
查看信號的產生條件、默認處理動作
-
信號生命周期:信號產生、信號注冊、信號注銷、信號處理
1、信號產生
- 用戶產生
例:在終端中按下Ctrl+C產生SIGINT信號,可以通過
stty -a
查看可以產生信號的按鍵組合- 硬件產生
硬件異常產生信號,例:當前進程執行了除以0的指令
- 進程產生
例:可在shell進程下,使用命令 kill -信號標號 PID,向指定進程發送信號。
- 內核產生
例:鬧鐘超時產生SIGALRM信號
2、信號處理
- 捕捉信號
命令:man -k signal
可以檢索相關函數,通過man 2 signal
可以查看signal的幫助文檔
signal(SIGINT,f)演示了如何捕捉信號,這個程序捕捉了中斷信號
void f(int signum)演示了如何定義信號處理函數
- 忽略信號
忽略中斷信號:把信號處理函數指針傳為SIG_IGN通過grep命令查看SIG_IGN,表示無返回值的函數指針,指針值為1
- 默認操作
默認信號:SIG_DFL是默認信號的處理程序
通過grep命令查看SIG_DFL,表示無返回值的函數指針,指針值為0
把SIG_IGN改成SIG_DFL
- 多信號處理
-SIGX打斷SIGX的情況處理方法:1、遞歸,調用同一個處理函數2、忽略第二個信號3、阻塞第二個信號知道第一個處理完畢
-
signal與sigaction
1、signal:
不知道信號被發送的原因 信號處理過程中不能安全地阻塞其他信號
2、sigaction:
在信號處理程序被調用時,系統建立的新信號屏蔽字會自動包括正被遞送的信號。因此保證了在處理一個給定的信號時,如果這種信號再次發生,那么它會被阻塞到對前一個信號的處理結束為止
響應函數設置后就一直有效,不會重置