在Linux定義的信號中,不能被忽略和捕獲的信號是哪兩個?這樣設計的目的是什麼?
SIGKILL和SIGSTOP不能被忽略
原因:因爲它們向超級用戶提供了一種進程終止的可靠方法。
信號的產生的條件信號的產生的條件有哪些?
1.當用戶按某些終端鍵時,將產生信號。
-
ctrl+c組合鍵:產生中斷信號 SIGINT
-
ctrl+\組合鍵:產生中斷信號 SIGQUIT
-
ctrl+z組合鍵:產生中斷信號SIGSTOP
2.硬件異常將產生信號。除數爲0,無效的內存訪問等。這些凊況通常由硬件檢測到,並通知內核,然後內核產生適當的信號發送給相應的進程.
3.軟件異常將產生信號。當檢測到某種軟件條件已發生,並將其通知有關進程時,產生信號。
4.調用kill函數將發送信號。注意:接收信號進程和發送信號進程的所有者必須相同,或發送信號進程的所有者必須是超級用戶。
5.運行kill命令將發送信號。此程序實際上是使用kill函數來發送信號。也常用此命令終止一個失控的後臺進程。
信號的處理方式有哪些?
忽略此信號:
- 大多數信號都可以使用這種方式處理,但 SIGKILL和 SIGSTOP決不能被忽略,原因是它們向超級用戶提供種使進程終止的可靠方法。
執行系統默認動作
- 對大多數信號來說,系統默認動作是用來終止該進程。
自定義信號處理函數
- 用用戶定義的信號處理函數處理該信號。
編寫程序,程序運行時每隔一秒打印一個點號(.),當收到SIGINT信號時,打印"hello world"
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void fun(){
printf("hello world\n");
}
int main(){
signal(SIGINT, fun);
while(1){
printf(".\n");
sleep(1);
}
return 0;
}
運行截圖: